Java应用升级JDK或依赖库可能遇到的兼容性问题

说明

在升级JDK,或Java依赖库版本时,有可能会遇到兼容性问题,相关异常及提示信息如下

异常信息

汇总后的异常

java.lang.IllegalAccessError
java.lang.IncompatibleClassChangeError
java.lang.NoClassDefFoundError
java.lang.NoSuchFieldError
java.lang.NoSuchMethodError

被调用类不存在

  • jdk_8

java.lang.NoClassDefFoundError: test/compatibility/CompatibilityCallee1

  • jdk_17

java.lang.NoClassDefFoundError: test/compatibility/CompatibilityCallee1

  • jdk_21

java.lang.NoClassDefFoundError: test/compatibility/CompatibilityCallee1

被调用方法不存在(方法被删除、方法名称变化、方法参数数量或类型变化)

  • jdk_8

java.lang.NoSuchMethodError: test.compatibility.CompatibilityCallee2.staticMethod1()V

  • jdk_17

java.lang.NoSuchMethodError: ‘void test.compatibility.CompatibilityCallee2.staticMethod1()’

  • jdk_21

java.lang.NoSuchMethodError: ‘void test.compatibility.CompatibilityCallee2.staticMethod1()’

被调用方法由public变成private

  • jdk_8

java.lang.NoSuchMethodError: test.compatibility.CompatibilityCallee2.runtimePrivateStaticMethod1()V

  • jdk_17

java.lang.NoSuchMethodError: ‘void test.compatibility.CompatibilityCallee2.runtimePrivateStaticMethod1()’

  • jdk_21

java.lang.NoSuchMethodError: ‘void test.compatibility.CompatibilityCallee2.runtimePrivateStaticMethod1()’

被调用方法由protected变成private

  • jdk_8

java.lang.NoSuchMethodError: test.compatibility.CompatibilityCallee3.runtimePrivateStaticMethod1()V

  • jdk_17

java.lang.NoSuchMethodError: ‘void test.compatibility.CompatibilityCallee3.runtimePrivateStaticMethod1()’

  • jdk_21

java.lang.NoSuchMethodError: ‘void test.compatibility.CompatibilityCallee3.runtimePrivateStaticMethod1()’

被调用方法由非静态变成静态

  • jdk_8

java.lang.IncompatibleClassChangeError: Expecting non-static method test.compatibility.CompatibilityCallee2.runtimeNonStaticToStaticMethod1()V

  • jdk_17

java.lang.IncompatibleClassChangeError: Expecting non-static method ‘void test.compatibility.CompatibilityCallee2.runtimeNonStaticToStaticMethod1()’

  • jdk_21

java.lang.IncompatibleClassChangeError: Expecting non-static method ‘void test.compatibility.CompatibilityCallee2.runtimeNonStaticToStaticMethod1()’

被调用方法由静态变成非静态

  • jdk_8

java.lang.IncompatibleClassChangeError: Expected static method test.compatibility.CompatibilityCallee2.runtimeStaticToNonStaticMethod1()V

  • jdk_17

java.lang.IncompatibleClassChangeError: Expected static method ‘void test.compatibility.CompatibilityCallee2.runtimeStaticToNonStaticMethod1()’

  • jdk_21

java.lang.IncompatibleClassChangeError: Expected static method ‘void test.compatibility.CompatibilityCallee2.runtimeStaticToNonStaticMethod1()’

被调用方法返回类型改变

  • jdk_8

java.lang.NoSuchMethodError: test.compatibility.CompatibilityCallee2.runtimeChangeReturnTypeMethod1()Ljava/lang/String;

  • jdk_17

java.lang.NoSuchMethodError: ‘java.lang.String test.compatibility.CompatibilityCallee2.runtimeChangeReturnTypeMethod1()’

  • jdk_21

java.lang.NoSuchMethodError: ‘java.lang.String test.compatibility.CompatibilityCallee2.runtimeChangeReturnTypeMethod1()’

使用的字段不存在(字段被删除、字段名称变化)

  • jdk_8

