我知道这已经 5 岁了,但它仍然是我搜索时出现的第一个答案。此外,虽然“这不是 maven 方式”对某些人来说是一个完全合理的答案,但其他人可能仍然喜欢像 OP 所要求的那样使用单个 pom,而且它真的没有那么复杂。
首先,创建一个标准的war pom.xml 来生成你想要包含在ear 中的war 文件。让包装成为战争。
然后使用占位符作为战争文件名编写您自己的 application.xml(在 src/main/application 或任何地方):
<application xmlns="http://java.sun.com/xml/ns/javaee" ... >
<module>
<web>
<web-uri>${project.build.finalName}.war</web-uri>
<context-root>myapp</context-root>
</web>
</module>
</application>
并在同一位置包含任何其他特定于服务器的 xml 文件(weblogic-application.xml 等)。
接下来,添加一个资源部分以将占位符替换为 war 文件名:
<resources>
<resource>
<directory>src/main/application</directory>
<filtering>true</filtering>
<includes>
<include>META-INF/*.xml</include>
</includes>
</resource>
</resources>
最后,添加一个蚂蚁耳朵任务来构建耳朵:
<plugin>
<artifactId>maven-antrun-plugin</artifactId>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>run</goal>
</goals>
<configuration>
<tasks>
<ear destfile="${project.build.directory}/${project.build.finalName}.ear"
appxml="${project.build.outputDirectory}/META-INF/application.xml">
<fileset dir="${project.build.outputDirectory}" includes="META-INF/*.xml"/>
<fileset dir="${project.build.directory}" includes="${project.build.finalName}.war"/>
</ear>
</tasks>
</configuration>
</execution>
</executions>
</plugin>
就是这样。