2013-08-16 77 views
10

我正在使用maven-shade-plugin在構建的包階段中重新定位某些軟件包。我也使用maven-bundle-plugin生成清單。問題是bundle插件在shade插件之前運行(在process-classes階段),並且在生成的manifest清單的導出中不包含我的任何陰影軟件包。在maven-shade-plugin中使用maven-bundle-plugin

我怎樣才能讓這兩個插件與對方玩好,這樣我的重新定位的包就像捆綁插件中的任何其他包一樣對待?

-

按要求,樹蔭下,我的POM的捆綁部分:

<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> 

兩者from here

+0

請發佈您的pom.xml的相關部分,包括''和''部分。 –

+0

這與osgi和/或ESB保險絲有關嗎?值得添加這些標籤? – vikingsteve

+0

@AnthonyAccioly - 貼。 – Jonathan

回答

1

我假設compile階段完成後,你想:

  1. 用陰影插件重新定位一些類
  2. 創建清單同捆插件
  3. 包這一切了Jar插件

問題是捆綁插件樹蔭插件

的捆綁插件綁定之前運行到process-classes階段來beforepackage階段陰影插件綁定。

我建議你將燈罩插件綁定到process-classes階段。這樣的變化遮陽插件配置:

<phase>process-classes</phase> 

由於燈罩插件定義來自於POM文件捆綁插件定義之前,樹蔭插件將在process-classes相捆綁插件之前運行。

+0

不幸的是,這是行不通的。它失敗,像這樣'無法執行目標org.apache.maven.plugins:maven-shade-plugin:2.1:陰影(默認)在項目modelmapper:未能創建陰影的工件,項目主工件不存在.' – Jonathan

5

另一種選擇是完全轉儲maven bundle插件並使用Maven Shade Plugin 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> 
1

解決方法非常簡單。您仍然可以同時使用maven-bundle-plugin和maven-shade-plugin。你只需要記住訂單。如果你使用bundle包,Maven bundle插件將在maven-shade之前的包階段執行。但這並沒有錯。

這是交易。

  • 使用Private-Package:pkg.name.before。遮光
  • 讓Maven遮陽簾插件有一個<包括>空:空< /包括> - 這將防止燈罩插件從創建空罐子
  • 使用Maven遮陽簾插件遷移 - 從pkg.name.before。着色到其他.pkg。

您可能會看到這一招在FasterXML jackson-module-paranamer

0

工作有一個整潔的transformer從Hazelcast僅僅實現這個功能 - HazelcastManifestTransformer (ver 3.9)。它所做的是精心合併Import-PackageExport-Package屬性,使用戶能夠排除擴展/減少默認合併結果。

如何使用它在你的pom.xml

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-shade-plugin</artifactId> 
    <version>3.1.0</version> 
    <dependencies> 
    <dependency> 
     <groupId>com.hazelcast</groupId> 
     <artifactId>hazelcast-build-utils</artifactId> 
     <version>3.9</version> 
    </dependency> 
    </dependencies> 
    <executions> 
    <execution> 
     <phase>package</phase> 
     <goals> 
     <goal>shade</goal> 
     </goals> 
     <configuration> 
     <transformers> 
      <transformer implementation="com.hazelcast.buildutils.HazelcastManifestTransformer"> 
      <mainClass>...</mainClass> 
      <!-- the tag below is required due to a missing null-check it seems --> 
      <overrideInstructions></overrideInstructions> 
     </configuration> 
    </executions> 
</plugin> 

的倍率指令(Export/Import-Package)的逗號分隔包名,前面有一個驚歎號,每當我們要排除從列表中那些具體的。

希望這會有所幫助!我意識到這是一個古老的問題,但似乎Hazelcast的變壓器沒有獲得太多的宣傳。