Java_CV猿 2023-05-19 10:59 采纳率: 66.7%
浏览 140

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

  • 写回答

1条回答 默认 最新

  • 技术宅program 2023-05-19 12:58
    关注

    以下答案由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+的新特性。

    评论

报告相同问题?

问题事件

  • 创建了问题 5月19日