maven-bundle-plugin嵌入依赖无法将bundle部署到OSGi容器中

时间:2013-03-12 19:00:11

标签: java eclipse maven osgi bundle

我有一个maven项目泛光灯。它与日食运行良好。然后我使用bundle-plugin生成bundle并将所有依赖项嵌入到<embed-dependenciy>的单个目标bundle中。这是pom.xml:

<groupId>net.floodlightcontroller</groupId>
<artifactId>floodlight</artifactId>
<version>master</version>
<packaging>bundle</packaging>
<build>
  <plugins>
    <plugin>
    <groupId>org.apache.felix</groupId>
    <artifactId>maven-bundle-plugin</artifactId>
    <extensions>true</extensions>
    <configuration>
     <instructions>
        <Embed-Dependency>*;scope=compile|runtime</Embed-Dependency>
        <Embed-Transitive>true</Embed-Transitive>
        <Bundle-Activator>net.floodlightcontroller.core.Activator</Bundle-Activator>
        <Bundle-SymbolicName>${project.artifactId}</Bundle-SymbolicName>
    </instructions>
  </configuration>
  </plugin>
 </plugins>
<build>

我检查了目标结构。包含所有依赖项。然后我检查一下manifest.mf:

Import-Package:  
COM.jrockit.reflect,COM.newmonics.PercClassLoader,com.google.protobuf,com.informix.jdbc,
com.kenai.jnr.x86asm,groovy.lang,javax.annotation,javax.jms,javax.mail,
javax.mail.internet,javax.management,javax.naming,javax.net,javax.net.ssl,javax.script,
*
*
*

我想知道为什么它仍然会导入这么多包,因为我已经将所有依赖项嵌入到单个包中。当我将捆绑包部署到OSGi容器并启动它时,我得到错误:

Unable to start bundle 402: Unresolved constraint in bundle floodlight [402]: 
Unable to resolve 402.0: missing requirement [402.0] osgi.wiring.package;   
(osgi.wiring.package=COM.jrockit.reflect)

COM.jrockit.reflect是import-package中列出的第一个包。但它没有在出口包中列出。这个包在运行时是否需要?任何人都可以帮助我吗?

1 个答案:

答案 0 :(得分:3)

令人遗憾的是,许多罐子的代码依赖性比他们在pom中声明的要多。它们通常位于“桥接”环境的代码的一部分中。即当jar在例如jrockit或groovy中执行时,它可以利用它,但核心代码并不真正需要这种依赖。此外,应该可以从您的应用服务器导入javax包。这些通常位于maven的“提供”范围内。

通常,您可以将这些依赖项设置为可选项,并祈祷它没有核心代码路径。您可以使用以下内容将它们设为可选:

<_import-package>
   javax.*, 
   COM.jrockit.*;
     COM.newmonics.*; 
     com.google.protobuf;
     com.informix.jdbc;
     com.kenai.jnr.x86asm;
     groovy.lang; 
       resolution:=optional, 
   *
</_import-package>

最后不要忘记'*',它提供正常导入的掩码。