IE盒子

搜索
查看: 78|回复: 2

升级Java17问题记录

[复制链接]

2

主题

7

帖子

11

积分

新手上路

Rank: 1

积分
11
发表于 2022-12-28 13:33:17 | 显示全部楼层 |阅读模式
最新的长期支持版Java17于2021年9月14日如期发布,按照发布规划,JDK/Java 17 属于长期支持版本 (LTS),将会获得 8 年的技术支持,直至 2029 年 9 月。值得一提的是,根据 Oracle 最新推出的「Free Java License」,Oracle JDK 可免费用于生产环境。
Java各版本新特性请查看以下系列文章:Java17的新特性
原文链接,转载请注明出处
1、Lombok报错

错误日志:
class lombok.javac.apt.LombokProcessor (in unnamed module @0x3b968111) cannot access class com.sun.tools.javac.processing.JavacProcessingEnvironment (in module jdk.compiler) because module jdk.compiler does not export com.sun.tools.javac.processing to unnamed module @0x3b968111错误原因没有深入分析,直接升级到最新版本解决:
<dependency>
     <groupId>org.projectlombok</groupId>
     <artifactId>lombok</artifactId>
     <version>1.18.20</version>
     <scope>provided</scope>
</dependency>2、模块化(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.jar3、zookeeper连接报错

错误日志:
org.apache.zookeeper.ClientCnxn - Session 0x0 for server 10.0.*.*/<unresolved>:2181, unexpected error, closing socket connection and attempting reconnect
java.nio.channels.UnresolvedAddressException: null
     at sun.nio.ch.Net.checkAddress(Net.java:149) ~[?:?]
     at sun.nio.ch.Net.checkAddress(Net.java:157) ~[?:?]
     at sun.nio.ch.SocketChannelImpl.checkRemote(SocketChannelImpl.java:816) ~[?:?]
     at sun.nio.ch.SocketChannelImpl.connect(SocketChannelImpl.java:839) ~[?:?]
     at org.apache.zookeeper.ClientCnxnSocketNIO.registerAndConnect(ClientCnxnSocketNIO.java:277) ~[zookeeper-3.4.13.jar:3.4.13-2d71af4dbe22557fda74f9a9b4309b15a7487f03]
     at org.apache.zookeeper.ClientCnxnSocketNIO.connect(ClientCnxnSocketNIO.java:287) ~[zookeeper-3.4.13.jar:3.4.13-2d71af4dbe22557fda74f9a9b4309b15a7487f03]
     at org.apache.zookeeper.ClientCnxn$SendThread.startConnect(ClientCnxn.java:1021) ~[zookeeper-3.4.13.jar:3.4.13-2d71af4dbe22557fda74f9a9b4309b15a7487f03]
     at org.apache.zookeeper.ClientCnxn$SendThread.run(ClientCnxn.java:1064) [zookeeper-3.4.13.jar:3.4.13-2d71af4dbe22557fda74f9a9b4309b15a7487f03]原因分析:
Java15中InetSocketAddressHolder的toString方法有重构:



Java15新代码

下面是之前的版本:



java15之前代码

而在zookeeper的3.4的版本中直接使用 InetSocketAddress的toString()方法,因为Java新版本的hostname中加入/<unresolved>后缀导致创建连接失败。
修复方案是升级zookeeper的jar包为大于等于3.5的版本
<dependency>
     <groupId>org.apache.zookeeper</groupId>
     <artifactId>zookeeper</artifactId>
     <version>3.5.9</version>
     <exclusions>
         <exclusion>
             <groupId>org.slf4j</groupId>
             <artifactId>*</artifactId>
         </exclusion>
         <exclusion>
             <groupId>log4j</groupId>
             <artifactId>*</artifactId>
         </exclusion>
     </exclusions>
</dependency>4、总结

本博客总结了Java11升级到Java17过程中遇到的问题,如果读者现在使用的是Java8,可以参考作者文章:JDK8升级JDK11过程记录,你在升级Java新版本过程中还遇到过什么问题? 欢迎留言讨论。
附录:

Oracle JDK下载链接:https://www.oracle.com/java/technologies/downloads/
OpenJDK下载链接:https://jdk.java.net/17/

本文作者:木小丰,美团Java高级工程师,关注架构、软件工程、全栈等,不定期分享软件研发过程中的实践、思考。欢迎关注公共号:Java研发
回复

使用道具 举报

2

主题

7

帖子

8

积分

新手上路

Rank: 1

积分
8
发表于 2022-12-28 13:34:03 | 显示全部楼层
还有gradle需要升级到7.2以上的版本
回复

使用道具 举报

0

主题

6

帖子

7

积分

新手上路

Rank: 1

积分
7
发表于 2022-12-28 13:34:41 | 显示全部楼层
org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'mainController': Unsatisfied dependency expressed through field 'odrService'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'OrderServiceImpl' defined in file [D:\MyCode\IDEA\CRM-v200213\target\classes\indi\nonoas\crm\service\impl\OrderServiceImpl.class]: Initialization of bean failed; nested exception is org.springframework.aop.framework.AopConfigException: Could not generate CGLIB subclass of class indi.nonoas.crm.service.impl.OrderServiceImpl: Common causes of this problem include using a final class or a non-visible class; nested exception is org.springframework.cglib.core.CodeGenerationException: java.lang.IllegalAccessError-->superinterface check failed: class indi.nonoas.crm.service.impl.OrderServiceImpl$$EnhancerBySpringCGLIB$$776d1e3b (in module CRM) cannot access class org.springframework.aop.framework.Advised (in unnamed module @0x19b6af5f) because module CRM does not read unnamed module @0x19b6af5f
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表