我需要在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片段:

依赖项:

<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:接口可迭代初始化中的加载程序约束违规:当解析方法“ org.apache.axis.message.MessageElement.getChildElements(Ljavax / xml / namespace / QName;)Ljava / util / Iterator;”时当前类的类加载器(org / apache / felix / framework / BundleWiringImpl $ BundleClassLoaderJava5的实例),org / apache / axis / message / MessageElement和接口javax / xml / soap / SOAPElement的类加载器(的实例)

最佳答案

axis-jaxrpc中删除​​<Embed-Dependency>,并将您要关注的axis-jaxrpc中的软件包添加到<Private-Package>部分中-这些软件包将嵌入到您的捆绑软件中。您可能需要对axis-jaxrpc所依赖的程序包执行相同的操作,或者将相应的依赖项束添加到<Embed-Dependency>

08-04 18:35