2013-03-12 43 views
0

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

<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处于进口封装列出的第一个包。但它没有在出口包装中列出。运行时需要这个软件包吗?谁能帮我?

回答

3

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

通常,您可以使这些依赖关系成为可选项,并祈祷没有核心代码路径。你可以让他们在BND可选的:

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

不要忘了“*”末,它提供了正常进口的面具。