如何排除掉maven引入的jar包里的某个类

我们知道可以使用 <exclude> 来排除掉引入的jar包所依赖的jar包,但是有时候某个类并不是它引入其他jar而导致的,是这个jar本身的,你如何排除呢? 总不能把自身这个jar去掉吧,因为这个jar的其他类还是有用的。

比如有如下两个GAV

<dependencies>
        <dependency>
            <groupId>com.wyf.test</groupId>
            <artifactId>be-import1</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>com.wyf.test</groupId>
            <artifactId>be-import2</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
    </dependencies>

这是两个不同的GAV,思考一个问题,假MyApi设import1 和 2 中都有相同包名相同类名的类,比如都叫做 com.wyf.test.sameclass.MyApi,两个GAV的实现是不一样的,那究竟哪个生效? 结论是写在前面的生效,比如上面的import1覆盖import2,如果互换位置,import2生效。谁先写谁生效

注意,这种覆盖并不是jar包级别的,而是细到类级别的,比如impot1虽然覆盖了import2,但是仅仅是 import1的com.wyf.test.sameclass.MyApi被 import2中相同包名和相同类名覆盖掉,但是,如果import2有一个其他类,在import1里是没有的,则不会被覆盖。

这是因为java的类加载机制是,加载了这个类后遇到相同的就不会再加载了

利用这种特性,我们可以解决一些难题,比如有个GAV,我们需要覆盖掉某些类,因为这个GAV里那个类并不能通过maven的<exclude> 来排除,我们就在这个GAV之前声明包含这个类的GAV。

注意,对某个GAV 进行 <exclude>,只能排除掉GAV所依赖的GAV,粒度是比较大的。万一你要排除的类,并不是这个GAV引入的,而是自身就带有的,这是就无能为力了。如图所示

在这里插入图片描述

Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