来自不同包的GroovyScript引擎和groovy类

来自不同包的GroovyScript引擎和groovy类,groovy,Groovy,我计划在OSGi中使用Groovy,从不同的捆绑包中加载脚本,但我想从一些Groovy文件和一个简单的jUnit测试开始。。原来那是个好主意。我立即在不同的包中遇到了Groovy类的问题 我创建了一个带有自定义ResourceConnector的GroovyScript引擎,它所做的只是打印请求的文件,然后尝试从类路径(resource dir)加载它。删除错误处理后: public URLConnection getResourceConnection(String arg0) throws

我计划在OSGi中使用Groovy,从不同的捆绑包中加载脚本,但我想从一些Groovy文件和一个简单的jUnit测试开始。。原来那是个好主意。我立即在不同的包中遇到了Groovy类的问题

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

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”开头有点混乱。。。愉快地接受替代解决方案:)