我们有一个相当复杂的项目,用于在Ant中构建,但现在我们正在转向Maven。
SAR
。我在下面打电话给foo-sar
。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
文件。
我在这里错过了一些非常简单的事情。也许这是一个额外的参数,或其他配置。
这是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.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
为false,我也开始注意到<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
如何配置我的耳朵以防止foo-1.0.0.jar
和foo-sar-1.0.0.sar
被收录在我耳中?我的耳朵<module>
的{{1}}部分不应该将我的依赖关系映射到我的模块中吗?
答案 0 :(得分:0)
我找到了解决方案。可能有一个更好的解决方案,但这是我发现的有效。这是一个巨大的,笨重的,kludge。请随时告诉我我的错误以及正确的方式。
正如arghtype
指出的那样,我需要将这些模块添加到我的依赖项中。这样做有用。但是,我发现它还包括我的所有依赖项并将它们下载到我的耳中。考虑到我所包含的一个模块是一个包含其自身大量jar依赖关系的SAR,这真是太愚蠢了。
为了消除依赖关系,我最初在依赖描述中尝试<exclusions>
,但这并没有消除添加的jar和sar。我最后做的是在<scope>provided</scope>
中加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>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>foo-jar</artifactId>
<version>${project.version}</version>
<scope>provided</scope>
</dependency>
</dependencies>
</project>