写点什么

Java 8 升级 Java 17 过程记录

  • 2023-06-08
    北京
  • 本文字数:4883 字

    阅读完需:约 16 分钟

Java 8升级Java 17过程记录

1 背景

Java 程序员应该都熟悉下面这句话:“版本任他发,我用 Java 8”。自从 2014 年 3 月 Java SE 8.0 (1.8.0)发布,到现在已经是第九年,21 年 9 月 Java SE 17(LTS)也已经发布,但绝大部分 Java 开发人员依然使用 1.8 版本。懒惰是其中的一方面原因,生产环境稳定大于一切的压力之下,既然 Java8 已经表现很好没有什么问题,那么也就没有必要冒险去做版本升级了,毕竟“升级”在很多情况下都意味着工作量和风险。

不过在今年之后,这个情况发生了变化。由于厂商纷纷宣布即将停止 1.8 版本的更新维护:Oracle 于 2019 年 1 月停止商用用途中的更新,2020 年 12 月停止非商用版本更新;AdoptOpenJDK 于 2023 年 9 月或之前停止更新;Amazon Corretto 于 2023 年 6 月或之前停止更新。意味着 23 年 9 月之后,将不再有厂商继续更新 Java 8,所以各大公司开始把 Java 版本升级纳入工作项之中,我们也不例外。

2 目标及环境准备

2.1 目标

将现有 Java 8 应用升级到 Java 17;SpringBoot 版本升级到 SpringBoot3.0.0。

2.2 环境安装

推荐的 Java 17 开发环境包括:Java 17、Maven 3.6.3+、Idea 2022.2.1+ 。

2.2.1 Java 17

openjdk https://adoptium.net/zh-CN/temurin/releases/?version=17

在 mac 下,也可以使用 sdkman 来安装 jdk 和 maven。命令行执行下面操作即可。

curl -s "https://get.sdkman.io" | bash
sdk install java 22.3.r17-grlsdk install maven 3.8.2
复制代码

sdk 相关命令可以使用 sdk help 查看。

2.2.2 idea

2.2.2.1 下载

下载地址:https://www.jetbrains.com/idea/download/#section=mac

因为社区版免费使用,所以下载社区版安装就好。这里下载的版本是 ideaIC-2023.1.2。

2.2.2.2 安装

mac 下,ideaIC-2023.1.2-aarch64.dmg 直接双击安装,按照说明完成操作即可。接下来就是启动。

2.3 问题处理

从这里开始,就是本篇的重点了,一个接一个地处理问题。

2.3.1 Idea 启动报错

启动报错信息如下:

