如何使用 Maven 在 MANIFEST.MF 中为 JBoss AS 7 生成模块依赖项?
Posted
技术标签:
【中文标题】如何使用 Maven 在 MANIFEST.MF 中为 JBoss AS 7 生成模块依赖项?【英文标题】:How do you generate module dependencies in MANIFEST.MF for JBoss AS 7 with maven? 【发布时间】:2011-10-05 03:58:56 【问题描述】:在 JBoss AS 7 中,依赖于 AS 中包含的库的 Web 应用程序必须在 META-INF/MANIFEST.MF 中声明这些依赖项,如下所示:
Dependencies: <package-name>
例子:
Dependencies: org.slf4j
(这类似于 Import-Package: for OSGi。) 更多信息可以在关于migration from older versions、class loading和implicit module dependencies for deployments的文章中找到
该项目是使用 Maven 构建的。 AS 中包含的所有依赖项都声明为“已提供”范围。
现在的问题
是否有一种简单的方法可以使用 Maven 自动创建此依赖项列表?
仅应包含声明范围为“提供”的依赖项,因为所有其他依赖项都已包含在 WAR 中。
【问题讨论】:
【参考方案1】:这些依赖项是由 maven 工件没有任何映射的名称声明的。您可能可以使 groupId 与 jboss 模块名称保持同步,但我不确定这是否是个好主意。而且我仍然想不出任何自动化的解决方案。
但是有一个地方可以手动管理配置,如您在问题中提供的来源之一所述:
<build>
...
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<configuration>
<archive>
<manifestEntries>
<Dependencies>org.slf4j</Dependencies>
</manifestEntries>
</archive>
</configuration>
</plugin>
</plugins>
</build>
我希望有人想出一个插件来使它不那么麻烦。
【讨论】:
'org.slf4j' 是工件的组 id,所以 Maven 已经知道了。但是,这个组 id 被几个工件使用。 JBoss 是如何知道是哪个 jar 的? @migu - 查看 jboss 根目录中的 modules/org/slf4j/main 文件夹(因为这是由 org.slf4j 依赖项导入的)。并特别查看作为其描述符的 module.xml。如您所见,maven group 和这个模块使用相同的名称只是一个巧合。 正是我想要的! 这似乎是目前唯一可用的解决方案。新的 JBoss 模块系统的缺点是我们必须在 POM 中维护两组重叠的依赖关系,并且我们必须手动查找可以使用的模块。 这就是我的理解:好处应该是将模块分离到单独的类加载器作用域中。这使得在同一个 AS 中使用不同的 jar 版本成为可能。【参考方案2】:此代码会在您的 MANIFEST.MF 中自动添加所有编译依赖项
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>2.4</version>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
</manifest>
</archive>
</configuration>
</plugin>
更多信息在这里:http://maven.apache.org/plugins/maven-war-plugin/examples/war-manifest-guide.html
【讨论】:
正如 Michał Minicki 已经指出的那样,maven 组和某些模块具有相同的名称只是巧合。因此,添加类路径没有帮助,因为 JBoss AS 需要模块名称。以上是关于如何使用 Maven 在 MANIFEST.MF 中为 JBoss AS 7 生成模块依赖项?的主要内容,如果未能解决你的问题,请参考以下文章
Maven-maven插件添加主类信息到MANIFEST.MF
Maven异常_01_MANIFEST.MF (系统找不到指定的路径。)
在maven中配置依赖,jar包解压后没有MANIFEST.MF文件,或者文件中只有一行Manifest-Version: 1.0
如何从 Jboss EAP 6.4 中部署的所有战争的 manifest.mf 文件中获取实现版本详细信息
MAVEN插件打包SNAPSHOT包MANIFEST.MF中Class-Path带时间戳的问题
解决Maven项目pom.xml文件报xxx\target\classes\META-INF\MANIFEST.MF (系统找不到指定的路径。)问题