由于传递依赖性,我的战争将由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
答案 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
需要模块{B
,C
,D
},而不是 {{{ 1}},e
,f
}。但是,模块g
和B
do 需要{D
,e
f
},而g
需要{ C
}。
首先,让我们尝试使用g
方法解决此问题:
要从<scope>provided</scope>
中排除{e
,f
,g
},A
规范必须存在于<scope>provided</scope>
的POM中。但是,等等,D
需要{B
,e
,f
}。因此,要解决此问题,{g
,e
,f
}的依赖项声明也必须出现在g
的POM中(使用B
) 。这意味着必须将<scope>provided</scope>
中的依赖关系规范复杂度拉入D
中。同样,由于B
依赖于{C
},因此{g
}的依赖项声明必须出现在g
的POM中。
使用C
解决方案,模块<scope>provided</scope>
,B
和C
必须都知道D
不能拥有{{{ 1}},A
,e
}。
这种方法违反了封装原理,在具有复杂依赖关系图的多模块项目中不可行。
第二,让我们尝试使用f
方法解决此问题:
要从g
中排除{<packagingExcludes>
,e
,f
},必须在g
的POM中提供以下内容:
A
使用此解决方案,“ A
中必须排除的内容”的复杂性仅包含在<plugin>
<artifactId>maven-war-plugin</artifactId>
<configuration>
<packagingExcludes>a*.jar,b*.jar,c*.jar</packagingExcludes>
</configuration>
</plugin>
的POM中。这使模块A
,A
和B
不必为了C
而不必考虑传递依赖。
此解决方案秉承封装原则。
答案 6 :(得分:1)
请参阅我的回答here。 packaging-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。