maven bundle plugin embeded deps排除文件或包

时间:2017-10-02 10:02:58

标签: java maven osgi bundle jax-rpc

我的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:接口itable初始化中的加载器约束违规:解析方法时“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的类加载器(实例)

1 个答案:

答案 0 :(得分:0)

axis-jaxrpc移除<Embed-Dependency>并将您关注的axis-jaxrpc个软件包添加到<Private-Package>部分 - 这些软件包将嵌入您的软件包中。您可能需要对包axis-jaxrpc依赖的包执行相同操作,或将相应的依赖包添加到<Embed-Dependency>