无法获得maven-war-plugin来排除jaxb jar

时间:2012-05-08 08:39:23

标签: java maven jaxb maven-3 war

我正在尝试使用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.

不,异常,警告或错误或任何看起来可疑的东西,我应该寻找什么具体的东西?

4 个答案:

答案 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