Java jdk 版本过高需要注意的问题(中)Maven依赖方面

1 篇文章 0 订阅

升级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 打开了

在这里插入图片描述

具体详细idea配置可以参考 Java jdk 版本过高需要注意的问题(上)Idea方面

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值