Groovy类无法在同一个包中找到超类

时间:2018-02-06 12:25:14

标签: java groovy groovyclassloader

我在多模块项目中的同一个包(com.company.config)中有几个个类。

所有用于继承java接口(MyInterface),但需要进行一些重构,因此我创建了一个groovy抽象类,它与其他脚本位于同一个包中;它实现MyInterface并由其他脚本继承。

自从此更改后,我似乎无法再从java代码执行脚本。

特别是GroovyClassLoader::parseClass(File)抛出:

org.codehaus.groovy.control.MultipleCompilationErrorsException: 
startup failed:<|C:\my_workspace\a_project_name\modules\module-setup\src\com\company\config\MyScript1Impl.groovy: 
7: unable to resolve class com.company.config.AbstractGroovyClass
@ line 7, column 1.
import com.company.config.AbstractGroovyClass
^

在第7行,您确实可以找到导入声明

import com.company.config.AbstractGroovyClass

我在第一次抛出同样的错误之后添加了(尽管类在同一个包中),在我阅读this之后。

Exception代码中的以下行触发了java

public Object getInstance(File sourceFile) {
    try {
      GroovyClassLoader gcl = new GroovyClassLoader();
      Class clazz = gcl.parseClass(sourceFile); // << Here
      Object inst = clazz.newInstance();
      // ....
    }
    // ...
}

而我用以下参数调用此函数

getInstance(
    new File("./modules/module-setup/src/com/company/config/"
         className + ".groovy" // className = "MyScript1Impl" in this case
    )
);

如前所述,在引入抽象类之前,一切都运行良好。

为什么groovy类不能在同一个包中找到它的超类,即使使用import声明?

这是内部调用的堆栈跟踪:

org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed ...
at org.codehaus.groovy.control.ErrorCollector.failIfErrors(ErrorCollector.java:310)
at org.codehaus.groovy.control.CompilationUnit.applyToSourceUnits(CompilationUnit.java:946)
at org.codehaus.groovy.control.CompilationUnit.doPhaseOperation(CompilationUnit.java:593)
at org.codehaus.groovy.control.CompilationUnit.compile(CompilationUnit.java:542)
at groovy.lang.GroovyClassLoader.doParseClass(GroovyClassLoader.java:298
at groovy.lang.GroovyClassLoader.parseClass(GroovyClassLoader.java:268)
at groovy.lang.GroovyClassLoader.parseClass(GroovyClassLoader.java:254)
at groovy.lang.GroovyClassLoader.parseClass(GroovyClassLoader.java:195)

其余的堆栈跟踪是相对于应用程序调用的,所以它没有用。

编辑我

我确实注意到GroovyClassLoader对其他groovy类及其所在位置一无所知所以我只是在

中添加了"./modules/module-setup/src/com/company/config/"
GroovyClassLoader::addClassPath(String)

但是我得到了和以前一样的结果。

路径肯定是正确的,因为File实例是用它创建的,并且可以由类加载器打开。

1 个答案:

答案 0 :(得分:0)

我在加载实际的继承类之前,通过GroovyClassLoader::parseClass加载超类来暂时解决它。

final GroovyClassLoader gcl = new GroovyClassLoader();
// ...
// load superclass first
Class<?> abstractClass = gcl.parseClass(new File(classPath, "AbstractGroovyClass.groovy"));
// load the actual script
Class<?> clazz = gcl.parseClass(sourceFile);

这绝对是一个糟糕的答案,因为如果我依赖更多groovy个类,我将不得不逐个手动解析它们。但它有效......

希望有人能给出更好的答案。