一次maven构建类冲突解决方法论【重要】
1 启动时提示:
javax.ws.rs.core.Application
类下有个函数找不到
2
idea ctrl+shift+n,Classes,Include non-project files
javax.ws.rs.core.Application
导致打出来的包全限定名类冲突:
jsr311-api 1.1.1这个jar包下的这个类有问题
3
mvn dependency:tree
maven dependengcy:tree 查看maven依赖树
查到是以下这个依赖间接依赖了jsr311-api 1.1.1
<dependency> <groupId>com.sun.jersey</groupId> <artifactId>jersey-client</artifactId> <version>1.19</version> </dependency>
完整的依赖链为: war——f(shade)——jersey-client——jsr311-api
4
https://mvnrepository.com/artifact/javax.ws.rs/jsr311-api/1.1.1
<dependency> <groupId>com.sun.jersey</groupId> <artifactId>jersey-client</artifactId> <exclusions> <exclusion> <groupId>javax.ws.rs</groupId> <artifactId>javax.ws.rs-api</artifactId> </exclusion> <exclusion> <groupId>javax.ws.rs</groupId> <artifactId>jsr311-api</artifactId> </exclusion> </exclusions> <version>1.19</version> </dependency>
done
需注意:f这个项目用shade插件打包,故war中是永远不会有jsr311-api这个包的,引起冲突的类被封装在f中了
2020.4.8补充:
exclusion可作用于多级依赖,比如A依赖B,B依赖C,我们要干掉C,在可在A的pom dependency中exclusion
2020.10.18补充:
这种war种jar包冲突,出现于groupid不一样,类名(全限定)却一样的情况a,因为同样的groupid,不同的version,只会有一个打进war包(至于把哪个打入包,取决于dependency :tree的层级)
这也是为什么大多数问题仍然出现在编译期而不是运行期(导致大乱),情况a毕竟少数
2021.1.14补充:
O
A
C1
B
C2
最终取C1进包,经验证,层级优先、pom中顺序优先
2021.6.8 补充
2年后碰到冲突,又是这个类
idea里面调出类如果找不到所有冲突 的类,就maven-reimport一下