Internal error. Please refer to https://jb.gg/ide/critical-startup-errors
com.intellij.diagnostic.PluginException: Fatal error initializing 'com.aliyun.odps.studio.intellij.StudioMain' [Plugin: OdpsStudio] at com.intellij.serviceContainer.ComponentManagerImpl.handleInitComponentError$intellij_platform_serviceContainer(ComponentManagerImpl.kt:612) at com.intellij.serviceContainer.MyComponentAdapter.doCreateInstance(MyComponentAdapter.kt:59) at com.intellij.serviceContainer.BaseComponentAdapter.doCreateInstance(BaseComponentAdapter.kt:154) at com.intellij.serviceContainer.BaseComponentAdapter.createInstance$lambda$1(BaseComponentAdapter.kt:133) at com.intellij.openapi.progress.Cancellation.computeInNonCancelableSection(Cancellation.java:99) at com.intellij.serviceContainer.BaseComponentAdapter.createInstance(BaseComponentAdapter.kt:132) at com.intellij.serviceContainer.BaseComponentAdapter.getInstance(BaseComponentAdapter.kt:92) at com.intellij.serviceContainer.BaseComponentAdapter.getInstance$default(BaseComponentAdapter.kt:77) at com.intellij.serviceContainer.ComponentManagerImpl$createInitOldComponentsTask$1.invoke(ComponentManagerImpl.kt:428) at com.intellij.serviceContainer.ComponentManagerImpl$createInitOldComponentsTask$1.invoke(ComponentManagerImpl.kt:426) at com.intellij.idea.ApplicationLoader$initApplicationImpl$appInitializedListeners$1$1$2$1.invokeSuspend(ApplicationLoader.kt:161) at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33) at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:106) at java.desktop/java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:318) at java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:788) at java.desktop/java.awt.EventQueue$3.run(EventQueue.java:739) at java.desktop/java.awt.EventQueue$3.run(EventQueue.java:731) at java.base/java.security.AccessController.doPrivileged(AccessController.java:399) at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:86) at java.desktop/java.awt.EventQueue.dispatchEvent(EventQueue.java:758) at com.intellij.ide.IdeEventQueue.dispatchEvent(IdeEventQueue.kt:302) at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:207) at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:128) at java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:117) at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:113) at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:105) at java.desktop/java.awt.EventDispatchThread.run(EventDispatchThread.java:92)Caused by: java.lang.NullPointerException: Cannot invoke "org.apache.log4j.Category.getAllAppenders()" because the return value of "org.apache.log4j.Logger.getParent()" is null at com.aliyun.odps.studio.intellij.ide.IntellijLogger.getInstance(IntellijLogger.java:48) at com.aliyun.odps.studio.intellij.ide.IntellijLogger.info(IntellijLogger.java:21) at com.aliyun.odps.studio.component.util.DerbyDBUtil.initOptionPath(DerbyDBUtil.java:23) at com.aliyun.odps.studio.intellij.StudioMain.initComponent(StudioMain.java:93) at com.intellij.serviceContainer.MyComponentAdapter.doCreateInstance(MyComponentAdapter.kt:45) ... 25 more
-----Your JRE: 17.0.6+10-b829.9 aarch64 (JetBrains s.r.o.)/private/var/folders/b_/v0tk6dcs2c13xblcxh_st_p00000gn/T/AppTranslocation/EF791EF1-2D99-4384-BDEF-B42F853CA52C/d/IntelliJ IDEA CE.app/Contents/jbr/Contents/Home
复制代码

关键信息:Fatal error initializing 'com.aliyun.odps.studio.intellij.StudioMain',是一个关于阿里云的插件初始化报错。

根据https://intellij-support.jetbrains.com/hc/en-us/articles/360007568559?page=8 中的 Cause 描述,插件相关的启动失败,基本都是插件包不完整或损坏导致。虽然不清楚为什么新下载的 idea 也会出现插件包损坏的情况,不过既然发生了,我们还是先解决问题。

插件包不可用,那我们尝试删除。首先就要先找到插件的位置了。先通过在应用上右键->显示包内容进入应用文件夹内,翻找 Contents/plugins 下的所有 plugin 列表,结果并没有发现 odps 的相关位置。

除了应用本身,是否还有其他路径下会有呢?通过搜索,找到了/Users/xxx/Library/Application Support/JetBrains/IdeaIC2023.1 这个目录,果然也有 plugins 目录,而且在这里,除了 lombok 的插件 jar 包外,也不出意外地发现了 odps-studio-intellij 插件。 rm -rf odps-studio-intellij 删除后,问题解决。

2.3.2 maven 报错

解决完 Idea 启动的问题,接下来导入了一个 maven 工程尝试在 idea 内编译启动,不过紧接着又报了如下错误:

