Unrecognized option: --add-opens

Unable to make field private static final long java.lang.Number.serialVersionUID accessible错误

我的项目是基于java17的,在运行的过程中报了以上的错误,我添加了--add-opens=java.base/java.lang=ALL-UNNAMED参数,在本地idea上可以正常运行,但是我使用docker-compose把它部署到服务器时,启动报错Unrecognized option: --add-opens java.base/java.lang=ALL-UNNAMED

img

以下答案由GPT-4.0Plus大模型与博主A努力中.......共同编写:
这是一个由于Java版本更新导致的兼容性问题。Java 9之后引入了模块系统,需要显式指定模块间的开放关系。而之前的代码中使用了--add-opens选项来开放不兼容的模块间访问,在Java 9+中则不再支持,因而报出Unrecognized option: --add-opens的错误。
要解决这个错误,我们有两种方法:

  1. 升级Java版本,使用模块化开发
    Java 9开始支持Jigsaw模块系统,我们应采用模块化开发的方式,在module-info.java中显式指定模块间的开放关系。
  2. 降级使用Java 8
    如果我们的代码难以迁移到模块化结构,可以降级至Java 8使用。Java 8及之前的版本仍然支持--add-opens选项。
  3. 临时禁用模块系统
    对于Java 9+,我们也可以临时禁用模块系统,将代码编译为兼容Java 8的格式。这可以通过以下编码实现:
java
// Java 9+
import java.lang.module.AddOpens;

// 禁用模块系统 
@AddOpens({ 
    "java.base/java.io" 
}) 
public class MyCode { 
// ... 
}

@AddOpens注解添加到代码中,可以临时禁用模块系统并恢复--add-opens的使用,解决编译错误。
但是,这只是一个临时性解决方案,我们仍然建议尽量采用模块化开发的方式,适配Java 9+的新特性。