在Java中加载共同依赖的groovy类

时间:2014-08-01 04:46:16

标签: java groovy

我正在试图弄清楚如何在运行时在java中加载两个共同依赖的Groovy脚本。如果我有两个groovy脚本,如:

A.groovy

import B

class A {
  A() {
    B b = new B()
  }
}

B.groovy

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

我当然理解错误的原因,但是有没有办法在运行时加载这些类,尽管它们有共同依赖性?谢谢!

1 个答案:

答案 0 :(得分:1)

必须启用GroovyClassLoader才能在类路径中找到B.groovy。通常,这意味着您更改应用程序的类路径以包含脚本的根。由于这里没有脚本包,因为你使用新文件(“A.groovy”),我认为它在这里是当前目录。

如果您不想更改应用程序的类路径,还可以调用addURL来添加包含脚本的路径。

还有一件事要提到.... parseClass将始终创建一个新解析的类。您可能希望尝试标准的loadClass调用,以避免多次编译该文件。但是当然只有在修复了GroovyClassLoader的查找后才有效,因为使用loadClass,GroovyClassLoader也必须以与查找B.groovy相同的方式查找A.groovy