计划在OSGi中使用Groovy,从不同的bundle中加载脚本,但是我认为我可以通过一些Groovy文件和一个简单的jUnit测试来轻松实现..结果证明这是一个好主意。我立即遇到了不同包中Groovy类的问题。
我创建了一个带有自定义ResourceConnector的GroovyScriptEngine,它所做的就是打印所请求的文件,然后尝试从类路径(资源目录)加载它。删除了错误处理:
public URLConnection getResourceConnection(String arg0) throws ResourceException {
System.err.println("Wanted: " + arg0);
return getClass().getResource("/" + arg0).openConnection();
}
所以,在我的资源(资源,因为我将在以后从OSGi包或文件系统加载它们)dir我有以下目录结构:
com\test\groovy\SubPackageWithNoImport.groovy
com\test\groovy\SubPackageWithImport.groovy
com\test\groovy\SubPackageWithStaticImport.groovy
com\test\groovy\sub\IsolatedSub.groovy
SubPackageWith *文件尝试在“IsolatedSub”类上调用方法。
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”,它被发送到第一个类的资源连接器,但不是它的依赖项 - 这是它应该是?
答案 0 :(得分:0)
Humm ...修改资源连接器后如果要加载的类不是“我的代码”的一部分,它会抛出异常,这些是它要求的文件:
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”开头有点混乱......很高兴接受替代解决方案:)