如何在打包WAR时排除依赖包中的指定类库?
解决WAR打包时排除特定传递依赖的问题
嘿,这个场景我太熟悉了!传递依赖里带的servlet包确实会和应用服务器自带的冲突,完全不用把整个mtwilson-client排除掉,咱们可以精准地移除那些惹麻烦的servlet相关依赖,分两步来操作:
1. 从依赖树层面排除目标传递依赖
直接在你的mtwilson-client依赖配置里加上<exclusions>标签,把它引入的servlet类库排除掉。不过要先搞清楚具体的依赖坐标,你可以用mvn dependency:tree命令打印完整的依赖树,找到mtwilson-client下面的servlet相关依赖对应的groupId和artifactId,然后像这样配置:
<dependency> <groupId>com.intel.mtwilson</groupId> <artifactId>mtwilson-client</artifactId> <version>2.0.3</version> <exclusions> <!-- 替换成你实际查到的servlet依赖坐标 --> <exclusion> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> </exclusion> <!-- 如果还有其他相关的servlet包,比如旧版的servlet-api,也一并排除 --> <exclusion> <groupId>javax.servlet</groupId> <artifactId>servlet-api</artifactId> </exclusion> </exclusions> </dependency>
这个方法从依赖引入的源头就把不需要的包排除了,是最根本的解决方式。
2. 用WAR打包插件兜底,确保彻底移除
如果你担心还有遗漏,或者想在打包环节再做一层保障,可以配置maven-war-plugin,直接指定打包时要过滤的JAR包:
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-war-plugin</artifactId> <version>3.3.2</version> <configuration> <packagingExcludes> WEB-INF/lib/javax.servlet-api-*.jar, WEB-INF/lib/servlet-api-*.jar </packagingExcludes> </configuration> </plugin> </plugins> </build>
这样就算有漏网的servlet JAR,也会在打包WAR的时候被过滤掉。
最后提醒下,mvn dependency:tree真的是排查依赖冲突的神器,一定要用它确认所有需要排除的目标依赖,避免白费功夫~
内容的提问来源于stack exchange,提问作者Peeve




