• 使用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>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    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

  • 相关阅读:
    【CVPR 2018】PIXOR: 点云中三维目标的实时检测
    逗号分隔的字符串笔记
    Nacos简介
    矩阵快速幂
    11. 使用 HTTP PUT, PATCH 以及 MERGE 请求消费 SAP ABAP OData 服务修改操作的实现及其区别
    KY95 Old Bill
    新书推荐:人-机器人交互导论
    LeetCode 34. 在排序数组中查找元素的第一个和最后一个位置
    【HMS Core】【SDK集成】如何解决集成华为分析SDK带来的隐私政策合规检测异常的问题
    Jmeter 多实例压测
  • 原文地址:https://blog.csdn.net/shy_snow/article/details/125421451