如何用maven-bundle-plugin在bundle中嵌入内部JAR包

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何用maven-bundle-plugin在bundle中嵌入内部JAR包相关的知识,希望对你有一定的参考价值。

部署时从maven库中找到这个jar包,然后直接放到Felix的bundle目录,启动Felix,就可以看到这个jar包作为一个独立bundle已经启动,其他bundle就可以通过直接Import-Package的方式来引用这些包。的之所以能够这么做是因为这个jar已经osgi化了,查看jar包中的META-INF/MENIFEST.MF文件,只要其中有Bundle-SymbolicName: org.apache.commons.io等一系列Bundle-*的属性值,并且有Export-Package导出内部的包就可以确定。现在大部分从maven库中获得的比较新的jar包,基本上都已经支持OSGI了。如果一个jar包确实不包含OSGI信息,也可以通过手动编辑它的MENIFEST.MF文件增加OSGI信息,来实现这个jar包独立作为bundle运行。例如json-20090211.jar,直接编辑它的MENIFEST.MF 参考技术A   1. ubuntu注意当前目录位置,例如有的挂载盘没有权限,sudo make也没有用。
2. mupdf的platform/android是我们编译android所需要操作的目录。里面有一个README,其中一步是生成genarated目录的。这步必须要做。也就是到mupdf根目录,进行make generate,会生成这个目录。然后把这个目录复制到platform/android下面。
3. 修改local.properties也是必要的,下面是我的修改的:
sdk.diri=/home/viz/install/android_studio/android-studio/sdk/platforms/android-17/
ndk.dir=/home/viz/install/android-ndk-r9/
4. android目录下的jni/Application.mk也需要修改一下, APP_PLATFORM=android-8 APP_ABI := armeabi
APP_ABI默认是armeabi-v7a,这个是生成不同的cpu的so文件用的。
一般会生成两个分别放在lib中。
参考技术B 安装 Maven 之前要求先确定你的 JDK 已经安装配置完成。Maven是 Apache 下的一个项目,目前最新版本是 3.0.4,我用的也是这个。 首先去官网下载 Maven 下载完成之后将其解压,我将解压后的文件夹重命名成 maven,并将它放在 D:\Server 目录下本回答被提问者采纳

将 maven-bundle-plugin 与 maven-shade-plugin 一起使用

【中文标题】将 maven-bundle-plugin 与 maven-shade-plugin 一起使用【英文标题】:Using maven-bundle-plugin with the maven-shade-plugin 【发布时间】:2013-08-19 06:58:29 【问题描述】:

我正在使用 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>

拍摄from here

【问题讨论】:

请发布您的 pom.xml 的相关部分,包括 &lt;Export-Package&gt;&lt;relocations&gt; 部分。 这与 osgi 和/或 fuse ESB 有关吗?值得添加这些标签吗? @AnthonyAccioly - 已发布。 @vikingsteve - 是的,OSGI。你指的是哪些标签? @Jonathan 我的意思是建议将 osgi 标签添加到您的问题中,看起来已经完成:) 【参考方案1】:

另一种选择是完全转储 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>

【讨论】:

【参考方案2】:

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

这是交易。

使用私有包:pkg.name.before.shading 用一个 null:null 制作 maven-shade-plugin - 这将防止 shade 插件创建空 jar 使用 maven-shade-plugin 重定位 - 从 pkg.name.before.shading 到 other.pkg。

你可能会看到这个技巧在 FasterXML jackson-module-paranamer 中起作用

【讨论】:

这非常有效,除非您想自己导出阴影包。这里提出的解决方案将只包含来自 src/main/java 的包。【参考方案3】:

我假设在compile 阶段完成后,您想要:

    使用 shade 插件重新定位一些类 使用捆绑插件创建清单 使用 jar 插件打包

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

捆绑插件绑定到 process-classes 阶段,该阶段来自 before 与阴影插件绑定的 package 阶段。

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

<phase>process-classes</phase>

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

【讨论】:

不幸的是,这不起作用。它失败了,像这样Failed to execute goal org.apache.maven.plugins:maven-shade-plugin:2.1:shade (default) on project modelmapper: Failed to create shaded artifact, project main artifact does not exist.【参考方案4】:

有一个简洁的 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 的变压器并没有获得太多宣传。

【讨论】:

以上是关于如何用maven-bundle-plugin在bundle中嵌入内部JAR包的主要内容,如果未能解决你的问题,请参考以下文章

如何用alert提示html表单的内容

Web协议详解与抓包实战:如何用Chrome的Network面板分析HTTP报文

使用 maven-bundle-plugin 安装 OSGi 依赖项

将 maven-bundle-plugin 与 maven-shade-plugin 一起使用

maven-bundle-plugin 因“无效的类文件 module-info.class”而失败

如何使用 bnd/maven-bundle-plugin 从 jar 依赖项将资源文件包含到 osgi 包中?