如何排除掉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引入的,而是自身就带有的,这是就无能为力了。如图所示
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/135257.html