这是How to upgrade groovy-all from 2.4 to 2.5 when running in OSGi?的后续问题。 groovy-all
工件在Groovy的2.5版中不再作为jar文件提供,因此上面答案中的建议是改为使用单个jar文件。我有一个使用Pax Exam的测试用例,看起来像this:
@RunWith(PaxExam.class)
public class XmlPathOSGiITest {
@Configuration
public static Option[] configure() {
return new Option[]
{
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"),
/* Transitive dependencies needed in the Pax Exam container.
Some of these need to be wrapped because they are not available as OSGi bundles */
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()),
/* Rest Assured dependencies needed in the Pax Exam container to be able to execute the tests below */
mavenBundle("io.rest-assured", "json-path").versionAsInProject(),
mavenBundle("io.rest-assured", "xml-path").versionAsInProject(),
mavenBundle("io.rest-assured", "rest-assured").versionAsInProject(),
mavenBundle("io.rest-assured", "rest-assured-common").versionAsInProject()
};
}
@Test
public void getUUIDParsesAStringResultToUUID() {
final String UUID_XML = "<some>\n" +
" <thing id=\"1\">db24eeeb-7fe5-41d3-8f06-986b793ecc91</thing>\n" +
" <thing id=\"2\">d69ded28-d75c-460f-9cbe-1412c60ed4cc</thing>\n" +
"</some>";
final UUID uuid = from(UUID_XML).getUUID("some.thing[0]");
assertThat(uuid, Matchers.equalTo(UUID.fromString("db24eeeb-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: Fragment bundles can not be started.
at org.apache.felix.framework.Felix.startBundle(Felix.java:2144)
at org.apache.felix.framework.BundleImpl.start(BundleImpl.java:998)
at org.apache.felix.framework.BundleImpl.start(BundleImpl.java:984)
at org.ops4j.pax.swissbox.framework.RemoteFrameworkImpl.startBundle(RemoteFrameworkImpl.java:178)
我该如何解决?
答案 0 :(得分:0)
重新运行捆绑包后,您需要检查其是否碎片化:
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;
}
发生这种情况时,您需要先停止分发包:
if (!isBundleFragment(bundle)) {
bundle.stop();
}
然后启动或更新您的捆绑包。希望对您有帮助!