【问题标题】:maven bundle plugin embeded deps exclude files or packagesmaven bundle 插件嵌入 deps 排除文件或包
【发布时间】: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


    【解决方案1】:

    &lt;Embed-Dependency&gt; 中删除axis-jaxrpc 并将您关心的axis-jaxrpc 中的包添加到&lt;Private-Package&gt; 部分 - 这些将嵌入到您的捆绑包中。您可能需要对 axis-jaxrpc 依赖的包执行相同操作,或者将相应的依赖包添加到 &lt;Embed-Dependency&gt;

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-25
      • 1970-01-01
      相关资源
      最近更新 更多