来自 Java 的 Groovy 脚本 运行 是否具有相同的类路径?
Does a Groovy script run from Java have the same classpath?
我正在尝试使用 GroovyClassLoader
运行 来自 Java 的 Groovy 脚本。基本上,我所做的是:
GroovyClassLoader groovyLoader = new GroovyClassLoader(Thread.currentThread().getContextClassLoader());
clazz = groovyLoader.parseClass(myFile);
GroovyObject go = (GroovyObject) go.newInstance();
return go.invokeMethod("MyMethod", myObject);
问题是当我解析 groovy 文件时,即使 类 在 Java 类路径。如果我添加一行:
groovyLoader.addClasspath("MyclassPath");
然后一切正常(如果我们无法解决这个问题,这是我们最后的手段)。这让我认为有两种不同的类路径,一种用于 Java,一种用于 Groovy。但是,由于我将 Java 类加载器作为 Groovy 类加载器的构造函数参数传递,我认为如果在 Groovy 上找不到 类类路径,它们应该在 Java 中查找。
我错了吗?有人可以阐明这一点吗?
谢谢。
经过大量测试,我发现 Java 启动的 Groovy 确实与启动 Java 具有相同的类路径。 OP上的问题是我们这边的配置问题导致的。
为了以后的读者,我推荐这个问题How to get classpath in Groovy?,在调试过程中给了很多帮助。
导入解析遇到了类似的问题。
在我的情况下切换到
new GroovyClassLoader(this.getClass().getClassLoader())
而不是
new GroovyClassLoader(Thread.currentThread().getContextClassLoader())
已解决问题。
注意根据docs GroovyClassLoader()
等同于GroovyClassLoader(Thread.currentThread().getContextClassLoader())
:
public GroovyClassLoader() creates a GroovyClassLoader using the
current Thread's context Class loader as parent.
我的实际情况是一个 Tomcat 实例 运行ning 一个 web 应用程序,它应该从 class 路径和 运行 中的一个函数,但是 groovy class 中的导入未能在 运行 时解析。在调试时我注意到当前线程的 classloader 和当前的 class 是不同的。我还使用调试器评估功能来确定 classloader 是否知道特定的 class ,如下所示:
this.getClass().getClassLoader().classes.stream().filter(c -> c.getName().contains("YourClassInQuestion")).collect(Collectors.toList())
还有here是对class和thread classloaders的区别的解释。
希望这对您有所帮助。
谢谢。
我正在尝试使用 GroovyClassLoader
运行 来自 Java 的 Groovy 脚本。基本上,我所做的是:
GroovyClassLoader groovyLoader = new GroovyClassLoader(Thread.currentThread().getContextClassLoader());
clazz = groovyLoader.parseClass(myFile);
GroovyObject go = (GroovyObject) go.newInstance();
return go.invokeMethod("MyMethod", myObject);
问题是当我解析 groovy 文件时,即使 类 在 Java 类路径。如果我添加一行:
groovyLoader.addClasspath("MyclassPath");
然后一切正常(如果我们无法解决这个问题,这是我们最后的手段)。这让我认为有两种不同的类路径,一种用于 Java,一种用于 Groovy。但是,由于我将 Java 类加载器作为 Groovy 类加载器的构造函数参数传递,我认为如果在 Groovy 上找不到 类类路径,它们应该在 Java 中查找。
我错了吗?有人可以阐明这一点吗?
谢谢。
经过大量测试,我发现 Java 启动的 Groovy 确实与启动 Java 具有相同的类路径。 OP上的问题是我们这边的配置问题导致的。
为了以后的读者,我推荐这个问题How to get classpath in Groovy?,在调试过程中给了很多帮助。
导入解析遇到了类似的问题。 在我的情况下切换到
new GroovyClassLoader(this.getClass().getClassLoader())
而不是
new GroovyClassLoader(Thread.currentThread().getContextClassLoader())
已解决问题。
注意根据docs GroovyClassLoader()
等同于GroovyClassLoader(Thread.currentThread().getContextClassLoader())
:
public GroovyClassLoader() creates a GroovyClassLoader using the current Thread's context Class loader as parent.
我的实际情况是一个 Tomcat 实例 运行ning 一个 web 应用程序,它应该从 class 路径和 运行 中的一个函数,但是 groovy class 中的导入未能在 运行 时解析。在调试时我注意到当前线程的 classloader 和当前的 class 是不同的。我还使用调试器评估功能来确定 classloader 是否知道特定的 class ,如下所示:
this.getClass().getClassLoader().classes.stream().filter(c -> c.getName().contains("YourClassInQuestion")).collect(Collectors.toList())
还有here是对class和thread classloaders的区别的解释。
希望这对您有所帮助。 谢谢。