使用relocation解决包冲突导致的java.lang.LinkageError: loader constraint violation

自行编译jar后报错,看网上类似问题都是jar冲突,解决一般就是删除冲突的jar包

java.lang.LinkageError: loader constraint violation: loader (instance of sun/misc/Launcher$AppClassLoader) previously initiated loading for a different type with name “org/apache/thrift/transport/TTransport”
at java.lang.ClassLoader.defineClass1(Native Method) ~[?:1.8.0_281]
at java.lang.ClassLoader.defineClass(ClassLoader.java:756) ~[?:1.8.0_281]
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142) ~[?:1.8.0_281]
at java.net.URLClassLoader.defineClass(URLClassLoader.java:468) ~[?:1.8.0_281]
at java.net.URLClassLoader.access$100(URLClassLoader.java:74) ~[?:1.8.0_281]
at java.net.URLClassLoader$1.run(URLClassLoader.java:369) ~[?:1.8.0_281]
at java.net.URLClassLoader 1. r u n ( U R L C l a s s L o a d e r . j a v a : 363 )   [ ? : 1.8. 0 2 81 ] a t j a v a . s e c u r i t y . A c c e s s C o n t r o l l e r . d o P r i v i l e g e d ( N a t i v e M e t h o d )   [ ? : 1.8. 0 2 81 ] a t j a v a . n e t . U R L C l a s s L o a d e r . f i n d C l a s s ( U R L C l a s s L o a d e r . j a v a : 362 )   [ ? : 1.8. 0 2 81 ] a t j a v a . l a n g . C l a s s L o a d e r . l o a d C l a s s ( C l a s s L o a d e r . j a v a : 418 )   [ ? : 1.8. 0 2 81 ] a t s u n . m i s c . L a u n c h e r 1.run(URLClassLoader.java:363) ~[?:1.8.0_281] at java.security.AccessController.doPrivileged(Native Method) ~[?:1.8.0_281] at java.net.URLClassLoader.findClass(URLClassLoader.java:362) ~[?:1.8.0_281] at java.lang.ClassLoader.loadClass(ClassLoader.java:418) ~[?:1.8.0_281] at sun.misc.Launcher 1.run(URLClassLoader.java:363) [?:1.8.0281]atjava.security.AccessController.doPrivileged(NativeMethod) [?:1.8.0281]atjava.net.URLClassLoader.findClass(URLClassLoader.java:362) [?:1.8.0281]atjava.lang.ClassLoader.loadClass(ClassLoader.java:418) [?:1.8.0281]atsun.misc.LauncherAppClassLoader.loadClass(Launcher.java:355) ~[?:1.8.0_281]
at java.lang.ClassLoader.loadClass(ClassLoader.java:351) ~[?:1.8.0_281]
at org.apache.hive.jdbc.HiveConnection.createUnderlyingTransport(HiveConnection.java:519)

对比正常版本和这次编译的版本发现pom.xml缺少了relocations相关内容。百度了下原来这个relocations就是解决包冲突的,maven-shade-plugin的relocations是将制定目录的class移动到一个新的目录下面,这样包不同就是不同的class,从而避免冲突。

<relocation>
	<!-- 源包名 -->
    <pattern>原来的包名</pattern>
    <!-- 目的包名 -->
    <shadedPattern>新的包名</shadedPattern>
</relocation>

java.lang.LinkageError这个异常看网上分析原因是同一个限定名的class类被多个不同的ClassLoader加载后,相互交叉使用导致的类冲突的情况。
同一个限定名的class在不同的classLoader中属于不同的 Class实例,而JVM在加载某一个类时,需要加载所有import进入的Class,这种情况下,如果自定义的classLoader中存在与parentClassLoader需要加载相同限定名的Class时,就会抛出java.Lang.LinkageError.
参考:
https://blog.csdn.net/penriver/article/details/120286005
https://blog.csdn.net/ifenggege/article/details/108327167
https://www.jianshu.com/p/a3ed849610ad
https://blog.csdn.net/DeepNightTwo/article/details/1438844
https://blog.csdn.net/sdjadycsdn/article/details/90111059

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值