如何使用 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 (系统找不到指定的路径。)问题