从Java运行的Groovy脚本是否具有相同的类路径?

从Java运行的Groovy脚本是否具有相同的类路径?,java,groovy,classpath,classloader,Java,Groovy,Classpath,Classloader,我正在尝试使用GroovyClassLoader从Java运行Groovy脚本。基本上,我所做的是: GroovyClassLoader groovyLoader = new GroovyClassLoader(Thread.currentThread().getContextClassLoader()); clazz = groovyLoader.parseClass(myFile); GroovyObject go = (GroovyObject) go.newInstance(); ret

我正在尝试使用
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类加载器作为GroovyClassloader的构造函数参数传递,因此我认为如果在Groovy类路径上找不到这些类,那么应该在Java中查找它们

我错了吗?有人能解释一下吗


谢谢。

经过大量测试,我发现由Java启动的Groovy确实具有与启动Java相同的类路径。OP上的问题是由我方的配置问题引起的


对于未来的读者,我推荐这个问题,它在调试过程中提供了很多帮助。

经过大量测试,我发现Java启动的Groovy确实具有与启动Java相同的类路径。OP上的问题是由我方的配置问题引起的


对于未来的读者,我推荐这个问题,它在调试过程中提供了很多帮助。

在导入解析中遇到了类似的问题。 在我的情况下,切换到

newgroovyclassloader(this.getClass().getClassLoader())

而不是

新的GroovyClassLoader(Thread.currentThread().getContextClassLoader())

解决了这个问题

注意,根据
GroovyClassLoader()
相当于
GroovyClassLoader(Thread.currentThread().getContextClassLoader())

public GroovyClassLoader()使用 当前线程的上下文类加载器作为父线程

我的实际情况是一个运行webapp的Tomcat实例,它应该从classpath加载一个groovy类并从中运行一个函数,但是groovy类中的导入在运行时无法解析。在调试时,我注意到当前线程和当前类的类加载器是不同的。我还使用了调试器评估功能来确定类加载器是否知道特定的类,如下所示:

this.getClass().getClassLoader().classes.stream().filter(c -> c.getName().contains("YourClassInQuestion")).collect(Collectors.toList())
还解释了类装入器和线程装入器之间的区别

希望这有帮助。
谢谢。

在导入解决方案中遇到类似问题。 在我的情况下,切换到

newgroovyclassloader(this.getClass().getClassLoader())

而不是

新的GroovyClassLoader(Thread.currentThread().getContextClassLoader())

解决了这个问题

注意,根据
GroovyClassLoader()
相当于
GroovyClassLoader(Thread.currentThread().getContextClassLoader())

public GroovyClassLoader()使用 当前线程的上下文类加载器作为父线程

我的实际情况是一个运行webapp的Tomcat实例,它应该从classpath加载一个groovy类并从中运行一个函数,但是groovy类中的导入在运行时无法解析。在调试时,我注意到当前线程和当前类的类加载器是不同的。我还使用了调试器评估功能来确定类加载器是否知道特定的类,如下所示:

this.getClass().getClassLoader().classes.stream().filter(c -> c.getName().contains("YourClassInQuestion")).collect(Collectors.toList())
还解释了类装入器和线程装入器之间的区别

希望这有帮助。
谢谢。

当您不传入自己的类加载器而只使用默认的no-arg GroovyClassLoader构造函数时,有什么变化吗?当您不传入自己的类加载器而只使用默认的no-arg GroovyClassLoader构造函数时,有什么变化吗?看起来是的。我还想指出,即使我在Java中添加了一个类加载器来动态添加一个新的jar文件,这些jar类在Groovy中也可以使用,而且只需要一个常规的导入…*看起来是的。我还想指出,即使我在Java中添加了一个类加载器来动态添加一个新的jar文件,这些jar类在Groovy中也可以使用,只需进行常规导入*