使用maven-bundle-plugin在JAR中嵌入依赖关系不起作用

时间:2016-11-03 10:27:42

标签: jar osgi osgi-bundle flying-saucer maven-bundle-plugin

我已经成功地将OSGi特定的元数据添加到了飞碟-pdf Maven工件的MANIFEST中。但是,我没有成功将该工件的依赖项和传递依赖项嵌入到创建的JAR文件中。

我使用的是来自GitHub [1]的flying-saucer-pdf的原始资源,并将以下语句添加到pom.xml文件中:

for

工件在其原始pom.xml中声明为itext版本2.1.7的依赖项,我没有触及。我也没有弄乱罐子的原始包装类型。

不幸的是,这只是部分工作。 MANIFEST.MF似乎正确并包含预期的OSGi标记:

<plugin>
    <artifactId>maven-jar-plugin</artifactId>
    <configuration>
      <archive>
        <manifestFile>${project.build.outputDirectory}/META-INF/MANIFEST.MF</manifestFile>
      </archive>
    </configuration>
  </plugin>
  <plugin>
    <groupId>org.apache.felix</groupId>
    <artifactId>maven-bundle-plugin</artifactId>
    <executions>
      <execution>
        <id>bundle-manifest</id>
        <phase>process-classes</phase>
        <goals>
          <goal>manifest</goal>
        </goals>
        <configuration>
          <instructions>
            <Embed-Dependency>itext</Embed-Dependency>
            <Embed-Transitive>true</Embed-Transitive>
          </instructions>
        </configuration>
      </execution>
    </executions>
  </plugin>

但是没有将itext库放入生成的JAR中,即MANIFEST的Bundle-ClassPath条目指向缺少的内容。

此外,我尝试创建一个全新的工件,它声明了对原始的fly-saucer-pdf工件的依赖关系,并将其重新捆绑为一个OSGi包,在StackOverflow上流动这个答案[2],这很有用。

我能看到的唯一真正的区别是包装类型'捆绑'与'罐'。但是我无法在原始的fly-saucer-pdf工件中更改该包装类型,因为所有内容都需要保持非OSGi用法,以便将该更改作为推送请求接受。

你们是否知道这种与maven-bundle-plugin的嵌入依赖性是否真的可以与包装类型“jar”一起使用?或者是否需要包装类型'捆绑'?

我感谢任何回复和暗示我可以尝试直接在原始工件中完成重新捆绑。

非常感谢。

此致 蒂莫·罗尔伯格

1 个答案:

答案 0 :(得分:2)

有两种方法可以使用maven bundle插件。

第一种方法是使用

<extensions>true</extensions> and <packaging>bundle</packaging>

在这种情况下,maven bundle插件负责所有构建步骤,并且可以影响jar文件内容。

第二种方法是使用清单目标并在jar插件中添加清单。在这种情况下,maven bundle插件只能影响jar。它不能嵌入任何其他库或复制外部私有类。

因此,如果您需要嵌入,那么唯一的方法就是更改包装。

所以我认为有两种解决方案不会对原始罐子造成太大影响。

  1. 不要将依赖项嵌入并安装为bundle
  2. 在构建中创建一个spearate模块,以创建一个随后可用于原始jar的包