我想用 war 包结构部署我的一个 OSGi 包,以便它被 Struts 识别为 Web 应用程序。我使用 Maven,所以我得到内置的 WAR 包,我有 Maven bundle-plugin 来为我创建 OSGi 兼容的 list 。
问题是,两者不能一起工作,所以 bundle 插件不知道类文件现在在子文件夹 classes/
中,而捆绑的 jar 在 lib 中/
,所以它创建了一个错误的 Bundle-classpath
header 。我可以手动将正确的 header 添加到我的 pom.xml
,但我希望自动添加。我该怎么做?
最佳答案
OPS4J Wiki 页面上描述了(或多或少)实现此目的的一种方法 -- "Getting the benefits of maven-bundle-plugin in other project types" .
您可以在 pom.xml
中配置依赖嵌入和 Bundle-ClassPath
指令以匹配 WAR 插件使用的位置。然后 maven-bundle-plugin 将生成正确的 list header 。
maven-bundle-plugin 的说明可能如下所示:
<instructions>
<Bundle-ClassPath>.,WEB-INF/classes,{maven-dependencies}</Bundle-ClassPath>
<Embed-Directory>WEB-INF/lib</Embed-Directory>
<Embed-Dependency>*;scope=compile|runtime</Embed-Dependency>
<Embed-Transitive>true</Embed-Transitive>
<!-- ... -->
</instructions>
ETA:在使用这种方法时,我发现了两件值得注意的事情:
- bundle 插件会提示缺少
WEB-INF
目录,因为当 manifest 目标执行时,war 插件还没有创建它们(它只在稍后阶段运行) - 虽然它对实际的 webapp 没有意义,
Bundle-ClassPath
指令必须包含“.”,否则 bundle 插件会弄乱Import-Packages
header 。我通过 Google 在一些 JIRA 问题中发现了这个,但我找不到该 URL。
除此之外它工作正常。
关于java - 我如何在 Maven 中结合 WAR 打包和 OSGi 包创建?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1593074/