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

By simon at 2018-02-07 • 0人收藏 • 98人看过

我有几个[常规](/问题/标签/ groovy“显示问题标记 'groovy'“)在同一个包(com.company.config)中的类一个多模块化的 [java-8](/ questions / tagged / java-8“显示标签为'java-8'”)项目的问题。 全部用于继承

public Object getInstance(File sourceFile) {
    try {
      GroovyClassLoader gcl = new GroovyClassLoader();
      Class clazz = gcl.parseClass(sourceFile); // << Here
      Object inst = clazz.newInstance();
      // ....
    }
    // ...
}
0接口(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
我添加了(尽管课程在同一个包里)ST 同样的错误被抛出后,我读了 [本](https://stackoverflow.com/questions/20888049/groovy-why-is-import- REQuired换类 - 内式相同包)。 在java的以下行中触发Exception 码:
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类不能在同一个包中找到它的父类, 甚至无线进口声明?


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

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)
_其余堆栈跟踪是相对的o应用程序调用,所以它是无益的。


编辑我 我注意到GroovyClassLoader确实不知道任何事情其他 groovy课程,他们在哪里,所以我刚刚添加 "./modules/module-setup/src/com/company/config/"

GroovyClassLoader::addClassPath(String)
但我得到了sa我的结果像以前一样。 在创建File实例时,路径肯定是正确的 并可以由班级打开装载机。

1 个回复 | 最后更新于 2018-02-07
2018-02-07   #1

我通过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);
这绝对是一个不好的答案,因为如果我有更多的GroovyClassLoader::parseClass4班 我依靠,我将不得不手动解析它们逐个。但它工作... 希望有人能给出更好的答案。

登录后方可回帖

Loading...