升级Java17问题记录整理
1、编译器支持
Maven支持Java11的的最低版本是3.5.4(该版本以后可以不用升级)
编译插件支持,设置完成后刷新Idea,会自动将当前项目设置成JDK11
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>11</source>
<target>11</target>
</configuration>
</plugin>
2、 依赖升级
2.1 Lombok报错
Lombok annotation handler class lombok.javac.handlers.HandleData failed on G
class lombok.javac.apt.LombokProcessor (in unnamed module @0x37790024) canno
Illegal reflective access by lombok.javac.apt.LombokProcessor to field com.sun.tools.javac.processing.JavacProcessingEnvironment.discoveredProcs
原因
使用的Lombok版本和jdk版本不兼容。
大多数人遇到的问题是使用的lombok版本过低,在jdk11以上环境下运行错误。
解决
解决办法有两个
升级Lombok到1.18.0或以上
修改idea的版本到jdk8,可以运行大多数版本的lombok。
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.14</version>
<scope>provided</scope>
</dependency>
还有需要注意看下lombok 是不是Enable 打开了
2.2 额外依赖的的jar包
Java11中将一些包从标准JDK中移除,不引用可能会导致项目报错,
@Resource 注解支持:
<dependency>
<groupId>javax.annotation</groupId>
<artifactId>javax.annotation-api</artifactId>
<version>1.3.1</version>
</dependency>
jaxb支持:
JDK9以后的版本,模块化的概念去除了JAXB(默认没有加载),需做接入声明。
<!-- jdk11 jaxb模块引用 start -->
<dependency>
<groupId>org.glassfish.jaxb</groupId>
<artifactId>jaxb-runtime</artifactId>
<version>2.3.2</version>
</dependency>
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
</dependency>
<dependency>
<groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-impl</artifactId>
<version>2.3.0</version>
</dependency>
<dependency>
<groupId>org.glassfish.jaxb</groupId>
<artifactId>jaxb-runtime</artifactId>
<version>2.3.0</version>
</dependency>
<dependency>
<groupId>javax.activation</groupId>
<artifactId>activation</artifactId>
<version>1.1.1</version>
</dependency>
<!-- jdk11 jaxb模块引用 end -->
2.3 Jacoco支持:
升级到最新版本,最低要求0.8.0
如果是用mavan plugin方式引入,修改pom.xml文件:
<plugin>
<dependency>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<version>0.8.6</version>
</dependency>
</plugin>
如果是javaagent方式引入,从官网下载最新的包:https://www.eclemma.org/jacoco/
这里下载的是0.8.6.zip,解压开使用里面的/lib/jacocoagent.jar文件即可,JVM参数:
-javaagent:${WORK_PATH}/jacocoagent.jar=output=tcpserver,port=6300,address=*"
3、JVM日志参数
java11中将很多日志参数去掉了,比如以下日志参数失效:
GC_LOG=“-XX:+PrintGCDetails -XX:+PrintGCDateStamps
-XX:+PrintGCTimeStamps -XX:+PrintAdaptiveSizePolicy
-XX:+PrintGCApplicationStoppedTime -XX:+PrintHeapAtGC -XX:+PrintStringTableStatistics -XX:+PrintTenuringDistribution -Xloggc:$LOG_PATH/gc.log -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=30 -XX:GCLogFileSize=50M”
新的jvm参数:
GC_LOG=“-Xlog:gc:$LOG_PATH/gc.log”
4、 模块化(Jigsaw)报错
错误日志:
module java.base does not “opens java.lang” to unnamed module @1941a8ff
错误原因是在Java9中引入了模块化功能:The State of the Module System,常见的库比如(Spring、Hibernate、JAXB)大量用到包扫描和反射,所以常出现此错误。一个粗暴的解决办法是将没开放的module强制对外开放,即保持和Java9之前的版本一致。
开放模块有以下两种模式:
- –add-exports 该包将被导出,这意味着在编译和运行时可以访问其中的所有公共类型和成员。
- –add-opens 包被打开,这意味着所有类型和成员(不仅仅是公共成员!)都可以在运行时访问。
如果使用的代码中使用了诸如setAccessible(true)的方法,就选择 --add-exports。想了解更多请参考:What’s the difference between --add-exports and --add-opens in Java 9?
针对这个错误,Java命令行添加以下命令:
–add-opens java.base/java.lang=ALL-UNNAMED
改完后的效果类似这样:
java --add-opens java.base/java.lang=ALL-UNNAMED -jar demo.jar