我有一个Maven专案探照灯。在日食方面运行良好。然后,我使用bundle-plugin生成捆绑包,并将所有依赖项通过<embed-dependenciy>嵌入到单个目标捆绑包中。这是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是导入包中列出的第一个包。但是未在导出包中列出。运行时是否需要此软件包?谁能帮我?

最佳答案

令人遗憾的做法是,许多jar在其代码中具有比在pom中声明的更多的依赖关系。它们通常是“桥接”环境代码的一部分。即当在jrockit或groovy中执行jar时,它可以利用它,但是核心代码实际上并不需要此依赖关系。此外,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>


不要忘了最后的“ *”,它为常规导入提供了掩码。

07-28 02:13
查看更多