com.baidu.tog:base:pom:2.1.1 failed to transfer from http://0.0.0.0/ during a previous attempt. This failure was cached in the local repository and resolution is not reattempted until the update interval of maven-default-http-blocker has elapsed or updates are forced. Original error: Could not transfer artifact com.baidu.tog:base:pom:2.1.1 from/to maven-default-http-blocker (http://0.0.0.0/): Blocked mirror for repositories: [baidu-nexus (http://maven.baidu-int.com/nexus/content/groups/public, default, releases), baidu-nexus-snapshot (http://maven.baidu-int.com/nexus/content/groups/public-snapshots, default, disabled), Baidu_Local (http://maven.baidu-int.com/nexus/content/repositories/Baidu_Local, default, releases), Baidu_Local_Snapshots (http://maven.baidu-int.com/nexus/content/repositories/Baidu_Local_Snapshots, default, snapshots)]
Since Maven 3.8.1 http repositories are blocked.
Possible solutions:- Check that Maven settings.xml does not contain http repositories- Check that Maven pom files do not contain http repository http://maven.baidu-int.com/nexus/content/groups/public- Check that Maven pom files do not contain http repository http://maven.baidu-int.com/nexus/content/groups/public-snapshots- Check that Maven pom files do not contain http repository http://maven.baidu-int.com/nexus/content/repositories/Baidu_Local- Check that Maven pom files do not contain http repository http://maven.baidu-int.com/nexus/content/repositories/Baidu_Local_Snapshots- Add a mirror(s) for http://maven.baidu-int.com/nexus/content/groups/public, http://maven.baidu-int.com/nexus/content/groups/public-snapshots, http://maven.baidu-int.com/nexus/content/repositories/Baidu_Local, http://maven.baidu-int.com/nexus/content/repositories/Baidu_Local_Snapshots that allows http url in the Maven settings.xml- Downgrade Maven to version 3.8.1 or earlier in settings
复制代码

通过关键信息:Since Maven 3.8.1 http repositories are blocked 检索文章,找到了下面这篇:https://mazhuang.org/fragment/maven-http-repositories-are-blocked/

有三种解决方法:

  1. 消除自定义的 settings.xml 里的 http repositories;——推荐

  2. 降级到一个 3.8.1 以下版本的 Maven,比如 3.6.3 版本;

  3. 找到 IDEA 自带的 Maven 里的配置文件,注释掉以下内容:

<mirror>   <id>maven-default-http-blocker</id>   <mirrorOf>external:http:*</mirrorOf>   <name>Pseudo repository to mirror external repositories initially using HTTP.</name>   <url>http://0.0.0.0/</url>   <blocked>true</blocked> </mirror>
复制代码

不过在我的实际解决过程中,方法 1 并不符合,因为我自定义的 settings.xml 没有设置 http repositories。所以采用了方法 3。这里又需要注意,不同版本的 idea,以及不同的操作系统下路径都可能不同。我本地是 idea2023,mac 系统,对应的目录在:/Applications/IntelliJ IDEA CE 2023.app/Contents/plugins/maven/lib/maven3/conf/settings.xml,打开后按照上面要求使用 <-- -->注释掉<mirror></mirror>块,解决了这个问题。

不过,问题还在继续。。

2.3.3 pom reload 报错

接下来,在我终于开始在 pom.xml 上执行 maven reload 时,又双叒叕报了如下错误:

好在这次提示依然很清晰,读取 pom.xml 文件报错,之后还有 settings.xml has syntax errors 的错误提示。settings.xml 有语法错误?这里有些奇怪。新下载的 idea,settings.xml 我们只在 2.3.2 步骤中注释了部分代码块,结果又提示了语法错误。可看内容,这已经是一个基本接近于空模板的配置文件了啊。但无可奈何,只好找到厂内一个常用的 settings.xml 内容替换上去,解决了语法错误,终于工程可以正常启动了。

3 总结

Java 8 升级到 Java 高版本,网上有不少教程。但在实际的开发过程中还是会遇到一些不常见的问题。这时候就需要我们发回问题定位和搜索、分析能力了。跟以往的环境问题一样,都不是很难,但问题千奇百怪,感兴趣的话可以继续深入探究,看到底是什么原因导致了这些问题。

发布于: 9 小时前阅读数: 13
用户头像

磨炼中成长,痛苦中前行 2017-10-22 加入

微信公众号【程序员架构进阶】。多年项目实践,架构设计经验。曲折中向前,分享经验和教训

评论

发布
暂无评论
Java 8升级Java 17过程记录_jdk8_程序员架构进阶_InfoQ写作社区