【发布时间】:2018-03-13 09:38:16
【问题描述】:
我的 OSGi 包中需要一个 Apache 库 (axis-jaxrpc),但它有点缺陷,因为它的 jar 包含来自 java 内置函数 (javax.xml.namespace.QName) 的类。我不能用任何其他替代品替换它 - 它是另一个依赖项的附带依赖项......你知道这是怎么回事:)
问题是,每当我捆绑包并启动它时,它就可以正常启动。但是,如果我触摸与 jaxrpc 相关的任何功能,我会收到一个 LinkageError,声称 QName 已被 <bootloader> 加载。
在启动应用程序之前,我设法将jaxrpc jar 分解到我的捆绑 jar 中并手动删除 javax.namespace 目录(即编辑捆绑 jar 内容)。成功了 - 我不再收到 LinkageError。
现在的问题是...如何以非 sado-maso 的方式处理这种情况并从嵌入式 jar 文件中排除有问题的类/包?
POM sn-ps:
依赖关系:
<dependency>
<groupId>org.apache.axis</groupId>
<artifactId>axis</artifactId>
<version>1.4</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.apache.axis</groupId>
<artifactId>axis-jaxrpc</artifactId>
<version>1.4</version>
<scope>provided</scope>
</dependency>
捆绑插件:
<plugin>
<groupId>org.apache.felix</groupId>
<artifactId>maven-bundle-plugin</artifactId>
<version>2.3.6</version>
<extensions>true</extensions>
<configuration>
<instructions>
<Bundle-SymbolicName>${project.artifactId}</Bundle-SymbolicName>
<Export-Package>
/* application packages only */
</Export-Package>
<Private-Package>
/* application packages only */
</Private-Package>
<DynamicImport-Package>
*
</DynamicImport-Package>
<Import-Package></Import-Package>
<Include-Resource>
{maven-resources},target/classes/rebel.xml
</Include-Resource>
<Embed-Dependency>
/* other dependencies */
axis,
axis-jaxrpc;inline=true,
commons-discovery,
commons-logging
</Embed-Dependency>
</instructions>
</configuration>
</plugin>
换个说法……有没有办法像这样做:
<Embed-Dependency>
axis-jaxrpc;inline=true;exclude=javax.namespace.QName
</Embed-Dependency>
编辑:
为了清楚起见例外:
原因:java.lang.LinkageError:接口itable初始化中的加载程序约束冲突:解析方法时“org.apache.axis.message.MessageElement.getChildElements(Ljavax/xml/namespace/QName;)Ljava/util/Iterator ;"当前类 org/apache/axis/message/MessageElement 的类加载器(org/apache/felix/framework/BundleWiringImpl$BundleClassLoaderJava5 的实例)和接口 javax/xml/soap/SOAPElement 的类加载器(的实例)
【问题讨论】:
标签: java maven osgi bundle jax-rpc