news 2026/9/23 5:23:20

JDK升级指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
JDK升级指南

一 JDK升级工具-EMT4J

1.1 工具介绍

EMT4J is a project that aims to simplify the Java version migration. At the moment, this project focuses on three LTS (i.e. Long-Term-Support) versions: 8, 11, 17 and 21. Therefore, if you want to migrate your application running on JDK 8/11/17 to JDK 11/17/21, then this project is for you.

EMT4J supports statically checking application artifacts including the project's classes and dependencies. It also supports running as a Java agent to perform runtime checking. During the checking process, EMT4J collects compatibility problems and outputs a report finally. It currently supports HTML, TEXT, and JSON formats. Users transform the project according to the report and finally complete the migration of the Java version.

Support for Java 21 and Autofix are introduced by version 0.9 which has not been released yet. If you want to use these two features, you need to manually install EMT4J to your local Maven repository.

1.2 工具使用

项目引入maven plugin

<build>

<plugins>

<plugin>

<groupId>org.eclipse.emt4j</groupId>

<artifactId>emt4j-maven-plugin</artifactId>

<version>0.8.0</version>

<executions>

<execution>

<phase>process-test-classes</phase>

<goals>

<goal>check</goal>

</goals>

</execution>

</executions>

<configuration>

<fromVersion>8</fromVersion>

<toVersion>11</toVersion>

<outputFile>report.html</outputFile>

</configuration>

</plugin>

</plugins>

</build>

执行命令

mvn process-test-classes

1.3 EMT4J报告

优先级

含义

风险程度

建议处理方式

P1

高优先级

极可能导致应用启动失败或运行时崩溃(如ClassNotFoundException、调用已删除方法)

必须修复,否则升级后大概率无法运行

P2

中优先级

可能导致功能异常或类加载问题

(如 ContextClassLoader 错误、反射失效)

建议修复,尤其在复杂应用(Spring Boot、Web 容器)中容易出问题

P3

低优先级

可能影响非核心功能,或仅在特定场景下有问题

可暂缓,上线前评估是否影响业务

P4

提示/信息级

通常是代码规范、内部 API 使用警告,不一定导致错误

可选修复,用于长期维护和合规

二 基于EMT4J报告JDK8升级21

2.1 构建新插件

官网提示

Support for Java 21 and Autofix are introduced by version 0.9 which has not been released yet. If you want to use these two features, you need to manually install EMT4J to your local Maven repository.

2.2 EMT4J报告问题修复案例

风险描述

测试用例

import com.xiaoleilu.hutool.lang.JarClassLoader;

import java.io.File;

public class TestJarClassLoader {

public static void main(String[] args) {

// 尝试实例化 JarClassLoader —— 这会触发对 system classloader 的 cast

try {

JarClassLoader.loadJarToSystemClassLoader(new File("test.jar"));

System.out.println("Load success!");

} catch (Exception e) {

e.printStackTrace();

}

}

}

执行结果

javac -cp "hutool-all-3.3.2.jar" TestJarClassLoader.java

java -cp ".:hutool-all-3.3.2.jar" TestJarClassLoader

java.lang.ClassCastException: class jdk.internal.loader.ClassLoaders$AppClassLoader cannot be cast to class java.net.URLClassLoader (jdk.internal.loader.ClassLoaders$AppClassLoader and java.net.URLClassLoader are in module java.base of loader 'bootstrap')

at com.xiaoleilu.hutool.lang.JarClassLoader.loadJarToSystemClassLoader(JarClassLoader.java:71)

at TestJarClassLoader.main(TestJarClassLoader.java:6)

升级建议

升级hutool版本

三 附录-Maven插件介绍

3.1 什么是插件

在 Maven 中,插件分为两种类型:构建插件(build plugins) 和 报告插件(reporting plugins)。

构建插件:在项目构建过程中执行,配置在 <build/> 元素中,用途是编译、测试、打包、部署等构建任务

报告插件:在站点(site)生成过程中执行,配置在 <reporting/> 元素中,用途是生成项目文档、代码质量报告、依赖分析等

3.2 Build插件配置

Build插件Mojo开发

Build插件maven配置

