解决从Groovy 2.4升级到2.5时的OSGi测试,原因是;无法启动碎片束";?

解决从Groovy 2.4升级到2.5时的OSGi测试,原因是;无法启动碎片束";?,groovy,osgi,pax-exam,osgi-fragment,Groovy,Osgi,Pax Exam,Osgi Fragment,这是我们的后续问题。groovy中的groovy-all工件在groovy的2.5版中不再作为jar文件提供,因此上面答案中的建议是使用单独的jar文件。我有一个使用的测试用例,看起来像: @RunWith(PaxExam.class) 公共类XmlPathSGIITest{ @配置 公共静态选项[]配置(){ 返回新选项[] { mavenBundle(“org.apache.servicemix.bundles”、“org.apache.servicemix.bundles.hamcrest

这是我们的后续问题。groovy中的
groovy-all
工件在groovy的2.5版中不再作为jar文件提供,因此上面答案中的建议是使用单独的jar文件。我有一个使用的测试用例,看起来像:

@RunWith(PaxExam.class)
公共类XmlPathSGIITest{
@配置
公共静态选项[]配置(){
返回新选项[]
{
mavenBundle(“org.apache.servicemix.bundles”、“org.apache.servicemix.bundles.hamcrest”、“1.3_1”),
junitBundles(),
systemProperty(“pax.exam.osgi.unresolved.fail”).value(“true”),
systemProperty(“org.ops4j.pax.logging.DefaultServiceLog.level”).value(“INFO”),
/*Pax考试容器中需要可传递的依赖项。
其中一些需要包装,因为它们不能作为OSGi捆绑包使用*/
mavenBundle(“org.apache.commons”,“commons-lang3”).versionAsInProject(),
wrappedBundle(mavenBundle().groupId(“org.ccil.cowan.tagsoup”).artifactId(“tagsoup”).versionAsInProject()),
wrappedBundle(mavenBundle(“javax.xml.bind”,“jaxb-api”).versionAsInProject()),
wrappedBundle(mavenBundle(“javax.activation”,“activation”).version(“1.1.1”),
wrappedBundle(mavenBundle().groupId(“org.codehaus.groovy”).artifactId(“groovy all”).version(“2.4.12”),
wrappedBundle(mavenBundle(“org.apache.httpcomponents”,“httpclient”).versionAsInProject(),
wrappedBundle(mavenBundle(“org.apache.httpcomponents”,“httpmime”).versionAsInProject(),
wrappedBundle(mavenBundle(“org.apache.httpcomponents”,“httpcore”).versionAsInProject()),
/*Pax考试容器中需要的放心依赖项才能执行以下测试*/
mavenBundle(“io.rest assured”,“json路径”).versionAsInProject(),
mavenBundle(“io.rest assured”,“xml路径”).versionAsInProject(),
mavenBundle(“io.rest-assured”,“rest-assured”).versionAsInProject(),
mavenBundle(“io.rest-assured”,“rest-assured-common”).versionAsInProject()
};
}
@试验
public void getUUIdParseAstringResultUUID(){
最后一个字符串UUID_XML=“\n”+
“db24eeeb-7fe5-41d3-8f06-986b793ecc91\n”+
“d69ded28-d75c-460f-9cbe-1412c60ed4cc\n”+
"";
最终UUID UUID=from(UUID_XML).getUUID(“some.thing[0]”);
资产(uuid,Matchers.equalTo(uuid.fromString(“db24eeb-7fe5-41d3-8f06-986b793ecc91”));
}
}
如果关注点是:

wrappedBundle(mavenBundle().groupId(“org.codehaus.groovy”).artifactId(“groovy all”).version(“2.4.12”),
现在我想升级到Groovy 2.5.6,因此我将上面的行替换为:

wrappedBundle(mavenBundle().groupId(“org.codehaus.groovy”).artifactId(“groovy”).version(“2.5.6”),
wrappedBundle(mavenBundle().groupId(“org.codehaus.groovy”).artifactId(“groovy json”).version(“2.5.6”),
wrappedBundle(mavenBundle().groupId(“org.codehaus.groovy”).artifactId(“groovy xml”).version(“2.5.6”),
但是现在,当我重新运行测试时,我得到以下错误:

org.osgi.framework.BundleException:无法启动片段捆绑包。
位于org.apache.felix.framework.felix.startBundle(felix.java:2144)
位于org.apache.felix.framework.BundleImpl.start(BundleImpl.java:998)
位于org.apache.felix.framework.BundleImpl.start(BundleImpl.java:984)
位于org.ops4j.pax.swissbox.framework.RemoteFrameworkImpl.startBundle(RemoteFrameworkImpl.java:178)

如何解决此问题?

重新运行捆绑包后,您需要检查其是否存在碎片:

private static boolean isBundleFragment(final Bundle bundle) {
    boolean frament = false;
    final Dictionary<String, String> dictionary = bundle.getHeaders();

    if (dictionary.get("Fragment-Host") != null) {
        frament = true;
    }
    return frament;
}

然后启动包或更新包。希望有帮助

重新运行捆绑包后,您需要检查其是否存在碎片:

private static boolean isBundleFragment(final Bundle bundle) {
    boolean frament = false;
    final Dictionary<String, String> dictionary = bundle.getHeaders();

    if (dictionary.get("Fragment-Host") != null) {
        frament = true;
    }
    return frament;
}

然后启动包或更新包。希望有帮助

谢谢,但是我应该把代码放在哪里?如何将其与pax考试测试集成?我以为您在运行时更改了捆绑包。如果您只是重新运行并更改该捆绑包的测试,那么问题似乎是自己的捆绑包。捆绑包的启动顺序是相关的。尝试将
artifactId(“groovy”)
的顺序更改为最后一个,先保留卫星束您的意思是将
artifactId(“groovy”)
移动到
artifact“groovy xml”)
下面?这似乎没有任何区别:(Groovy捆绑包实际上是片段捆绑包(afaict)。这就是原因吗?为什么不能启动它们?谢谢,但是我应该将此代码放在哪里?如何将其与我的pax考试测试集成?我认为您应该在运行时更改捆绑包。如果您只是重新运行并使用这些捆绑包更改测试,问题似乎是自己的捆绑包。捆绑包启动的顺序是相关的。尝试更改or将
artifactId(“groovy”)
与最后一个绑定在一起,首先保留卫星束。您的意思是将
artifactId(“groovy”)
移动到
artifact“groovy xml”)
下面?这似乎没有什么区别:(Groovy包确实是片段包(afaict)。这就是原因吗?为什么不能启动它们?