使用maven-bundle-plugin和maven-shade-plugin

时间:2013-08-16 19:19:01

标签: maven osgi maven-shade-plugin maven-bundle-plugin

我正在使用maven-shade-plugin在我的构建的包阶段重新定位一些包。我也使用maven-bundle-plugin来生成清单。问题是bundle插件在shade插件之前运行(在process-classes阶段),并且在生成的manifest的导出中不包含任何阴影包。

我怎样才能让这两个插件彼此玩得很好,这样我的重定位包就像bundle插件一样对待任何其他包?

-

根据请求,我的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>

采取from here

3 个答案:

答案 0 :(得分:7)

另一个选择是完全转储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 :(得分:1)

解决方案非常简单。您仍然可以同时使用maven-bundle-plugin和maven-shade-plugin。你只需要记住订单。如果您使用捆绑包装,maven捆绑插件将在封装阶段在maven-shade之前执行。但那并没有错。

这是合约。

  • 使用私有包:pkg.name.before.shading
  • 使用一个&lt; include&gt; null:null&lt; / include&gt;制作maven-shade-plugin - 这将阻止阴影插件创建空jar
  • 使用maven-shade-plugin重定位 - 从pkg.name.before.shading到other.pkg。

您可能会在FasterXML jackson-module-paranamer

中看到此技巧

答案 2 :(得分:0)

我认为在完成compile阶段后你想要:

  1. 使用shade插件重定位某些类
  2. 使用bundle plugin创建一个清单
  3. 使用jar插件将所有内容打包
  4.   

    问题是bundle插件在shade插件之前运行

    捆绑插件绑定到process-classes阶段,该阶段是before与<插件插件绑定的package阶段。

    我建议您将shade插件绑定到process-classes阶段。更改阴影插件配置如下:

    <phase>process-classes</phase>
    

    由于shade插件定义位于pom文件中的bundle插件定义之前,因此shade插件将在process-classes阶段的bundle插件之前运行。