我们有一个相当复杂的项目,过去是在 Ant 中构建的,但现在我们正在迁移到 Maven。
- 有一个核心罐和各种依赖于核心罐的过滤罐。
SAR
这些 jar与其他依赖的 jar 和一些 XML 文件一起组装成一个。我在foo-sar
下面这样称呼它。- 另一个JAR被构建,但是这个JAR不包含任何 Java 代码,只有几个应用程序 xml 文件。我在
foo-jar
下面这样称呼它。 foo-jar
和foo-sar
被打包到 EAR中,并application.xml
在目录中找到一个文件META-INF
。
我有一个包含三个子项目的 Maven 项目:
foo-jar
foo-sar
foo-ear
两者都foo-jar
构建foo-sar
得很好。但是,在foo-ear
构建时,它会用application.xml
文件构建耳朵,但没有foo-jar
和foo-sar
在其中。我的目录结构如下所示:
parent Dir --+
|
+-- foo-ear
|
+-- foo-jar
|
+-- foo-sar
父目录pom.xml
以正确的顺序(、、和)调用所有foo-sar
三个foo-jar
项目foo-ear
。两者都foo-jar
正确foo-sar
构建(即,我已经匹配了 Ant 构建的结果)。该foo-ear
项目构建没有错误,但它不包括耳朵根目录中的foo-sar
和文件。foo-jar
我在这里遗漏了一些非常简单的东西。也许它是一个附加参数,或者另一个配置。
这是耳朵的pom.xml
:
<project>
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.vegicorp.foo</groupId>
<artifactId>foo-parent</artifactId>
<version>1.0.0</version>
</parent>
<groupId>com.vegicorp.foo</groupId>
<artifactId>foo-app</artifactId>
<packaging>ear</packaging>
<build>
<plugins>
<plugin>
<groupId>org.apache.plugins</groupId>
<artifactId>maven-ear-plugin</artifactId>
<version>2.10.1</version>
<configuration>
<artifactTypeMappings>
<!-- The sar is a "jboss-sar" and not just a "sar" -->
<artifactTypeMapping type="jboss-sar" mapping="sar"/>
</artifactTypeMappings>
<modules>
<jarModule>
<artifactId>foo-jar</artifactId>
<unpack>true</unpack>
</jarModule>
<sarModule>
<artifactId>foo-sar</artifactId>
<unpack>true</unpack>
</sarModule>
</modules>
</configuration>
</plugin>
</plugins>
</build>
</project>
新问题
我意识到我遇到的问题之一<groupId>
是设置为org.apache.plugins
而不是org.apache.maven.plugins
为maven-ear-plugin
. 我不知道为什么 Maven 之前没有检测到这个错误并且之前给我构建错误。
一旦我设置了正确的组,我开始注意到application.xml
正在构建,即使我指定这<generateApplicationXml>
是错误的。我意识到这发生在generate-application-xml
目标中,显然默认值<configuration>
是针对ear
目标的。因此,我必须分别指定<execution>
目标generate-application-xml
和ear
目标。
好玩,好玩,好玩。
除了一个小问题外,我已经生成了耳朵,尽管我已经将模块信息配置为做一些不同的事情,但无论如何都会下载耳朵中的依赖项。这是我pom.xml
的耳朵:
<project>
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.vegicorp.foo</groupId>
<artifactId>foo-parent</artifactId>
<version>1.0.0</version>
</parent>
<groupId>com.vegicorp.foo</groupId>
<artifactId>foo-app</artifactId>
<packaging>ear</packaging>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-ear-plugin</artifactId>
<version>2.10.1</version>
<executions>
<execution>
<id>skip-application-xml-generation</id>
<phase>package</phase>
<goals>
<goal>generate-application-xml</goal>
</goals>
<configuration>
<generateApplicationXml>false</generateApplicationXml>
</configuration>
</execution>
<execution>
<id>create-ear</id>
<phase>package</phase>
<goals>
<goal>ear</goal>
</goals>
<configuration>
<artifactTypeMappings>
<artifactTypeMapping type="jboss-sar" mapping="sar"/>
</artifactTypeMappings>
<modules>
<jarModule>
<groupId>${project.groupId}</groupId>
<artifactId>foo-jar</artifactId>
<unpack>true</unpack>
<uri>FooJar.jar</uri>
</jarModule>
<sarModule>
<groupId>${project.groupId}</groupId>
<artifactId>foo-sar</artifactId>
<unpack>true</unpack>
<uri>Foo.sar</uri>
</sarModule>
</modules>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>foo-sar</artifactId>
<version>${project.version}</version>
<type>sar</type>
<exclusions>
<exclusion>
<groupId>*</groupId>
<artifactId>*</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>foo-jar</artifactId>
<version>${project.version}</version>
<exclusions>
<exclusion>
<groupId>*</groupId>
<artifactId>*</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
</project>
这是正在生成的耳朵:
$ ls -l foo-app/target/foo-app-1.0.0
drwxr-xr-x 3 david staff 102 Jan 17 11:21 Foo.jar
drwxr-xr-x 137 david staff 4658 Jan 17 11:21 Foo.sar
drwxr-xr-x 4 david staff 136 Jan 17 11:21 META-INF
-rw-r--r-- 1 david staff 3905 Jan 17 11:21 foo-1.0.0.jar
-rw-r--r-- 1 david staff 50104182 Jan 17 11:21 foo-sar-1.0.0.sar
如何配置我的 Ear 以防止foo-1.0.0.jar
和foo-sar-1.0.0.sar
不包含在我的 Ear 中?<module>
我的耳朵部分不<configuration>
应该将我的依赖项映射到我的模块中吗?