我正在使用OSGi bundle,它使用javax.ws.rs-api(2.0.1)。 Karaf已经将jsr311-api(1.1.1)作为捆绑加载。当我尝试加载我的OSGi包时,我看到以下异常。有没有办法可以忽略以前加载的包?
The activate method has thrown an exception
java.lang.LinkageError: ClassCastException: attempting to castbundle://137.0:1/javax/ws/rs/ext/RuntimeDelegate.class to bundle://177.0:1/javax/ws/rs/ext/RuntimeDelegate.class
at javax.ws.rs.ext.RuntimeDelegate.findDelegate(RuntimeDelegate.java:146)[137:javax.ws.rs.jsr311-api:1.1.1]
at javax.ws.rs.ext.RuntimeDelegate.getInstance(RuntimeDelegate.java:120)[137:javax.ws.rs.jsr311-api:1.1.1]
at javax.ws.rs.core.UriBuilder.newInstance(UriBuilder.java:95)[137:javax.ws.rs.jsr311-api:1.1.1]
at javax.ws.rs.core.UriBuilder.fromUri(UriBuilder.java:119)[137:javax.ws.rs.jsr311-api:1.1.1]
答案 0 :(得分:0)
您的捆绑包必须仅导入您需要的软件包版本。
您必须使用META-INF\MANIFEST.MF
标头创建Import-Package
,其中包含仅需要版本的软件包列表。
Import-Package: javax.ws.rs.ext,version="2.0.1"
列出导致冲突的所有软件包。 我想他们在这里:
javax.ws.rs,version="2.0.1"
javax.ws.rs.client,version="2.0.1"
javax.ws.rs.container,version="2.0.1"
javax.ws.rs.core,version="2.0.1"
javax.ws.rs.ext,version="2.0.1"
您可以指定一系列版本:[2.0.1,3]等。
真实的例子:
Import-Package: org.osgi.service.blueprint; version="[1.0.0, 2.0.0)"
您可以使用maven-bundle-plugin
创建重新加注的MANIFEST.MF:
<plugin>
<groupId>org.apache.felix</groupId>
<artifactId>maven-bundle-plugin</artifactId>
<version>2.3.7</version>
<extensions>true</extensions>
<configuration>
<instructions>
<Bundle-SymbolicName>${project.artifactId}</Bundle-SymbolicName>
<Bundle-Description>${project.description}</Bundle-Description>
<Import-Package>
javax.ws.rs;version=2.0.1,
javax.ws.rs.client;version=2.0.1,
javax.ws.rs.container;version=2.0.1,
javax.ws.rs.core;version=2.0.1,
javax.ws.rs.ext;version=2.0.1,
*,
org.apache.camel.osgi
</Import-Package>
<Export-Package>
your.package
</Export-Package>
</instructions>
</configuration>
</plugin>
不要忘记安装捆绑包版本2.0.1