Java 8升级Java 17过程记录

本文涉及的产品
云原生大数据计算服务 MaxCompute,5000CU*H 100GB 3个月
云原生大数据计算服务MaxCompute,500CU*H 100GB 3个月
简介: Java 8升级到Java高版本,网上有不少教程。但在实际的开发过程中还是会遇到一些不常见的问题。这时候就需要我们发回问题定位和搜索、分析能力了。跟以往的环境问题一样,都不是很难,但问题千奇百怪,感兴趣的话可以继续深入探究,看到底是什么原因导致了这些问题。

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

相关实践学习
基于MaxCompute的热门话题分析
本实验围绕社交用户发布的文章做了详尽的分析,通过分析能得到用户群体年龄分布,性别分布,地理位置分布,以及热门话题的热度。
SaaS 模式云数据仓库必修课
本课程由阿里云开发者社区和阿里云大数据团队共同出品,是SaaS模式云原生数据仓库领导者MaxCompute核心课程。本课程由阿里云资深产品和技术专家们从概念到方法,从场景到实践,体系化的将阿里巴巴飞天大数据平台10多年的经过验证的方法与实践深入浅出的讲给开发者们。帮助大数据开发者快速了解并掌握SaaS模式的云原生的数据仓库,助力开发者学习了解先进的技术栈,并能在实际业务中敏捷的进行大数据分析,赋能企业业务。 通过本课程可以了解SaaS模式云原生数据仓库领导者MaxCompute核心功能及典型适用场景,可应用MaxCompute实现数仓搭建,快速进行大数据分析。适合大数据工程师、大数据分析师 大量数据需要处理、存储和管理,需要搭建数据仓库?学它! 没有足够人员和经验来运维大数据平台,不想自建IDC买机器,需要免运维的大数据平台?会SQL就等于会大数据?学它! 想知道大数据用得对不对,想用更少的钱得到持续演进的数仓能力?获得极致弹性的计算资源和更好的性能,以及持续保护数据安全的生产环境?学它! 想要获得灵活的分析能力,快速洞察数据规律特征?想要兼得数据湖的灵活性与数据仓库的成长性?学它! 出品人:阿里云大数据产品及研发团队专家 产品 MaxCompute 官网 https://www.aliyun.com/product/odps&nbsp;
相关文章
|
1月前
|
编解码 Oracle Java
java9到java17的新特性学习--github新项目
本文宣布了一个名为"JavaLearnNote"的新GitHub项目,该项目旨在帮助Java开发者深入理解和掌握从Java 9到Java 17的每个版本的关键新特性,并通过实战演示、社区支持和持续更新来促进学习。
77 3
|
3月前
|
Java
【思维导图】JAVA网络编程思维升级:URL与URLConnection的逻辑梳理,助你一臂之力!
【思维导图】JAVA网络编程思维升级:URL与URLConnection的逻辑梳理,助你一臂之力!
56 1
|
18天前
|
SQL Java OLAP
java实现“数据平滑升级”
java实现“数据平滑升级”
36 2
|
20天前
|
SQL Java OLAP
java实现“数据平滑升级”
java实现“数据平滑升级”
10 0
|
1月前
|
Java 编译器 API
从Java 8到Java 17,这些新特性让你的代码起飞!
【10月更文挑战第10天】在软件开发领域,Java作为一种历史悠久且广泛使用的编程语言,不断进化以适应新的需求和挑战。从Java 8到Java 17,每一次版本更新都带来了诸多新特性和改进,极大地提升了开发效率和代码质量。今天,我们就来一起探讨这些新特性,看看它们是如何让我们的代码“起飞”的。
129 0
|
2月前
|
Oracle Java 关系型数据库
【颠覆性升级】JDK 22:超级构造器与区域锁,重塑Java编程的两大基石!
【9月更文挑战第6天】JDK 22的发布标志着Java编程语言在性能和灵活性方面迈出了重要的一步。超级构造器和区域锁这两大基石的引入,不仅简化了代码设计,提高了开发效率,还优化了垃圾收集器的性能,降低了应用延迟。这些改进不仅展示了Oracle在Java生态系统中的持续改进和创新精神,也为广大Java开发者提供了更多的可能性和便利。我们有理由相信,在未来的Java编程中,这些新特性将发挥越来越重要的作用,推动Java技术不断向前发展。
|
3月前
|
设计模式 算法 Java
【揭秘】如何巧妙运用Java模板方法模式,让你的代码优雅升级?
【8月更文挑战第30天】模板方法模式是一种行为型设计模式,它定义了算法的骨架并将某些步骤延迟到子类中,使子类能在不改变算法结构的情况下重定义特定步骤。此模式适用于具有共同结构但细节不同的场景,如角色升级系统。通过定义一个抽象类 `Character` 包含模板方法 `levelUp` 和抽象步骤方法,子类如 `Warrior` 和 `Mage` 可以实现具体逻辑。这种方式提供了良好的扩展性,确保算法结构不变,同时保持系统的稳定性和一致性,在数据处理和业务流程管理中广泛应用。
56 2
|
10天前
|
安全 Java 测试技术
Java并行流陷阱:为什么指定线程池可能是个坏主意
本文探讨了Java并行流的使用陷阱,尤其是指定线程池的问题。文章分析了并行流的设计思想,指出了指定线程池的弊端,并提供了使用CompletableFuture等替代方案。同时,介绍了Parallel Collector库在处理阻塞任务时的优势和特点。
|
6天前
|
安全 Java 开发者
深入解读JAVA多线程:wait()、notify()、notifyAll()的奥秘
在Java多线程编程中,`wait()`、`notify()`和`notifyAll()`方法是实现线程间通信和同步的关键机制。这些方法定义在`java.lang.Object`类中,每个Java对象都可以作为线程间通信的媒介。本文将详细解析这三个方法的使用方法和最佳实践,帮助开发者更高效地进行多线程编程。 示例代码展示了如何在同步方法中使用这些方法,确保线程安全和高效的通信。
25 9
|
9天前
|
存储 安全 Java
Java多线程编程的艺术:从基础到实践####
本文深入探讨了Java多线程编程的核心概念、应用场景及其实现方式,旨在帮助开发者理解并掌握多线程编程的基本技能。文章首先概述了多线程的重要性和常见挑战,随后详细介绍了Java中创建和管理线程的两种主要方式:继承Thread类与实现Runnable接口。通过实例代码,本文展示了如何正确启动、运行及同步线程,以及如何处理线程间的通信与协作问题。最后,文章总结了多线程编程的最佳实践,为读者在实际项目中应用多线程技术提供了宝贵的参考。 ####