我在我的应用程序中使用了一些现成的OSGi包,并希望将它们与尚未与OSGi兼容的其他包重新打包到一个新包中。
例如EclipseLink,它可以作为几个OSGi包使用,其中大多数都是可选的,具体取决于你想要做什么。我想选择那些与我相关的软件包,添加数据库驱动程序(例如MySQl JDBC连接器)并将它们重新打包成一个易于部署的新软件包。
我正在使用Apache Felix的maven-bundle-plugin。我设置了一个没有源代码的新Maven项目,将四个eclipselink和mysql连接器作为依赖项添加,并尝试了以下内容:
<Embed-Dependency>
和<Embed-Transitive>
指令将所有依赖项包含在一个包中。问题:当插件重写清单时,需要来自eclipselink包的可选依赖项(例如,javax.mail.internet)。原始包在清单中包含“resolution = optional”,因此无需使用。manifest
目标和jar-with-dependencies
程序集,但这给了我基本相同的结果,只有更多的工作。bundleall
目标,这不是我想要的,因为它再次创建了单独的包。更糟糕的是,因为现在这些捆绑包内部没有依赖关系。我将面临与Struts 2类似的问题。我不会对此感到痴迷,只需要使用一大堆独立的第三方软件包,但如果我可以整齐地打包它们,我真的很想。我知道OSGi的一个重点是模块化,因此创建大型捆绑包会失败,但我觉得如果你的模块是紧密耦合的,你也可以将它们放在一个捆绑包中。
当然,我可以手动调整清单,但我绝对不想。
答案 0 :(得分:2)
正如omerkudat所说,这可能不是一个鼓励的好习惯,但正如你有理由,这是一种你可以做穷人合并的方法。
假设您自己正在处理OSGi清单,您只需要在包阶段之前将所有类的包和jar中的类放到target / classes目录中。
您可以使用依赖插件的unpack-dependencies或unpack目标来执行此操作。如果你想要处理所有项目依赖项(或那些遵循某个命名模式或某个groupId的那些项目依赖项)和解包目标(如果你想要对要解压缩的工件进行精确控制),我会使用unpack-dependencies(at一个冗长的POM的费用)。我假设在我的例子中解压缩。每个解包都输出到项目的outputDirectory(即目标/类)。
请注意,这将按照下载顺序覆盖每个包中的重复工件,因此清单将互相破坏。为确保正确管理工件,我将解包目标绑定到早期阶段,以便将src / main / resources复制到解压缩的内容之上,而不是覆盖。在下面的示例中,此阶段是 generate-resources ,因此它将在本地编译之后发生。如果您需要覆盖任何类,请使用早期阶段解压缩依赖项,例如 generate-sources
下面的示例在将项目资源复制到目标/类之前,将junit-3.8.1和commons-io 1.4(只是前面两个我声明的依赖项)的内容解压缩到目标/类中。请注意,版本在我的依赖项部分中定义。如果您没有将bundle / jar声明为依赖项,那么您还需要在artifactItem中声明该版本。
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<id>unpack</id>
<phase>generate-resources</phase>
<goals>
<goal>unpack</goal>
</goals>
<configuration>
<artifactItems>
<artifactItem>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<overWrite>false</overWrite>
<outputDirectory>${project.build.outputDirectory}</outputDirectory>
</artifactItem>
<artifactItem>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<overWrite>false</overWrite>
<outputDirectory>${project.build.outputDirectory}</outputDirectory>
</artifactItem>
</artifactItems>
<overWriteReleases>false</overWriteReleases>
<overWriteSnapshots>true</overWriteSnapshots>
</configuration>
</execution>
</executions>
</plugin>