这是我们有时会遇到的Maven头痛的蚂蚁之一。几年前,我重新构建了许多这些项目,将Ivy与Ant结合使用,而当我参与其中时,我做了一些修改,以便转移到Maven(如果我们曾经做过)更简单。那个时候到了。
我现在有了构建工作,几乎完全匹配我们的Ant构建,除了,Maven构建包括在Ant构建中排除的类。这是Ant中的构建:
<target name="package" depends="compile,-ivy.retrieve">
<war.macro destfile="${target.dir}/${war.name}" webxml="${main.webinf.dir}/web.xml">
<webinf dir="${main.webinf.dir}"/>
<lib dir="${lib.dir}"/>
<classes dir="${main.destdir}">
<!-- Wait. These weren't here before -->
<exclude name="**/ejb/**" />
<exclude name="**/FooJava.java" />
<exclude name="**/BarJava.java" />
</classes>
</war.macro>
</target>
这两个.java
文件当然什么都不做。但是,它已经在四个版本中采用了这种方式,显然,它并没有对任何事情产生任何影响。但是,**/ejb/**
行似乎是一个问题。
在我的pom.xml
中,我有以下内容:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<configuration>
<!-- None of these three lines work -->
<packagingExcludes>**/ejb/**</packagingExcludes>
<packagingExcludes>WEB-INF/classes/com/vegicorp/foo/bar/ejb/**</packagingExcludes>
<packagingExcludes>${project.build.outputDirectory}/com/vegicorp/foo/bar/ejb/**</packagingExcludes>
</configuration>
</plugin>
</plugins>
</build>
构建工作正常。当我mvn -X
时,我可以看到排除,但这三个类文件仍然被复制。我应简单地将它们从源代码中删除,如果它们没有被使用,但这取决于开发人员要做的事情。我现在要做的就是获得一个匹配的*.war
文件,通过Ant / Ivy版本获得。
根据maven-war-plugin
documentation:
逗号分隔的标记列表,在打包之前从WAR中排除。此选项可用于实现瘦的WAR用例。请注意,您可以使用Java正则表达式引擎使用表达式%regex []包含和排除特定模式。提示:阅读about(?!Pattern)。
那么,我做错了什么?
<plugins>
<plugin>
<artifactId>maven-war-plugin</artifactId>
<version>3.0.0</version>
<executions>
<execution>
<id>default-war</id>
<phase>package</phase>
<goals>
<goal>war</goal>
</goals>
<configuration>
<packagingExcludes>**/ejb/**</packagingExcludes>
<archive>
<manifestSections>
<manifestSection>
<name>Build-Information</name>
<manifestEntries>
<Project-Name>${env.JOB_NAME}</Project-Name>
<Build-Number>${env.BUILD_NUMBER}</Build-Number>
<SVN-Revision>${env.SVN_REVISION}</SVN-Revision>
</manifestEntries>
</manifestSection>
<manifestSection>
<name>Module-Information</name>
<manifestEntries>
<Group-ID>com.vegicorp</Group-ID>
<Artifact-ID>foobar</Artifact-ID>
<Version>6.0</Version>
</manifestEntries>
</manifestSection>
</manifestSections>
</archive>
</configuration>
</execution>
</executions>
<configuration>
<packagingExcludes>**/ejb/**</packagingExcludes>
<archive>
<manifestSections>
<manifestSection>
<name>Build-Information</name>
<manifestEntries>
<Project-Name>${env.JOB_NAME}</Project-Name>
<Build-Number>${env.BUILD_NUMBER}</Build-Number>
<SVN-Revision>${env.SVN_REVISION}</SVN-Revision>
</manifestEntries>
</manifestSection>
<manifestSection>
<name>Module-Information</name>
<manifestEntries>
<Group-ID>com.vegicorp</Group-ID>
<Artifact-ID>foobar</Artifact-ID>
<Version>6.0</Version>
</manifestEntries>
</manifestSection>
</manifestSections>
</archive>
</configuration>
</plugin>
这只显示了我使用的三个<packagingExcludes>
中的一个。我也尝试了另外两个。
答案 0 :(得分:1)
您必须指定插件的版本2.1.1:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>2.1.1</version>
<configuration>
<packagingExcludes>**/ejb/**</packagingExcludes>
<packagingExcludes>WEB-INF/classes/com/vegicorp/foo/bar/ejb/**</packagingExcludes>
<packagingExcludes>${project.build.outputDirectory}/com/vegicorp/foo/bar/ejb/**</packagingExcludes>
</configuration>
</plugin>
<强>更新强>
the last version is 3.0.0