我正在尝试使用Maven war-plugin的<packagingExcludes>
。
这是我的配置:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>2.2</version>
<configuration>
<archive>
<manifestEntries>
<Implementation-Version>${project.artifactId}-${project.version}-r${buildNumber}</Implementation-Version>
<Implementation-Buildtime>${timestamp}</Implementation-Buildtime>
</manifestEntries>
</archive>
<packagingExcludes>WEB-INF/lib/jaxb*.jar</packagingExcludes>
</configuration>
</plugin>
在我理解这一行:
<packagingExcludes>WEB-INF/lib/jaxb*.jar</packagingExcludes>
应该从内置的.war文件中排除以'jaxb'开头的所有jar。
然而,在我运行clean install
后,我得到了两个:
jaxb-api-2.1.jar
jaxb-impl-2.1.3.jar
打包在我的.war WEB-INF / lib目录中。
我正在使用Maven 3。
非常感谢任何帮助。
提前致谢,
回答gkamal的评论。
当我运行mvn war:war -X
时,我可以看到:
[DEBUG] Processing: jaxb-api-2.1.jar
[DEBUG] + WEB-INF/lib/jaxb-api-2.1.jar has been copied.
[DEBUG] Processing: jaxb-impl-2.1.3.jar
[DEBUG] + WEB-INF/lib/jaxb-impl-2.1.3.jar has been copied.
另外
[DEBUG] Excluding [WEB-INF/lib/jaxb*.jar] from the generated webapp archive.
不,异常,警告或错误或任何看起来可疑的东西,我应该寻找什么具体的东西?
答案 0 :(得分:3)
这意味着您将它们作为项目中的依赖项,以便将它们打包到战争中。只需删除依赖项,便不再打包它们。
根据您使用的选项的文档,您必须使用正则表达式,这意味着您应该写:
<packagingExcludes>WEB-INF/lib/jaxb.*</packagingExcludes>
而不是
<packagingExcludes>WEB-INF/lib/jaxb*.jar</packagingExcludes>
答案 1 :(得分:3)
对于传递依赖项,您可以使用exclusions
元素将其排除。
<dependency>
<groupId>...</groupId>
<artifactId>...</artifactId>
<version>...</version>
<exclusions>
<exclusion>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api-2.1</artifactId>
</exclusion>
</exclusions>
</dependency>
如gkamal所述,您还可以在jaxb上添加显式依赖项并将其范围设置为provided
,这将覆盖传递依赖项的范围,因此不再打包它。
另一个替代方案,war插件也允许exclude based on regular expressions,但语法更复杂,下面的代码段应该排除lib
下文件名以“jaxb”开头的所有内容:
<packagingExcludes>%regex[WEB-INF/lib/jaxb.*]</packagingExcludes>
答案 2 :(得分:2)
继@ gkamal对你的问题的评论(08/05/12 @ 11:52),检查你的maven-war-plugin的版本。我花了2个小时自己查看这个问题,将一个未知的瞬态排除在javaee-api * .jar之外。
使用maven 3.0.4,我被默认为maven-war-plugin 2.1版(你可以判断你是否在调试中运行你的构建 - 例如mvn clean package -X
)。您的其他一条评论是正确的,在此之后package-excludes
说出来了。请参阅war plugin page for details(尽管描述该条目的实际页面并未指明版本信息,因为这是您首次搜索的版本信息)。
如果您将maven-war-plugin更新为2.3(添加<version>2.3</version>
,则应使用packaging-excludes
。请注意,虽然您只会在内置战争的WEB-INF / lib中看到此内容,但不会在瞬态战争目录中(包括被排除的jar,即使调试说它们被排除在外,这在查看这个问题时非常混乱)。
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>2.3</version>
...
<packagingExcludes>
WEB-INF/lib/whatever-*.jar,
WEB-INF/lib/javaee-api-*.jar
</packagingExcludes>
...
</plugin>
...
然而,就最佳实践而言,这可能是从战争中排除罐子的最后一次努力,而对于瞬态罐子的依赖性排除可能是最精确和正确的方式。那就是说,如果一个瞬态jar被多个依赖引入呢?
因此,随着版本升级,我认为@khmarbaise的解决方案很好(并且表明它不起作用的注释是错误的)。但是,我认为最佳做法是根据您接受的答案使用依赖级排除。
答案 3 :(得分:0)
您可以通过在<packagingExcludes></packagingExcludes>
内指定</configuration><configuration>
内来完成此操作。
<project>
...
<build>
<plugins>
<plugin>
<artifactId>maven-war-plugin</artifactId>
<version>3.2.0</version>
<configuration>
<packagingExcludes>
WEB-INF/lib/ex1-*.jar,
WEB-INF/lib/ex2-logging-*.jar
</packagingExcludes>
</configuration>
</plugin>
</plugins>
</build>
...
</project>
您也可以通过外卡和正则表达式指定路径。有关详细信息,请参阅此link。