共计 1819 个字符,预计需要花费 5 分钟才能阅读完成。
引言
简略记录 RocketMq 的 JDK8 以上版本的编译问题,在 RocketMq 的 github – issue 外面探讨还挺多的,这里简略记录一下踩坑。
总得来说是个小问题,然而如同竟然没啥文章介绍过。难道都是 JDK8 去部署 RocketMq 的源码的么?
报错问题
因为 IDEA 缓存的存在,很有可能看到这些内容不是爆红而是失常导入的,此时编译却会诡异般的报错。
- java: 程序包 sun.nio.ch 不存在
- sun.util.locale.BaseLocale.SEP 不存在
Idea 的报错状况
在 Idea 2021.1 的版本中会呈现如下问题,这个报错第一眼看着挺懵逼的:
Idea 2022.1.3 版本就好很多,报错是人话了:
java: package sun.util.locale is not visible
(package sun.util.locale is declared in module java.base, which does not export it)
排查
如果对于 Java9 的模块化有一丁点概念,根本这个问题都能迎刃而解,然而如果像我一样不懂的话,大略会在这个问题上卡上一段时间,并且谷歌也查不出间接关联的状况,不过查相似报错会跟你讲模块化的事件。
思考
要害的灵感来自于上面这篇文章,集体依照文章的思路,先把整个我的项目从 maven 到我的项目整个配置应用的对立 JDK 版本,所以索性全换成 JDK11 尝试。
intellij idea – Error: java: invalid source release 1.9 – Stack Overflow
此外还参阅了文章:(1) java9 迁徙注意事项_集体文章 – SegmentFault 思否,这篇文章中介绍了迁徙到高版本 JDK 之前倡议先到 jdk.1.9 转为模块化之后再往更高版本升级。
但从 IDEA 的默认下载的 JDK 在新版本中只有 9、11 – 17 这几个大版本了,所以就没有尝试了。集体也倡议先到 JDK9 的模块化先弄一遍再去降级。
先把整个 Compiler 我的项目的版本换成 JDK 11,这个页面比拟重要后续还会在用到:
在 RocketMq 的 pom.xml
当中把编译版本改为11。
保险期间,利用 ctrl + shift + F
的快捷键把所有有可能指定的中央全改了。
最初就是我的项目自身的版本了:
这样一通配置之后,发现还是会报同样的错,所以能够确定是模块化的问题,然而问题是我在 编译的时候如何加参数?
这里不再探讨 JDK1.9 的模块化细节(足够新写几篇文章介绍),这里介绍解决办法,介绍 Idea 如何配置编译参数。
Idea 如何增加编译参数?
Setting -> Build, Execution -> Java Compiler
最下方有关键词 compiler paramter:
这里吐槽一下 Idea 的反智操作逻辑:批改完参数之后,你先去别的可输入框先点一下,而后 Aplly 按钮会亮起来通知你有改变过,倡议先确定是否 Apply,先 Apply 再点 OK。否则容易改了参数一个 OK 最初发现 批改有效。
store 子项目编译参数设置为:
--add-exports java.base/sun.nio.ch=ALL-UNNAMED
test 子项目的编译参数设置为:
--add-exports java.base/sun.util.locale=ALL-UNNAMED
退出之后按 IDEA 右上角的小锤子编译一下,这个小问题圆满解决。
小结
长期 JDK8 选手,工作也不不容许用 JDK8 更高的版本,外加内部设施对于高 JDK 版本反对度不够,比方 JDK11 的 Jenkins 就有问题。
实在呼应了 [[How to Upgrade from Java 8 to Java 17]] 外面的原文评论:
- From my experience, the biggest issue is not the code itself, but the surrounding infrastructure(周边设施). For example replacing Jenkins plugins that don’t support Java 11 was painful.
- The biggest issue in my experience migrating java apps from version 8 it’s related with java time precission:
真的只能期待一些四周开源组件强制要求用户应用高版本 JDK 才有可能推动了。
写到最初
不能当 JDK8 忠诚粉丝,还是得 与时俱进,与时俱进….. 见到相熟的揭示界面十分安心。