【问题标题】:Can't get the maven-war-plugin to exclude jaxb jars无法让 maven-war-plugin 排除 jaxb jar
【发布时间】:2012-05-08 08:39:23
【问题描述】:

我正在尝试使用 Maven 战争插件的 <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.

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

【问题讨论】:

  • 用 -X 运行它,看看你能不能得到信息 - 你可以运行 war:war。
  • @gkamal 我看不出任何异常。
  • 您可以尝试使用其中一个 jar 的完整路径而不是通配符吗?
  • 您使用的是什么版本的插件?文档说“在 2.1-alpha-1 版本中,这被错误地命名为 warSourceExcludes” - maven.apache.org/plugins/maven-war-plugin/examples/…
  • 解决此问题的另一种方法是将两个 jar 的显式依赖项添加到您的战争项目中,并将范围标记为提供。

标签: java maven jaxb maven-3 war


【解决方案1】:

对于传递依赖,您可以使用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,但语法有点复杂,下面的sn-p应该排除lib下文件名以“jaxb”开​​头的所有内容:

<packagingExcludes>%regex[WEB-INF/lib/jaxb.*]</packagingExcludes>

【讨论】:

  • 接受这一点,因为它看起来更清晰并且有更多选择(仅个人意见,两个答案都是正确的 IMO)。
【解决方案2】:

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

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

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

而不是

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

【讨论】:

  • 没有。我们没有依赖关系。依赖是可传递的,这意味着我们使用的库使用 JAXB 实现,而我们希望使用 JDK 实现。
  • 我确实尝试WEB-INF/lib/jaxb.* 得到相同的结果。
  • 我也看不到文档在哪里声明应该使用正则表达式。语法 **/*.xml 不是正则表达式,是文档中的示例。
  • 啊.. 传递依赖比这不起作用(据我所知)。您必须添加获取 jaxb deps 的依赖项并在依赖项本身中进行排除。
  • 非常感谢,会试试的。如果您有时间,能否将其添加到您的答案中?
【解决方案3】:

除了@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)。您的其他一位 cmets 说 package-excludes 在此之后是正确的。请参阅war plugin page for details(尽管描述该条目的实际页面并未指示版本信息,因为这是您首先搜索的内容,所以版本信息很差)。

如果您将 maven-war-plugin 更新到 2.3(添加 &lt;version&gt;2.3&lt;/version&gt;,则应使用您的 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 的最后一次努力,而临时 jar 的依赖级别排除可能是最精确和正确的方法。也就是说,如果一个瞬态 jar 被多个依赖项引入怎么办?

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

【讨论】:

    【解决方案4】:

    您可以通过在 &lt;packagingExcludes&gt;&lt;/packagingExcludes&gt; 内指定 &lt;/configuration&gt;&lt;configuration&gt; 来做到这一点。

    <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 了解更多信息。

    【讨论】:

      猜你喜欢
      • 2013-07-07
      • 2011-01-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-19
      相关资源
      最近更新 更多