如何修复“无法使受保护的最终 java.lang.Class java.lang.ClassLoader.defineClass?

use*_*483 14 java

我已经使用 java 16 启动了一个项目,但项目中到处都出现错误:

An error has occurred. See error log for more details.
Unable to make protected final java.lang.Class java.lang.ClassLoader.defineClass(java.lang.String,byte[],int,int) throws java.lang.ClassFormatError accessible: module java.base does not "opens java.lang" to unnamed module @6dfcffb5
Run Code Online (Sandbox Code Playgroud)

看来我从不同版本的 java 获得的代码在这个特定版本中不起作用。知道我需要在 pojo 类中更改什么吗?我的应用程序中只有 1 个 pojo,因为它是微服务。

谢谢。

Ste*_*n C 11

您使用的是旧版本的 Spring / Spring Boot,它们与 Java 16 不兼容且不支持。

根据Spring 兼容性矩阵,您将需要使用 Spring 5.3.x 或更高版本来实现 Java 16 兼容性。

对于 Spring-Boot,您需要 2.7.1 或更高版本才能兼容 Java 17...根据此Spring And Spring Boot Versions page。

另请注意,Java 16 也已结束生命。您可能应该使用 Java 的 LTS 版本之一;即 Java 8、11、17、21 ...

(回到早期的 Java LTS 将“修复”Spring 兼容性问题,但在我看来,将 Spring 和 Java 向前滚动会更好。您不想在已经过时的基础上开发新项目


您看到的实际问题是由于某些东西(可能是 Spring Boot 自定义类加载器)访问“内部”API 造成的。从 Java 9 开始,这会导致警告消息,并在 Java 14 及更高版本中被阻止。本问答提供了一些背景信息:

简单且最佳的解决方案是仅使用您所选的 Spring 和 Spring Boot 版本的“受支持”的 Java 版本。


小智 -2

您可以通过以下步骤精确定义 JRE 系统库:项目文件夹 -> 属性 -> Java 构建路径 -> 双击 JRE 系统库并选择您安装的 JRE,它对我有用。抱歉我的英语不好