从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中也可以使用,只需进行常规导入*