Java 无法让maven war插件排除jaxb JAR
我正在尝试使用Maven war插件的功能 这是我的配置:Java 无法让maven war插件排除jaxb JAR,java,maven,jaxb,maven-3,war,Java,Maven,Jaxb,Maven 3,War,我正在尝试使用Maven war插件的功能 这是我的配置: <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-war-plugin</artifactId> <version>2.2</version> &l
<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>
打包在my.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.
也
没有,例外、警告或错误,或者没有任何可疑的东西,我应该寻找什么具体的东西 这意味着您在项目中将它们作为依赖项,以便将它们打包到war中。只需删除依赖项,这样它们就不会被打包了 根据您使用的选项文档,您必须使用regex,这意味着您应该编写:
<packagingExcludes>WEB-INF/lib/jaxb.*</packagingExcludes>
而不是
<packagingExcludes>WEB-INF/lib/jaxb*.jar</packagingExcludes>
这意味着您在项目中将它们作为依赖项,以便将它们打包到war中。只需删除依赖项,这样它们就不会被打包了 根据您使用的选项文档,您必须使用regex,这意味着您应该编写:
<packagingExcludes>WEB-INF/lib/jaxb.*</packagingExcludes>
而不是
<packagingExcludes>WEB-INF/lib/jaxb*.jar</packagingExcludes>
对于可传递依赖项,可以使用Exclutions元素将其排除
<dependency>
<groupId>...</groupId>
<artifactId>...</artifactId>
<version>...</version>
<exclusions>
<exclusion>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api-2.1</artifactId>
</exclusion>
</exclusions>
</dependency>
对于可传递依赖项,可以使用Exclutions元素将其排除
<dependency>
<groupId>...</groupId>
<artifactId>...</artifactId>
<version>...</version>
<exclusions>
<exclusion>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api-2.1</artifactId>
</exclusion>
</exclusions>
</dependency>
关于@gkamal对您的问题08/05的评论/12@11:52,检查maven war插件的版本。我自己刚刚花了2小时研究这个问题,以排除javaeeapi*.jar的未知瞬态 在maven 3.0.4中,我默认使用maven war插件版本2.1,您可以判断是否在调试中运行构建-例如mvn clean package-X。您的另一个评论是正确的,其中一个评论说包排除是在这之后出现的。尽管描述条目的实际页面没有指出版本信息,但这是非常糟糕的,因为这是您第一次搜索的内容 如果将maven war插件更新为2.3 add 2.3,则应使用打包排除。请注意,尽管您只会在构建的war的WEB-INF/lib中看到这一点,但在瞬态war目录中不会看到这一点,该目录包含被排除的JAR,即使debug说它们将被排除,这在查看此问题时非常混乱
<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的最后一搏,而对临时JAR的依赖级别排除可能是最精确和正确的方法。也就是说,如果一个临时jar是由多个依赖项引入的呢
因此,随着版本升级,我认为的解决方案是好的,并且指出它将不起作用的评论是错误的。然而,我认为最佳实践是根据您接受的答案使用依赖级别排除。关于@gkamal对您的问题08/05的评论/12@11:52,检查maven war插件的版本。我自己刚刚花了2小时研究这个问题,以排除javaeeapi*.jar的未知瞬态 在maven 3.0.4中,我默认使用maven war插件版本2.1,您可以判断是否在调试中运行构建-例如mvn clean package-X。您的另一个评论是正确的,其中一个评论说包排除是在这之后出现的。尽管描述条目的实际页面没有指出版本信息,但这是非常糟糕的,因为这是您第一次搜索的内容 如果将maven war插件更新为2.3 add 2.3,则应使用打包排除。请注意,尽管您只会在构建的war的WEB-INF/lib中看到这一点,但在瞬态war目录中不会看到这一点,该目录包含被排除的JAR,即使debug说它们将被排除,这在查看此问题时非常混乱
<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的最后一搏,而对临时JAR的依赖级别排除可能是最精确和正确的方法。也就是说,如果一个临时jar是由多个依赖项引入的呢
因此,随着版本升级,我认为的解决方案是好的,并且指出它将不起作用的评论是错误的。然而,我认为最佳实践是根据您接受的答案使用依赖级别排除。您可以通过指定内部来实现这一点
您也可以通过通配符和正则表达式指定路径。有关详细信息,请参见此部分。您可以通过指定inside来完成此操作
您也可以通过通配符和正则表达式指定路径。有关详细信息,请参见此。使用-X运行它,看看是否可以获得信息-您可以运行war:war。@gkamal我看不到任何异常。您可以尝试使用其中一个JAR的完整路径而不是通配符吗?您使用的插件版本是什么?文档在版本2.1-alpha-1中说明了这一点,这被错误地命名为warSourceExcludes-另一种修复方法是将两个JAR的显式依赖项添加到war项目中,并将范围标记为所提供的。使用-X运行它,看看是否可以获得信息-您可以只运行war:war。@gkamal我看不到任何异常。您可以尝试使用一个JAR的完整路径吗
f JAR而不是通配符?您使用的插件版本是什么?文档中说,在版本2.1-alpha-1中,这被错误地命名为warSourceExcludes-另一种修复方法是将两个JAR的显式依赖项添加到war项目中,并将范围标记为提供的。否。我们没有依赖关系。依赖关系是可传递的,这意味着我们使用的库使用JAXB实现,我们希望使用JDK实现。我确实尝试了WEB-INF/lib/JAXB.*以获得相同的结果。我也不知道文档中说明应该使用正则表达式的地方。语法**/*.xml不是正则表达式,它是文档中的一个示例。。据我所知,这种可传递依赖关系不起作用。您必须添加获取jaxb DEP的依赖项,并在依赖项本身中进行排除。非常感谢,我将尝试一下。如果你有时间的话,请把这个添加到你的答案中好吗?不,我们没有依赖关系。依赖关系是可传递的,这意味着我们使用的库使用JAXB实现,我们希望使用JDK实现。我确实尝试了WEB-INF/lib/JAXB.*以获得相同的结果。我也不知道文档中说明应该使用正则表达式的地方。语法**/*.xml不是正则表达式,它是文档中的一个示例。。据我所知,这种可传递依赖关系不起作用。您必须添加获取jaxb DEP的依赖项,并在依赖项本身中进行排除。非常感谢,我将尝试一下。如果你有时间的话,你能把这个添加到你的答案中吗?接受这个,因为它看起来更清晰,并且有更多的选择,只有个人意见,两个答案在我看来都是正确的。接受这个,因为它看起来更清晰,只有更多的选择,我认为两个答案都是正确的。
<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>