1

我正在尝试使用<packagingExcludes>Maven 战争插件。

这是我的配置:

          <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

4 回答 4

3

这意味着您将它们作为项目中的依赖项,因此它们将被打包到战争中。只需删除依赖项,这样它们就不会被打包了。

根据您使用的选项的文档,您必须使用正则表达式,这意味着您应该编写:

<packagingExcludes>WEB-INF/lib/jaxb.*</packagingExcludes>

代替

<packagingExcludes>WEB-INF/lib/jaxb*.jar</packagingExcludes>
于 2012-05-08T09:01:53.807 回答
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 插件也允许基于正则表达式进行排除,但语法涉及更多,以下代码段应排除lib文件名以“jaxb”开​​头的所有内容:

<packagingExcludes>%regex[WEB-INF/lib/jaxb.*]</packagingExcludes>
于 2012-05-10T11:54:04.917 回答
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在此之后进来。有关详细信息,请参阅战争插件页面 (尽管描述条目的实际页面并未指示版本信息,因为这是您首先搜索的内容,所以版本信息很差)。

如果您将 maven-war-plugin 更新到 2.3(添加<version>2.3</version>packaging-excludes应该使用您的。请注意,尽管您只会在构建的战争的 WEB-INF/lib 中看到这个,而不是在瞬态战争目录中(其中包括排除的 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 被多个依赖项引入怎么办?

所以,随着版本升级,我认为@khmarbaise的解决方案很好(并且表明它不起作用的评论是错误的)。但是,我认为最佳做法是根据您接受的答案使用依赖级别排除项。

于 2013-06-21T11:04:37.517 回答
1

您可以通过指定 inside <packagingExcludes></packagingExcludes>inside来做到这一点</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>

您也可以通过通配符正则表达式指定路径。有关更多信息,请参阅此链接

于 2018-03-09T09:55:09.953 回答