3.3 Hello world Build插件

@Mojo(name = "hello")
public class HelloWorldMojo extends AbstractMojo {
@Parameter(property = "msg", defaultValue = "false")
private String msg;

@Override
public void execute() throws MojoExecutionException, MojoFailureException {
System.out.println("hello " + msg);
}
}

那么如何集成呢?欢迎评论区留下maven集成配置

四 常见问题

4.1 mvn配置问题

[ERROR] Please make sure you define the required toolchains in your ~/.m2/toolchains.xml file.

[ERROR] jdk [ version='8' ] [ERROR] Please make sure you define the required

解决方案

~/.m2/toolchains.xml

<?xml version="1.0" encoding="UTF-8"?>

<toolchains>

<!-- JDK toolchains -->

<toolchain>

<type>jdk</type>

<provides>

<version>8</version>

<vendor>openjdk</vendor>

</provides>

<configuration>

<jdkHome>/data/opt/jdk1.8.0_191</jdkHome>

</configuration>

</toolchain>

</toolchains>

五 参考链接

https://github.com/adoptium/emt4j

https://maven.apache.org/guides/mini/guide-configuring-plugins.html#Configuring_Build_Plugins

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/22 23:45:15

自动化营销有哪些方式,国内外有哪些自动化营销工具?

在数字化营销普及的今天&#xff0c;自动化营销已成为企业降低成本、提升效率的核心手段。数据显示&#xff0c;采用自动化营销的企业线索转化率平均提升45%&#xff0c;营销人力成本降低50%以上。但多数企业面临“方式零散、工具适配差”的问题&#xff0c;难以形成全链路闭环…

作者头像 李华
网站建设 2026/9/21 21:34:47

Cursor快捷键大全:效率翻倍的隐藏技巧

用了半年Cursor&#xff0c;我发现自己以前写代码的方式太原始了。直到有一天&#xff0c;我看到同事的手指在键盘上飞舞&#xff0c;几乎不用碰鼠标就完成了我需要半分钟的操作&#xff0c;才意识到掌握快捷键有多重要。今天我就把自己整理的Cursor快捷键秘籍分享出来&#xf…

作者头像 李华
网站建设 2026/9/23 0:27:29

【项目实战】md 是标准纯文本标记语言,mdx 是其扩展格式(融合 JSX/组件能力)

md(Markdown)和 mdx(MDX)是两种关联但定位不同的文件格式,核心区别在于「语法支持范围」「功能上限」和「使用场景」——md 是标准纯文本标记语言,mdx 是其扩展格式(融合 JSX/组件能力),以下是详细对比: 一、核心定义与本质区别 维度 .md 文件(Markdown) .mdx 文件…

作者头像 李华
网站建设 2026/9/23 5:30:58

2、网络指南:印刷版与在线版的选择及网络知识介绍

网络指南:印刷版与在线版的选择及网络知识介绍 一、印刷版与在线版的情况 在1993年秋天,有人提议在O’Reilly & Associates出版相关网络指南书籍。最终达成协议,O’Reilly将制作该网络指南的官方印刷版,而原作者保留版权以便书籍资源能自由分发。这意味着读者有两种选…

作者头像 李华
网站建设 2026/9/23 6:31:09

Kotaemon如何处理歧义问题?上下文消解策略解析

Kotaemon如何处理歧义问题&#xff1f;上下文消解策略解析 在真实的对话场景中&#xff0c;用户很少会用完整、规范的句子提问。更多时候&#xff0c;他们的表达是碎片化的&#xff1a;“它多少钱&#xff1f;”“上次那个呢&#xff1f;”“比之前便宜吗&#xff1f;”——这些…

作者头像 李华
网站建设 2026/9/22 17:47:15

6、网络配置与管理全解析

网络配置与管理全解析 1. 路由选择机制 当IP实现搜索到目标的最佳路由时,可能会找到多个匹配目标地址的路由条目。例如,默认路由能匹配所有目标,但发往本地连接网络的数据报也会匹配其本地路由。那么IP如何确定使用哪条路由呢?这就体现了子网掩码的重要性。当两条路由都匹…

作者头像 李华