openjdk替换java_OpenJDK8升级到OpenJDK11需要注意的修改与异常

本文介绍了从OpenJDK8升级到OpenJDK11过程中可能遇到的问题,包括Java模块化带来的API移除与替换、Lombok编译异常、过时的JVM调优参数及日志参数变化,以及非法反射访问的异常处理。针对这些问题,文章提供了相应的解决策略和依赖更新建议。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目前,JDK两个长期版本是8和11,由于大部分项目使用的还是8,所以从8升级到11会遇到一些困难。

本篇文章会基于实践遇到的问题,分类总结可能

1. Java模块化

从Java 9开始,由于引入了JPMS(https://openjdk.java.net/projects/jigsaw/spec/),开始更精细化的包管理和模块复用,导致很多JDK默认加载的包被移除了。

其中我们可能会碰到的例如:

EJB的XML工具JAXB相关的类,假设位于com.x.XMLUtils:

private static void getXmlFromObject(Book book) throws JAXBException {

Marshaller marshallerObj = JAXBContext.newInstance(Book.class).createMarshaller();

marshallerObj.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);

StringWriter sw = new StringWriter();

marshallerObj.marshal(book, sw);

}

sun.misc.BASE64Encoder,假设项目中位于com.x.EncodeUtil:

String encodedString = new BASE64Encoder().encode(inputString.getBytes());

通过JAVA 9 以后自带的工具jdeps,查看解决方法:

jdeps target\APP.jar

com.x.ReflectionUtils -> com.sun.crypto.provider JDK internal API (java.base)

com.x.XMLUtils -> javax.xml.bind java.xml.bind

com.x.EncodeUtil -> sun.misc JDK internal API (JDK removed internal API)

deps --jdk-internals target\pre-jpms.jar

...

JDK Internal API Suggested Replacement

---------------- ---------------------

sun.misc.BASE64Encoder Use java.util.Base64 @since 1.8

sun.reflect.Reflection Use java.lang.StackWalker @since 9

可以看出,jdeps这个工具,可以找出过期的APi替换方法,也可以找出缺失的模块。

对于JAXB,通过jdeps命令我们可以知道需要添加java.xml.bind这个模块,通过添加java启动参数--add-modules java.xml.bind即可解决。

但是,这样添加参数,不是长久的办法,还是添加Maven依赖,比较靠谱:

javax.xml.bind

jaxb-api

2.3.1

对于Spring Boot 2.x.x,可以添加依赖:

org.glassfish.jaxb

jaxb-runtime

对于Spring Cloud体系,需要的所有依赖是:

javax.xml.bind

jaxb-api

${jaxb.version}

com.sun.xml.bind

jaxb-impl

${jaxb.version}

org.glassfish.jaxb

jaxb-runtime

${jaxb.version}

com.sun.xml.bind

jaxb-xjc

${jaxb.version}

javax.activation

activation

${activation.version}

2. Lombok编译异常

报错:maven编译报错:java.lang.ExceptionInInitializerError: com.sun.tools.javac.code.TypeTags

这是因为Java 9之后的字节码编译特性变化,需要升级到1.18.+的版本才可以。

3. 过时的JVM调优参数以及日志参数

JDK 8 到JDK 11有很多参数变化,可以总结为两类参数的变化,一是GC相关的(GC配置调优更加简单),二是日志相关的,日志统一到了一起,不像之前那么混乱

具体请参考:

每个说明参考三部分:

Obsolete Java Options: 参数可以被接受但是忽略掉了,但是会有警告,一般这种参数有替代写法,请用替代的写法

Deprecated Java Options: 参数可以被接受并有效,但是会有警告,一般这种参数有替代写法,请用替代的写法

Removed Java Options: 参数被移除,并且使用的话会有报错

4. 对于模块化闭包之后的非法的反射访问报异常

启动的时候可能会报如下异常:

WARNING: An illegal reflective access operation has occurred

WARNING: Illegal reflective access by org.springframework.cglib.core.ReflectUtils$1 (file:/D:/Repositories/maven/org/springframework/spring-core/5.0.13.RELEASE/spring-core-5.0.13.RELEASE.jar) to method java.lang.ClassLoader.defineClass(java.lang.String,byte[],int,int,java.security.ProtectionDomain)

WARNING: Please consider reporting this to the maintainers of org.springframework.cglib.core.ReflectUtils$1

WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations

WARNING: All illegal access operations will be denied in a future release

建议启动的时候加上--illegal-access=warn(其他可选的还有"permit" "warn" "debug" "deny"),这里建议是只报警(WARN),之后留意升级这些相关的依赖,这样避免以后JDK升级禁止这种反射,同时保证目前可用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值