【问题标题】:Loading co-dependent groovy classes in Java在 Java 中加载相互依赖的 groovy 类
【发布时间】:2014-08-01 04:46:15
【问题描述】:

我试图弄清楚如何在运行时在 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

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

【问题讨论】:

    标签: java groovy


    【解决方案1】:

    必须启用 GroovyClassLoader 才能在类路径中找到 B.groovy。通常这意味着您更改应用程序的类路径以包含脚本的根目录。由于这里没有脚本包,并且由于您使用 new File("A.groovy"),所以我假设它是当前目录。

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

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

    【讨论】:

    • 酷,成功了,谢谢。我将文件夹添加到类路径中,然后调用 loadClass("A")。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-18
    • 2013-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-03
    相关资源
    最近更新 更多