15

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

我怎样才能让这两个插件相互配合,以便我重新定位的包被捆绑插件像任何其他包一样对待?

--

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

另一种选择是完全转储 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>
于 2013-08-30T17:54:27.407 回答
2

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

这是交易。

  • 使用私有包:pkg.name.before.shading
  • 使用一个 <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. 使用 shade 插件重新定位一些类
  2. 使用捆绑插件创建清单
  3. 用 jar 插件打包

问题是捆绑插件在阴影插件之前运行

捆绑插件绑定到在阴影插件绑定的process-classes阶段之前的阶段。package

我建议您也将阴影插件绑定到process-classes相位。像这样更改阴影插件配置:

<phase>process-classes</phase>

由于在 pom 文件中 shade 插件定义在 bundle 插件定义之前,所以在这个process-classes阶段 shade 插件将在 bundle 插件之前运行。

于 2013-08-28T19:55:34.800 回答
0

Hazelcast - HazelcastManifestTransformer (ver 3.9)有一个巧妙的transformer实现这个功能。它所做的是精心合并和属性,使用户能够排除扩展/减少默认合并结果。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 的变压器并没有获得太多的宣传。

于 2017-11-24T14:10:18.970 回答