我正在尝试建立一场瘦身战争,以便以后包含在一个大耳朵文件中。ear 构建完全独立于我的战争项目,并希望我提供一个瘦战争,使用正确的清单文件,ear 承诺在其根 /libs 文件夹中提供提供的 jar。
我面临的问题是获取战争的 manifest.mf 文件以指定提供的 jar 位于 ear 的 /libs 文件夹中,而编译/运行时 jar 位于战争中。即 manifest.mf 类路径条目希望如下所示:
Class-Path: libs/commons-lang.jar commons-codec.jar
commons-lang 的范围是提供并预计在 ear 的 libs 目录中。
commons-codec 是编译时间,预计将成为战争的一部分。
我已经探索了maven-war-plugin,但无法弄清楚如何让它为提供的 依赖项提供classpathPrefix。
请问有什么建议吗?
最终采用的解决方案(感谢所有提示和链接)要求 ear 提供的依赖项的范围为提供,这注意到了 hack:fake-application.xml:
<plugin>
<!--required to fix the war's manifest and skinny the war-->
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-ear-plugin</artifactId>
<version>2.10.1</version>
<configuration>
<defaultLibBundleDir>lib/</defaultLibBundleDir>
<skinnyWars>true</skinnyWars>
<generateApplicationXml>true</generateApplicationXml>
<applicationXml>${project.basedir}/src/test/fake-ear/fake-application.xml</applicationXml>
</configuration>
<executions>
<execution>
<phase>verify</phase>
<goals><goal>ear</goal></goals>
</execution>
</executions>
</plugin>
然后我将这个新的瘦战争部署到存储库,并使用 maven 部署插件这样做:
<plugin>
<!--used in release build to deploy skinny war to nexus-->
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-deploy-plugin</artifactId>
<version>2.8.2</version>
<executions>
<execution>
<id>deploy-file</id>
<phase>install</phase>
<goals>
<goal>deploy-file</goal>
</goals>
<configuration>
<!--location of the skinny war after maven-ear-plugin builds it-->
<file>${project.build.directory}/${project.artifactId}-${project.version}/${artifactid}-${project.parent.version}.war</file>
<repositoryId>releases</repositoryId>
<url>${distributionManagement.repository.url}</url>
<groupId>${project.parent.groupId}</groupId>
<artifactId>${artifactid}</artifactId>
<version>${project.parent.version}</version>
<packaging>war</packaging>
</configuration>
</execution>
</executions>
</plugin>