记一次JDK版本升级带来的问题

917 阅读6分钟

我正在参加「掘金·启航计划」

起因

事情是这样的,我呢在GitHub上维护了一个组件库,就是把平时用到的一些功能封装了一下子,然后上传到Maven的中央仓库,方便我之后的开发

这天也是很正常的发布了一个包,然后用这个组件库项目测试了一下能够把依赖拉下来(这个项目中有一个Sample模块方便我自己做一些测试)

我就把这个依赖复制到另一个业务项目中,然后神奇的事情就发生了,这个项目竟然拉不到这个包!

猜想 & 尝试

一个依赖在一个项目中能拉下来而另一个项目中却拉不下来

当时我的第一反应:肯定是见鬼了

我立马打开Maven仓库的搜索页面,确认了上面已经有我这个包的信息了

所以并不是这个依赖的问题或是还没发布的问题,毕竟我的组件库项目也已经成功把依赖拉下来了

那这会不会是IDEA的问题?或是Gradle的问题?

于是我尝试了以下一系列的操作

  1. 删除Gradle缓存的依赖重新拉一遍(pom文件拉下来了但是jar没有)
  2. 删除.idea等项目文件并重新打开为新项目
  3. 修改Gradle的版本和组件库项目一致
  4. 清除IDEA的缓存并重启

然而问题还是没有解决

其实pom文件能拉下来是不是就说明已经在仓库中找到了?

我又在另一台电脑上clone项目编译,发现也不行!

难道是这个项目的问题?天选之项目?

这个时候我基本上排除了是IDEAGradle的问题

本地依赖

但是当时实在是想不到什么原因,就打算直接依赖本地的文件吧

新建了一个libs文件,然后直接把包扔里面,这下终于依赖到了

接着我就开始开发功能。。。

2000yearslater.jpg

这时我完成了一个小功能打算运行看看有没有问题,却报了一个错

类文件具有错误的版本 55.0, 应为 52.0

请删除该文件或确保该文件位于正确的类路径子目录中

而这个报错的文件信息就是我那个包中的一个类

突然,我的脑子中有一些东西串联了起来

oh.jpg

原因

我的组件库项目用的是JDK11,而我的业务项目用的JDK8,难道说 ,是这个原因才导致依赖拉不下来?

而我测试的项目是组件库项目中的模块,也是JDK11,所以才没有问题!

不过还是要验证一下才能确定是不是这个原因

我把我的业务项目也设置成了JDK11,然后这个依赖。。。

拉下来了

下来了

来了

Ohhhhhhhhhhhhhhhhhhh!

太不容易了,我都快哭出来了

这里大家可能要说,JDK8不兼容JDK11不是基本常识吗,低版本运行高版本的代码肯定不行啊

确实,如果直接给出这个问题当然能意识到,但是同一个依赖一个项目能拉下来另一个项目拉不下来的这个问题真没往这块想

Gradle下载依赖的时候就会判断JDK的版本这一点也确实不知道,我还以为能下载下来只是运行的时候才报错

为什么会用JDK11

这里先阐述一下背景:为何要用JDK11

本来我JDK8用的好好的

有一天心血来潮,想要开发一个IDEA的插件玩玩

IDEA的插件最低就要JDK11JDK8只能开发很早版本的插件)

为了方便统一管理,我的组件项目是一个项目包含多个模块,每个模块是一个单独的组件,因为每个都分开的话,组件一多管理起来就很麻烦

所以为了兼容IDEA插件这个13就统一升级到了JDK11,完全没有往编译出来的包不兼容JDK8的方面想

解决方案

这里大家可能会有疑问,既然项目是多模块的,那么是不是可以给每个模块单独设置JDK的版本呢

我之前也是这样想的,毕竟从IDEA的页面上看确实可以给每个模块单独设置

  • 方案一

插件模块单独设置JDK11(包括配置sourceCompatibilitytargetCompatibility11

其他模块继承项目配置JDK8(包括配置sourceCompatibilitytargetCompatibility1.8

结果: 插件模块会提示最低需要JDK11,也就是说必须是项目的JDK要设置成11,单独设置模块也是不行的

  • 方案二

统一设置成JDK11(包括配置sourceCompatibilitytargetCompatibility11

单独设置一部分模块为JDK8(包括配置sourceCompatibilitytargetCompatibility1.8

结果: 单独配置JDK8的模块编译出来的文件还是JDK11的版本,也就是说在模块中配置JDK改变不了编译的版本

从上述2个结果来看,好像只有项目中配置的JDK版本有效,而子模块和sourceCompatibilitytargetCompatibility都没有效果

但我觉得也有很大可能还是我项目的配置问题,所以如果有比较了解的大佬希望可以指点一二

  • 方案三

单独设置模块不行,就只能统一JDK版本了,要么就都升JDK11,要么就都降JDK8

如果统一升到JDK11,那么发布的依赖就不适配JDK8了,由于我们现在基本还都停留在JDK8的版本,就会导致很多项目无法使用

所以就必须统一降到JDK8

那么就会出现最初的问题,由于插件开发的那几个模块而导致项目编译失败(JDK最低版本需要11

最后只能先不编译插件的模块(在settings.gradle去掉),等到需要开发插件的时候再加上,同时设置项目的JDK版本为11,等开发完成再去掉插件的模块并将项目的JDK版本设置回来,稍微麻烦一点多一步手动切换

结束

要不大家为了让我方便一点都升一下JDK版本吧(手动狗头),毕竟Spring Boot 3.0都要JDK17了,大家升了之后,我就可以统一升到JDK11不用手动切换了,嘿嘿

最后,如果大家有兴趣的话可以看看我的 组件库 orz