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


    升级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

  • 相关阅读:
    01 飞行器设计 —— 一门独立的学科
    HashMap在JDK1.7和JDK1.8中有哪些不同?HashMap的底层实现
    瑞_23种设计模式_中介者模式
    spirngboot项目.mvn/wrapper/maven-wrapper.properties‘ does not exist.
    删除链表的倒数第n个节点的最优算法实现
    Java项目-苍穹外卖-Day10-SpirngTask及WebSocket
    java计算机毕业设计社区物品交易系统源码+系统+数据库+lw文档+mybatis+运行部署
    推荐一款语音识别软件
    Windows下编译Mediapipe,C++版本
    【图像处理】SIFT角点特征提取原理
  • 原文地址:https://blog.csdn.net/qq_43705670/article/details/126950292