如何排除maven war插件生成的jar?

时间:2009-06-23 10:12:40

标签: java maven-2

由于传递依赖性,我的战争将由xml-apis,xerces jars填充。 我尝试按照maven-war-plugin的参考页面上的说明进行操作,但它无效。

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-war-plugin</artifactId>
    <configuration>
      <packagingExcludes>WEB-INF/lib/xalan-2.6.0.jar,WEB-INF/lib/xercesImpl-2.6.2.jar,WEB-INF/lib/xml-apis-1.0.b2.jar,WEB-INF/lib/xmlParserAPIs-2.6.2.jar</packagingExcludes>
      <webXml>${basedir}/src/main/webapp/WEB-INF/web.xml</webXml>
      <warName>project1</warName>
      <warSourceDirectory>src/main/webapp</warSourceDirectory>
    </configuration>
</plugin>

我做错了什么? 如果重要的话,我发现我正在使用的maven-war-plugin版本为2.1-alpha-1

9 个答案:

答案 0 :(得分:66)

您可以按照提供的标记这些依赖项:

<dependency>
  <groupId>xerces</groupId>
  <artifactId>xerces</artifactId>
  <version>2.4.0</version>
  <scope>provided</scope>
</dependency>

这样maven会将它们添加到编译类路径中,但不会打包它们。假设它们存在于您的servlet容器中。

在“范围”

下查看有关maven范围here的更多信息

修改 如果要删除通过传递依赖项添加的类,可以将它们从依赖项中排除,如下所示:

<dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring</artifactId>
        <version>2.5.6</version>
        <exclusions>
                <exclusion>
                        <groupId>commons-logging</groupId>
                        <artifactId>commons-logging</artifactId>
                </exclusion>
        </exclusions>
</dependency>

(摘自this answer

查看更多here

答案 1 :(得分:5)

我修好了。

稍微重读一下参考文献,我发现元素 packagingExcludes 应该是 warSourceExcludes

答案 2 :(得分:5)

关于传递依赖性的排除,我认为不适用于传递性依赖的转换,我认为情况可能就是这样。

例如,添加hibernate-core的依赖关系 - &gt; dom4j - &gt; xml-apis如果在hibernate-core附近添加xml-apis的排除,仍然添加xml-apis ......

答案 3 :(得分:3)

我无法修改依赖war文件。我需要从lib中避免一些旧的jar文件。这段POM.xml配置对我来说很有用。我使用Maven 2.2。

<build>
    <plugins>
        <!-- put aside some unwanted jars from war...-->
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-war-plugin</artifactId>
            <version>2.1.1</version>
            <configuration>
                <overlays>
                    <overlay>
                        <groupId>com.company.app</groupId>
                        <artifactId>web_app</artifactId>
                        <excludes>
                            <exclude>WEB-INF/lib/json-lib-2.2.2-jdk13.jar</exclude>                                
                        </excludes>
                    </overlay>
                </overlays>
            </configuration>
        </plugin>
        ....

答案 4 :(得分:2)

要添加一些说明,您绝对可以排除传递依赖项。例如,如果您对A具有本地依赖关系,而该关联依赖于M,而M又依赖于X,那么您可以在指定A依赖关系的位置排除X.

例如,假设你依赖于'myPackageA',它取决于依赖于Xerces的Rampart,那么你可以在myPackageA依赖项中排除Xerces:

 <groupId>myPackageA.dependsOnRampart.whichDependsOnXerces</groupId>
 <artifactId>someArtifact</artifactId>
 <version>2.1</version>
 <exclusions>
   <exclusion>
     <groupId>org.apache.xerces</groupId>
     <artifactId>xmlParserAPIs</artifactId>
   </exclusion>
   <exclusion>
     <groupId>org.apache.xerces</groupId>
     <artifactId>xml-apis</artifactId>
   </exclusion>
   <exclusion>
     <groupId>org.apache.xerces</groupId>
     <artifactId>xercesImpl</artifactId>
   </exclusion>
   <exclusion>
     <groupId>org.apache.xerces</groupId>
     <artifactId>resolver</artifactId>
   </exclusion>
   <exclusion>
     <groupId>org.apache.xerces</groupId>
     <artifactId>serializer</artifactId>
   </exclusion>
 </exclusions>

要在之后检查您的依赖项,请运行'mvn dependency:tree',希望您不会看到任何xerces依赖项。

答案 5 :(得分:2)

正确的解决方案是使用<packagingExcludes>配置,因为<scope>provided</scope>解决方案是黑客。

请考虑以下多模块项目:

        A
      (war)
      /   \
     B     C
   (jar) (jar)
    /     /
   D     /
 (jar)  /
 / | \ /
e  f  g

在这个多模块项目中,模块A需要模块{BCD},而不是 {{{ 1}},ef}。但是,模块gB do 需要{De f},而g需要{ C}。


首先,让我们尝试使用g方法解决此问题:

要从<scope>provided</scope>中排除{efg},A规范必须存在于<scope>provided</scope>的POM中。但是,等等,D需要{Bef}。因此,要解决此问题,{gef}的依赖项声明也必须出现在g的POM中(使用B) 。这意味着必须将<scope>provided</scope>中的依赖关系规范复杂度拉入D中。同样,由于B依赖于{C},因此{g}的依赖项声明必须出现在g的POM中。

使用C解决方案,模块<scope>provided</scope>BC必须都知道D不能拥有{{{ 1}},Ae}。

这种方法违反了封装原理,在具有复杂依赖关系图的多模块项目中不可行。


第二,让我们尝试使用f方法解决此问题:

要从g中排除{<packagingExcludes>ef},必须在g的POM中提供以下内容:

A

使用此解决方案,“ A中必须排除的内容”的复杂性仅包含在<plugin> <artifactId>maven-war-plugin</artifactId> <configuration> <packagingExcludes>a*.jar,b*.jar,c*.jar</packagingExcludes> </configuration> </plugin> 的POM中。这使模块AAB不必为了C而不必考虑传递依赖。

此解决方案秉承封装原则。

答案 6 :(得分:1)

请参阅我的回答herepackaging-excludes条目仅适用于maven-war-plugin版本2.1-alpha-1 and above。因此,您可能需要升级使用的版本,或者您可能更喜欢使用依赖项级别注入,因为它更精确地排除了特定的jar。

答案 7 :(得分:0)

使用提供的范围编译maven 3(我使用3.0.2)时,你遇到了传递依赖的问题(你在WAR中有一个JAR的失败)。 如果您使用旧版本的maven(我使用的是2.2.1),那么WAR包含的内容(只有提供的依赖

答案 8 :(得分: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>

您也可以通过 外卡 正则表达式 进行指定。有关详细信息,请参阅documentation