java.lang.NoSuchFieldError: STATIC_FIELD1

  • jdk_17

java.lang.NoSuchFieldError: STATIC_FIELD1

  • jdk_21

java.lang.NoSuchFieldError: Class test.compatibility.CompatibilityCallee2 does not have member field ‘java.lang.Object STATIC_FIELD1’

使用的字段由public变成private

  • jdk_8

java.lang.IllegalAccessError: tried to access field test.compatibility.CompatibilityCallee2.RUNTIME_PRIVATE_STATIC_FIELD1 from class test.compatibility.CompatibilityCaller

  • jdk_17

java.lang.IllegalAccessError: class test.compatibility.CompatibilityCaller tried to access private field test.compatibility.CompatibilityCallee2.RUNTIME_PRIVATE_STATIC_FIELD1 (test.compatibility.CompatibilityCaller and test.compatibility.CompatibilityCallee2 are in unnamed module of loader ‘app’)

  • jdk_21

java.lang.IllegalAccessError: class test.compatibility.CompatibilityCaller tried to access private field test.compatibility.CompatibilityCallee2.RUNTIME_PRIVATE_STATIC_FIELD1 (test.compatibility.CompatibilityCaller and test.compatibility.CompatibilityCallee2 are in unnamed module of loader ‘app’)

使用的字段由非静态变成静态

  • jdk_8

java.lang.IncompatibleClassChangeError: Expected non-static field test.compatibility.CompatibilityCallee2.runtimeStaticField1

  • jdk_17

java.lang.IncompatibleClassChangeError: Expected non-static field test.compatibility.CompatibilityCallee2.runtimeStaticField1

  • jdk_21

java.lang.IncompatibleClassChangeError: Expected non-static field test.compatibility.CompatibilityCallee2.runtimeStaticField1

使用的字段由静态变成非静态

  • jdk_8

java.lang.IncompatibleClassChangeError: Expected static field test.compatibility.CompatibilityCallee2.RUNTIME_NON_STATIC_FIELD1

  • jdk_17

java.lang.IncompatibleClassChangeError: Expected static field test.compatibility.CompatibilityCallee2.RUNTIME_NON_STATIC_FIELD1

  • jdk_21

java.lang.IncompatibleClassChangeError: Expected static field test.compatibility.CompatibilityCallee2.RUNTIME_NON_STATIC_FIELD1

使用的字段由protected变成private

  • jdk_8

java.lang.IllegalAccessError: tried to access field test.compatibility.CompatibilityCallee3.RUNTIME_PRIVATE_STATIC_FIELD1 from class test.compatibility.CompatibilityCaller

  • jdk_17

java.lang.IllegalAccessError: class test.compatibility.CompatibilityCaller tried to access private field test.compatibility.CompatibilityCallee3.RUNTIME_PRIVATE_STATIC_FIELD1 (test.compatibility.CompatibilityCaller and test.compatibility.CompatibilityCallee3 are in unnamed module of loader ‘app’)

  • jdk_21

java.lang.IllegalAccessError: class test.compatibility.CompatibilityCaller tried to access private field test.compatibility.CompatibilityCallee3.RUNTIME_PRIVATE_STATIC_FIELD1 (test.compatibility.CompatibilityCaller and test.compatibility.CompatibilityCallee3 are in unnamed module of loader ‘app’)

使用的字段类型改变

  • jdk_8

java.lang.NoSuchFieldError: runtimeChangeTypeField1

  • jdk_17

java.lang.NoSuchFieldError: runtimeChangeTypeField1

  • jdk_21

java.lang.NoSuchFieldError: Class test.compatibility.CompatibilityCallee2 does not have member field ‘java.lang.Object runtimeChangeTypeField1’

使用的枚举常量值找不到

  • jdk_8

java.lang.NoSuchFieldError: ENUM_1

  • jdk_17

java.lang.NoSuchFieldError: ENUM_1

  • jdk_21

java.lang.NoSuchFieldError: Class test.compatibility.CompatibilityEnum1 does not have member field ‘test.compatibility.CompatibilityEnum1 ENUM_1’

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值