我正在试图弄清楚如何在运行时在java中加载两个共同依赖的Groovy脚本。如果我有两个groovy脚本,如:
import B
class A {
A() {
B b = new B()
}
}
import A
class B {
B() {
A a = new A()
}
}
我想将它们作为java类加载,但是当我运行时:
ClassLoader parent = getClass().getClassLoader();
GroovyClassLoader loader = new GroovyClassLoader(parent);
loader.parseClass(new File("A.groovy"));
我收到错误:
org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed:
A.groovy: 1: unable to resolve class B
@ line 1, column 1.
import B
我当然理解错误的原因,但是有没有办法在运行时加载这些类,尽管它们有共同依赖性?谢谢!
答案 0 :(得分:1)
必须启用GroovyClassLoader才能在类路径中找到B.groovy。通常,这意味着您更改应用程序的类路径以包含脚本的根。由于这里没有脚本包,因为你使用新文件(“A.groovy”),我认为它在这里是当前目录。
如果您不想更改应用程序的类路径,还可以调用addURL来添加包含脚本的路径。
还有一件事要提到.... parseClass将始终创建一个新解析的类。您可能希望尝试标准的loadClass调用,以避免多次编译该文件。但是当然只有在修复了GroovyClassLoader的查找后才有效,因为使用loadClass,GroovyClassLoader也必须以与查找B.groovy相同的方式查找A.groovy