2

计划在 OSGi 中使用 Groovy,从不同的包中加载脚本,但我认为我会从一些 Groovy 文件和一个简单的 jUnit 测试开始。事实证明这是一个好主意。我立即遇到了不同包中的 Groovy 类的问题。

我创建了一个带有自定义 ResourceConnector 的 GroovyScriptEngine,它所做的只是打印请求的文件,然后尝试从类路径(资源目录)加载它。删除错误处理后:

public URLConnection getResourceConnection(String arg0) throws ResourceException {
    System.err.println("Wanted: " + arg0);
    return getClass().getResource("/" + arg0).openConnection();
}

因此,在我的资源(资源,因为稍后我将从 OSGi 包或文件系统中加载它们)目录中,我具有以下目录结构:

com\test\groovy\SubPackageWithNoImport.groovy
com\test\groovy\SubPackageWithImport.groovy
com\test\groovy\SubPackageWithStaticImport.groovy
com\test\groovy\sub\IsolatedSub.groovy

SubPackageWith* 文件尝试调用“IsolatedSub”类的方法。

隔离子.groovy:

package com.test.groovy.sub;

public class IsolatedSub
{
    public int dummy() {
        return 1337;
    }
    public static int dummy2() {
        return 1338;
    }
}

SubPackageWithNoImport.groovy:

package com.test.groovy;

public class SubPackageNoImport {
    public int dummy() {
        IsolatedSub s = new IsolatedSub();
        return s.dummy();
    }
}

SubPackageWithImport.groovy:

package com.test.groovy;

import com.test.groovy.sub.IsolatedSub;
public class SubPackageWithImport {
    public int dummy() {
        IsolatedSub s = new IsolatedSub();
        return s.dummy();
    }
}

SubPackageWithStaticImport.groovy:

package com.test.groovy;

import static com.test.groovy.sub.IsolatedSub.dummy2;
public class SubPackageWithImportStatic {
    public int dummy() {
        return dummy2();
    }
}

我用来执行的代码是这样的(在 jUnit 测试中):

// "this" implements ResourceConnector as shown above
GroovyScriptEngine engine = new GroovyScriptEngine(this, getClass().getClassLoader());

Class<?> cl = engine.loadScriptByName("com/test/groovy/SubPackageNoImport.groovy");
GroovyObject o = (GroovyObject)cl.newInstance();
Object rv = o.invokeMethod("dummy", null);

我可以很好地加载没有依赖关系的单个类,也可以在同一目录中具有依赖关系,但是一旦我转到子包或超级包,事情就会中断。

对于 SubPackageWithNoImport(尝试使用 IsolatedSub 而不导入它),它会尝试从 ResourceConnector 加载以下内容:

Wanted: com/test/groovy/SubPackageNoImport.groovy
Wanted: com/test/groovy/IsolatedSub.groovy

是的,有道理......我没有指定一个包,所以它应该是一样的

现在它开始变得奇怪了,SubPackageWithImport:

Wanted: com/test/groovy/SubPackageWithImport.groovy
Wanted: java/lang/com$test$groovy$sub$IsolatedSub.groovy

这看起来..对我来说,java.lang中“com”的内部类???

对于 SubPackageWithStaticImport:

Wanted: com/test/groovy/SubPackageWithImportStatic.groovy
Wanted: com/test/groovy/com/test/groovy/sub/IsolatedSub.groovy

更接近,但仍然是错误的。

所以,这就是背景......我的问题是:我做错了什么?GroovyScriptEngine 应该如何处理具有不同包名的 groovy 类?

额外的问题:我尝试添加一个自定义协议,即“test://filegoeshere”,它被发送到第一类的资源连接器,但不是它的依赖项——这是应该的吗?

4

1 回答 1

0

嗯......在修改资源连接器并让它抛出异常后,如果要加载的类不是“我的代码”的一部分,这些是它要求的文件:

Wanted: com/test/groovy/SubPackageWithImport.groovy
Wanted: java/lang/com$test$groovy$sub$IsolatedSub.groovy
Wanted: java/io/com$test$groovy$sub$IsolatedSub.groovy
Wanted: java/net/com$test$groovy$sub$IsolatedSub.groovy
Wanted: java/util/com$test$groovy$sub$IsolatedSub.groovy
Wanted: groovy/lang/com$test$groovy$sub$IsolatedSub.groovy
Wanted: groovy/util/com$test$groovy$sub$IsolatedSub.groovy
Wanted: com/test$groovy$sub$IsolatedSub.groovy
Wanted: com/test/groovy$sub$IsolatedSub.groovy
Wanted: com/test/groovy/sub$IsolatedSub.groovy
Wanted: com/test/groovy/sub/IsolatedSub.groovy
Wanted: com\test\groovy\SubPackageWithImportBeanInfo.groovy
Wanted: com\test\groovy\SubPackageWithImportCustomizer.groovy
Wanted: com\test\groovy\sub\IsolatedSubBeanInfo.groovy
Wanted: com\test\groovy\sub\IsolatedSubCustomizer.groovy

代码现在可以正常工作,但我不确定这是正确的方法。检查“想要的文件”是否以某些版本的“com.test.groovy”开头有点混乱......很高兴接受替代解决方案:)

于 2013-11-05T22:20:42.423 回答