来自不同包的GroovyScript引擎和groovy类
我计划在OSGi中使用Groovy,从不同的捆绑包中加载脚本,但我想从一些Groovy文件和一个简单的jUnit测试开始。。原来那是个好主意。我立即在不同的包中遇到了Groovy类的问题 我创建了一个带有自定义ResourceConnector的GroovyScript引擎,它所做的只是打印请求的文件,然后尝试从类路径(resource dir)加载它。删除错误处理后:来自不同包的GroovyScript引擎和groovy类,groovy,Groovy,我计划在OSGi中使用Groovy,从不同的捆绑包中加载脚本,但我想从一些Groovy文件和一个简单的jUnit测试开始。。原来那是个好主意。我立即在不同的包中遇到了Groovy类的问题 我创建了一个带有自定义ResourceConnector的GroovyScript引擎,它所做的只是打印请求的文件,然后尝试从类路径(resource dir)加载它。删除错误处理后: public URLConnection getResourceConnection(String arg0) throws
public URLConnection getResourceConnection(String arg0) throws ResourceException {
System.err.println("Wanted: " + arg0);
return getClass().getResource("/" + arg0).openConnection();
}
因此,在我的resources(resources,因为我稍后将从OSGi捆绑包或文件系统加载它们)dir中,我有以下目录结构:
com\test\groovy\SubPackageWithNoImport.groovy
com\test\groovy\SubPackageWithImport.groovy
com\test\groovy\SubPackageWithStaticImport.groovy
com\test\groovy\sub\IsolatedSub.groovy
带有*文件的子PackageWith尝试调用“IsolatedSub”类上的方法
IsolatedSub.groovy:
package com.test.groovy.sub;
public class IsolatedSub
{
public int dummy() {
return 1337;
}
public static int dummy2() {
return 1338;
}
}
子包WithNoImport.groovy:
package com.test.groovy;
public class SubPackageNoImport {
public int dummy() {
IsolatedSub s = new IsolatedSub();
return s.dummy();
}
}
package com.test.groovy;
import com.test.groovy.sub.IsolatedSub;
public class SubPackageWithImport {
public int dummy() {
IsolatedSub s = new IsolatedSub();
return s.dummy();
}
}
package com.test.groovy;
import static com.test.groovy.sub.IsolatedSub.dummy2;
public class SubPackageWithImportStatic {
public int dummy() {
return dummy2();
}
}
子包WithImport.groovy:
package com.test.groovy;
public class SubPackageNoImport {
public int dummy() {
IsolatedSub s = new IsolatedSub();
return s.dummy();
}
}
package com.test.groovy;
import com.test.groovy.sub.IsolatedSub;
public class SubPackageWithImport {
public int dummy() {
IsolatedSub s = new IsolatedSub();
return s.dummy();
}
}
package com.test.groovy;
import static com.test.groovy.sub.IsolatedSub.dummy2;
public class SubPackageWithImportStatic {
public int dummy() {
return dummy2();
}
}
SubPackageWithStaticImport.groovy:
package com.test.groovy;
public class SubPackageNoImport {
public int dummy() {
IsolatedSub s = new IsolatedSub();
return s.dummy();
}
}
package com.test.groovy;
import com.test.groovy.sub.IsolatedSub;
public class SubPackageWithImport {
public int dummy() {
IsolatedSub s = new IsolatedSub();
return s.dummy();
}
}
package com.test.groovy;
import static com.test.groovy.sub.IsolatedSub.dummy2;
public class SubPackageWithImportStatic {
public int dummy() {
return dummy2();
}
}
我用来执行的代码如下(在jUnit测试中):
是的,有道理。。。我没有指定包,所以它应该是相同的
现在它开始变得奇怪,导入子包:
Wanted: com/test/groovy/SubPackageWithImport.groovy
Wanted: java/lang/com$test$groovy$sub$IsolatedSub.groovy
这看起来。。对我来说,java.lang中“com”的内部类是什么
对于带有StaticImport的子包:
Wanted: com/test/groovy/SubPackageWithImportStatic.groovy
Wanted: com/test/groovy/com/test/groovy/sub/IsolatedSub.groovy
更接近,但仍然是错误的
所以,这就是背景。。。我的问题是:
我做错了什么?
GroovyScriptEngine应该如何处理具有不同包名的groovy类
额外问题:我尝试添加自定义协议,即,“test://filegoeshere,它会被发送到第一个类的资源连接器,但不会发送到它的依赖项-这是应该的吗?哼哼。。。修改资源连接器并使其在要加载的类不是“我的代码”的一部分时引发异常后,它请求的文件如下:
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”开头有点混乱。。。愉快地接受替代解决方案:)