一次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一下

原文地址:https://www.cnblogs.com/silyvin/p/11942306.html