15

ビルドのパッケージ段階でいくつかのパッケージを再配置するために maven-shade-plugin を使用しています。また、maven-bundle-plugin を使用してマニフェストを生成しています。問題は、バンドル プラグインがシェード プラグインの前に (プロセス クラス フェーズで) 実行され、生成されたマニフェストのエクスポートにシェーディングされたパッケージが含まれないことです。

再配置されたパッケージがバンドル プラグインによって他のパッケージと同様に扱われるように、これら 2 つのプラグインを互いにうまく連携させるにはどうすればよいですか?

--

リクエストにより、POM の Shade および bundle セクション:

  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-shade-plugin</artifactId>
    <executions>
      <execution>
        <phase>package</phase>
        <goals>
          <goal>shade</goal>
        </goals>
      </execution>
    </executions>
    <configuration>
      <filters>
        <filter>
          <artifact>cglib:cglib</artifact>
          <includes>
            <include>net/sf/cglib/core/**</include>
            <include>net/sf/cglib/proxy/**</include>
          </includes>
        </filter>
      </filters>
      <relocations>
        <relocation>
          <pattern>net.sf.cglib</pattern>
          <shadedPattern>org.modelmapper.internal.cglib</shadedPattern>
        </relocation>
        <relocation>
          <pattern>org.objectweb.asm</pattern>
          <shadedPattern>org.modelmapper.internal.asm</shadedPattern>
        </relocation>
      </relocations>
    </configuration>
  </plugin>

  <plugin>
    <groupId>org.apache.felix</groupId>
    <artifactId>maven-bundle-plugin</artifactId>
    <version>2.3.7</version>
    <executions>
      <execution>
        <id>bundle-manifest</id>
        <phase>process-classes</phase>
        <goals>
          <goal>manifest</goal>
        </goals>
      </execution>
    </executions>
    <configuration>
      <instructions>
        <Bundle-SymbolicName>${project.artifactId}</Bundle-SymbolicName>
        <Export-Package>
          org.modelmapper,
          org.modelmapper.builder,
          org.modelmapper.config,
          org.modelmapper.convention,
          org.modelmapper.spi
        </Export-Package>
        <Private-Package>
          org.modelmapper.internal.**
        </Private-Package>
        <Import-Package>
          *
        </Import-Package>
        <Include-Resource>
          {maven-resources},
          {maven-dependencies}
        </Include-Resource>
      </instructions>
    </configuration>
  </plugin>

ここから撮影

4

4 に答える 4

7

もう 1 つのオプションは、maven バンドル プラグインを完全にダンプし、Maven Shade プラグインManifestResourceTransformerを使用して、目的の OSGI メタデータをマニフェストに追加することです。

例としてxbean-asm-shaded/pom.xmlを見てください。

<transformers>
  <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
    <manifestEntries>
      <Bundle-SymbolicName>${project.artifactId}</Bundle-SymbolicName>
      <Export-Package>
        org.apache.xbean.asm;org.modelmapper.builder; ...
      </Export-Package>
      <Import-Package>*</Import-Package>
      <Private-Package>org.modelmapper.internal ...</Private-Package>
   </manifestEntries>
</transformer>
于 2013-08-30T17:54:27.407 に答える
2

解決策は非常に簡単です。maven-bundle-plugin と maven-shade-plugin は同時に使用できます。順序について覚えておく必要があります。バンドル パッケージングを使用する場合、maven-shade の前のパッケージ段階で maven バンドル プラグインが実行されます。しかし、それはそれほど間違っていません。

これが取引です。

  • Private-Package を使用: pkg.name.before.shading
  • 1 つの <include>null:null</include> で maven-shade-plugin を作成します - これにより、shade プラグインが空の jar を作成するのを防ぎます
  • maven-shade-plugin の再配置を使用します - pkg.name.before.shading から other.pkg へ。

FasterXML jackson-module-paranamerでこのトリックが機能しているのを見るかもしれません

于 2013-09-03T21:00:25.140 に答える
0

フェーズが完了したら、次のことを行いcompileたいと思います。

  1. シェード プラグインを使用して一部のクラスを再配置する
  2. バンドル プラグインでマニフェストを作成する
  3. jar プラグインですべてをパックする

問題は、シェード プラグインの前にバンドル プラグインが実行されることです。

バンドル プラグインは、shade プラグインがバインドされているフェーズの前にあるフェーズprocess-classesにバインドされます。package

シェード プラグインをprocess-classesフェーズにもバインドすることをお勧めします。シェード プラグインの設定を次のように変更します。

<phase>process-classes</phase>

シェード プラグインの定義は、pom ファイル内のバンドル プラグインの定義の前にあるため、process-classesフェーズ中にシェード プラグインはバンドル プラグインの前に実行されます。

于 2013-08-28T19:55:34.800 に答える