我在多模块groovy项目中的同一个包(com.company.config
)中有几个java-8个类。
所有用于继承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
实例是用它创建的,并且可以由类加载器打开。
答案 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
个类,我将不得不逐个手动解析它们。但它有效......
希望有人能给出更好的答案。