0

Maven プロジェクトの Floodlight があります。日食でうまく動作します。次に、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 は、インポート パッケージにリストされている最初のパッケージです。ただし、エクスポート パッケージには記載されていません。このパッケージは実行時に必要ですか? 誰でも私を助けることができますか?

4

1 に答える 1

3

多くのjarファイルが、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>

最後の「*」を忘れないでください。これは通常のインポートのマスクを提供します。

于 2013-03-13T07:44:27.060 に答える