如何使用maven-bundle-plugin从Import-Package中排除版本号?

时间:2016-03-23 21:22:39

标签: maven eclipse-plugin osgi apache-felix

我遇到了maven-bundle-plugin生成的MANIFEST.MF问题。出于某种原因,当我在<Import-Package>字段中列出版本号时,OSGi框架不会加载我的包。

我已经进行过实验,并注意到如果我删除了清单中的版本号,那么捆绑包已正确加载。

如何指示maven-bundle-plugin跳过版本号?

目前,它会生成:

Import-Package: com.ghc.ghTester.expressions,org.apache.ws.security.proc
 essor;version="[1.5,2)",org.apache.ws.security;version="[1.5,2)",org.ap
 ache.ws.security.message;version="[1.5,2)",org.apache.ws.security.compo
 nents.crypto;version="[1.5,2)",org.apache.ws.security.message.token;ver
 sion="[1.5,2)"

但我需要它来生成:

Import-Package:com.ghc.ghTester.expressions,org.apache.ws.security.proc  ESSOR,org.apache.ws.security,org.apache.ws.security.message,org.apache。  ws.security.components.crypto,org.apache.ws.security.message.token

我的插件配置为:

        <plugin>
            <groupId>org.apache.felix</groupId>
            <artifactId>maven-bundle-plugin</artifactId>
            <version>3.0.0</version>
            <extensions>true</extensions>
            <configuration>
                <instructions>
                    <Bundle-SymbolicName>${pom.groupId}.${pom.artifactId};singleton:=true</Bundle-SymbolicName>
                    <Bundle-Name>${pom.name}</Bundle-Name>
                    <Bundle-Version>${pom.version}</Bundle-Version>
                    <Bundle-ClassPath>{maven-dependencies},.</Bundle-ClassPath>
                    <Embed-Dependency>*;scope=compile</Embed-Dependency>
                    <Export-Package/> <!-- nothing for this bundle to export -->
                    <Import-Package>com.ghc.ghTester.expressions,org.apache.ws.*</Import-Package>
                </instructions>
            </configuration>
        </plugin>

如果我尝试使用该版本加载它,我会收到以下错误:

org.osgi.framework.BundleException: Could not resolve module: com.rit.message-level-security [978]
  Unresolved requirement: Import-Package: org.apache.ws.security; version="[1.0.0,3.0.0)"

        at org.eclipse.osgi.container.Module.start(Module.java:434)
        at org.eclipse.osgi.internal.framework.EquinoxBundle.start(EquinoxBundle.java:393)
        at org.eclipse.osgi.internal.framework.EquinoxBundle.start(EquinoxBundle.java:412)
        at com.ghc.ghTester.Activator.installTempBundle(Activator.java:157)

3 个答案:

答案 0 :(得分:3)

version=!部分中的Import-Package添加到您想要省略版本的每个捆绑包中都可以解决问题。

<Import-Package>
    com.ghc.ghTester.expressions;version=!,
    org.apache.ws.security.processor;version=!,
    org.apache.ws.security;version=!,
    org.apache.ws.security.message;version=!,
    org.apache.ws.security.components.crypto;version=!,
    org.apache.ws.security.message.token;version=!,
    *
</Import-Package>

答案 1 :(得分:2)

您可以使用以下配置禁用Import-Package版本:

<_consumer-policy>$${range;[--,++)}</_consumer-policy>

答案 2 :(得分:0)

您可以像使用&#34; com.ghc.ghTester.expressions&#34;

一样手动开始编写导入
<Import-Package> 
com.ghc.ghTester.expressions,
org.apache.ws.security.processor,
org.apache.ws.security,
org.apache.ws.security.message,
org.apache.ws.security.components.crypto,
org.apache.ws.security.message.token
</Import-Package>

尽管这不是评论中提到的好习惯,但它应该可以解决问题。但是如果以后需要额外的导入,你也必须手动添加它们。

顺便说说。

的值
<Bundle-Name>${pom.name}</Bundle-Name>
<Bundle-Version>${pom.version}</Bundle-Version>

默认为您提供的值。见http://felix.apache.org/documentation/subprojects/apache-felix-maven-bundle-plugin-bnd.html 部分:默认行为