从 Ant 迁移到 Maven:如何设置 EAR 项目?
Moving From Ant to Maven: How do I setup an EAR Project?
我们有一个相当复杂的项目,过去是用 Ant 构建的,但现在我们正在转向 Maven。
- 有一个核心罐子和依赖于核心罐子的各种过滤罐子。
- 这些 jar 与其他依赖的 jar 和一些 XML 文件一起组装成一个
SAR
。我在下面称之为 foo-sar
。
- 构建了另一个 JAR,但是这个 JAR 不包含任何 Java 代码,只有一些应用程序 xml 文件。我在下面称之为
foo-jar
。
foo-jar
和 foo-sar
被打包到一个 EAR 中,在 META-INF
目录中找到一个 application.xml
文件。
我有一个包含三个子项目的 Maven 项目:
foo-jar
foo-sar
foo-ear
foo-jar
和 foo-sar
都构建得很好。但是,当构建 foo-ear
时,它会使用 application.xml
文件构建 ear,但其中没有 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
项目构建没有错误,但它不包含 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
而不是 maven-ear-plugin
的 org.apache.maven.plugins
。我不知道为什么 Maven 之前没有检测到这个错误并在之前给我构建错误。
设置 correct 组后,我开始注意到正在构建 application.xml
,即使我指定 <generateApplicationXml>
为 false。我意识到这是在 generate-application-xml
目标中发生的,显然默认的 <configuration>
是针对 ear
目标的。因此,我必须分别为 generate-application-xml
目标和 ear
目标指定 <execution>
。
有趣,有趣,有趣。
我已经得到了 ear 来生成 除了一个小问题 ,即使我已经配置了我的模块信息来做一些事情,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 中?我的耳朵 <configuration>
的 <module>
部分不应该将我的依赖项映射到我的模块中吗?
我找到了解决办法。可能有更好的解决方案,但这是我发现有效的方法。这是一个大而笨重的杂物。请随时让我知道我错了多少,以及正确应该这样做的方式。
正如 arghtype
指出的那样,我需要将这些模块添加到我的依赖项中。这样做有效。但是,我发现它还包括我所有的依赖项,并将它们也下载到我的 Ear 中。考虑到我包含的模块之一是一个 SAR,它包含大量的 jar 依赖项,这很愚蠢。
为了消除依赖,我最初在依赖描述中尝试了<exclusions>
,但并没有消除添加的jar和sar。我最后做的是在我的 pom.xml
中放置一个 <scope>provided</scope>
以防止下载这些内容。
这可行,但必须有更好的方法:
<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>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>foo-jar</artifactId>
<version>${project.version}</version>
<scope>provided</scope>
</dependency>
</dependencies>
</project>
我们有一个相当复杂的项目,过去是用 Ant 构建的,但现在我们正在转向 Maven。
- 有一个核心罐子和依赖于核心罐子的各种过滤罐子。
- 这些 jar 与其他依赖的 jar 和一些 XML 文件一起组装成一个
SAR
。我在下面称之为foo-sar
。 - 构建了另一个 JAR,但是这个 JAR 不包含任何 Java 代码,只有一些应用程序 xml 文件。我在下面称之为
foo-jar
。 foo-jar
和foo-sar
被打包到一个 EAR 中,在META-INF
目录中找到一个application.xml
文件。
我有一个包含三个子项目的 Maven 项目:
foo-jar
foo-sar
foo-ear
foo-jar
和 foo-sar
都构建得很好。但是,当构建 foo-ear
时,它会使用 application.xml
文件构建 ear,但其中没有 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
项目构建没有错误,但它不包含 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
而不是 maven-ear-plugin
的 org.apache.maven.plugins
。我不知道为什么 Maven 之前没有检测到这个错误并在之前给我构建错误。
设置 correct 组后,我开始注意到正在构建 application.xml
,即使我指定 <generateApplicationXml>
为 false。我意识到这是在 generate-application-xml
目标中发生的,显然默认的 <configuration>
是针对 ear
目标的。因此,我必须分别为 generate-application-xml
目标和 ear
目标指定 <execution>
。
有趣,有趣,有趣。
我已经得到了 ear 来生成 除了一个小问题 ,即使我已经配置了我的模块信息来做一些事情,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 中?我的耳朵 <configuration>
的 <module>
部分不应该将我的依赖项映射到我的模块中吗?
我找到了解决办法。可能有更好的解决方案,但这是我发现有效的方法。这是一个大而笨重的杂物。请随时让我知道我错了多少,以及正确应该这样做的方式。
正如 arghtype
指出的那样,我需要将这些模块添加到我的依赖项中。这样做有效。但是,我发现它还包括我所有的依赖项,并将它们也下载到我的 Ear 中。考虑到我包含的模块之一是一个 SAR,它包含大量的 jar 依赖项,这很愚蠢。
为了消除依赖,我最初在依赖描述中尝试了<exclusions>
,但并没有消除添加的jar和sar。我最后做的是在我的 pom.xml
中放置一个 <scope>provided</scope>
以防止下载这些内容。
这可行,但必须有更好的方法:
<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>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>foo-jar</artifactId>
<version>${project.version}</version>
<scope>provided</scope>
</dependency>
</dependencies>
</project>