金融机构i废话 2026-01-07 17:54 采纳率: 100%
浏览 3
已结题

执行nacos启动脚本时遇到报错

#在执行nacos启动脚本时遇到报错
#Java版本1.8 maven 3.9 nacos2.5.2
报错信息
WARN Exception encountered during context initialization - cancelling refresh attempt: org.springframework.context.ApplicationContextException: Unable to start web server; nested exception is java.lang.ExceptionInInitializerError

ERROR Startup errors :
org.springframework.context.ApplicationContextException: Unable to start web server; nested exception is java.lang.ExceptionInInitializerError
        at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.onRefresh(ServletWebServerApplicationContext.java:165)
        at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:585)
        at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:147)
        at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:732)
        at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:409)
        at org.springframework.boot.SpringApplication.run(SpringApplication.java:308)
        at org.springframework.boot.SpringApplication.run(SpringApplication.java:1300)
        at org.springframework.boot.SpringApplication.run(SpringApplication.java:1289)
        at com.alibaba.nacos.Nacos.main(Nacos.java:46)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
        at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.base/java.lang.reflect.Method.invoke(Method.java:568)
        at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:49)
        at org.springframework.boot.loader.Launcher.launch(Launcher.java:108)
        at org.springframework.boot.loader.Launcher.launch(Launcher.java:58)
        at org.springframework.boot.loader.PropertiesLauncher.main(PropertiesLauncher.java:467)
Caused by: java.lang.ExceptionInInitializerError: null
        at org.apache.catalina.startup.Tomcat.<clinit>(Tomcat.java:1216)
        at org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory.getWebServer(TomcatServletWebServerFactory.java:194)
        at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.createWebServer(ServletWebServerApplicationContext.java:184)
        at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.onRefresh(ServletWebServerApplicationContext.java:162)
        ... 16 common frames omitted
Caused by: java.lang.reflect.InaccessibleObjectException: Unable to make field static final boolean java.io.FileSystem.useCanonCaches accessible: module java.base does not "opens java.io" to unnamed module @35f983a6
        at java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:354)
        at java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:297)
        at java.base/java.lang.reflect.Field.checkCanSetAccessible(Field.java:178)
        at java.base/java.lang.reflect.Field.setAccessible(Field.java:172)
        at org.apache.tomcat.util.compat.JreCompat.<clinit>(JreCompat.java:131)
        ... 20 common frames omitted
ERROR Application run failed

org.springframework.context.ApplicationContextException: Unable to start web server; nested exception is java.lang.ExceptionInInitializerError
        at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.onRefresh(ServletWebServerApplicationContext.java:165)
        at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:585)
        at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:147)
        at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:732)
        at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:409)
        at org.springframework.boot.SpringApplication.run(SpringApplication.java:308)
        at org.springframework.boot.SpringApplication.run(SpringApplication.java:1300)
        at org.springframework.boot.SpringApplication.run(SpringApplication.java:1289)
        at com.alibaba.nacos.Nacos.main(Nacos.java:46)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
        at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.base/java.lang.reflect.Method.invoke(Method.java:568)
        at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:49)
        at org.springframework.boot.loader.Launcher.launch(Launcher.java:108)
        at org.springframework.boot.loader.Launcher.launch(Launcher.java:58)
        at org.springframework.boot.loader.PropertiesLauncher.main(PropertiesLauncher.java:467)
Caused by: java.lang.ExceptionInInitializerError: null
        at org.apache.catalina.startup.Tomcat.<clinit>(Tomcat.java:1216)
        at org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory.getWebServer(TomcatServletWebServerFactory.java:194)
        at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.createWebServer(ServletWebServerApplicationContext.java:184)
        at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.onRefresh(ServletWebServerApplicationContext.java:162)
        ... 16 common frames omitted
Caused by: java.lang.reflect.InaccessibleObjectException: Unable to make field static final boolean java.io.FileSystem.useCanonCaches accessible: module java.base does not "opens java.io" to unnamed module @35f983a6
        at java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:354)
        at java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:297)
        at java.base/java.lang.reflect.Field.checkCanSetAccessible(Field.java:178)
        at java.base/java.lang.reflect.Field.setAccessible(Field.java:172)
        at org.apache.tomcat.util.compat.JreCompat.<clinit>(JreCompat.java:131)
        ... 20 common frames omitted
  • 写回答

2条回答 默认 最新

  • 檀越@新空间 2026-01-07 17:56
    关注

    下午好🌅🌅🌅
    本答案参考通义千问

    你遇到的错误信息是:

    java.lang.ExceptionInInitializerError: null
    Caused by: java.lang.reflect.InaccessibleObjectException: Unable to make field static final boolean java.io.FileSystem.useCanonCaches accessible: module java.base does not "opens java.io" to unnamed module @35f983a6
    

    问题分析:

    这个错误是由于 Java 17 或更高版本中引入的 模块化系统(JPMS) 所导致的。Nacos 2.5.2 是基于 Spring Boot 2.x 的,而 Spring Boot 2.x 对 Java 17 的兼容性存在一些限制。

    具体来说,Tomcat 在初始化时尝试访问 java.io.FileSystem 中的一个字段 useCanonCaches,但因为 Java 模块系统限制,无法通过反射访问该字段,从而导致 ExceptionInInitializerError


    解决方案:

    1. 使用 Java 8

    如果你能使用 Java 8,这是最简单的解决方法,因为 Nacos 2.5.2 完全兼容 Java 8。

    • 推荐做法:
      • 确保你的环境变量 JAVA_HOME 指向 Java 8。
      • 重新启动 Nacos。

    2. 升级到支持 Java 17 的 Nacos 版本

    如果你必须使用 Java 17,建议升级到 Nacos 2.2.0 及以上版本,这些版本对 Java 17 有较好的支持。

    • 推荐版本:
      • Nacos 2.2.0 +
      • Nacos 2.4.0 +

    3. 添加 JVM 参数(临时解决方案)

    如果你不能升级 Nacos,可以尝试在启动脚本中添加以下 JVM 参数来绕过模块限制:

    --add-opens java.base/java.io=ALL-UNNAMED
    
    修改启动脚本:

    打开 Nacos 的启动脚本(如 start.shstart.bat),并在启动命令中添加如下参数:

    java -Dserver.port=8848 \
         -Dnacos.home=. \
         --add-opens java.base/java.io=ALL-UNNAMED \
         -jar nacos-server.jar
    

    注意:此方式为临时方案,可能不适用于所有情况,且未来版本可能会失效。


    详细步骤总结:

    1. 确认 Java 版本:

      • 如果使用 Java 17,继续下一步;
      • 如果使用 Java 8,直接运行即可。
    2. 升级 Nacos 版本(推荐):

      • 下载并部署支持 Java 17 的 Nacos 版本(如 2.2.0+)。
    3. 修改启动脚本(如果必须用 Java 17):

      • 在启动命令中添加:--add-opens java.base/java.io=ALL-UNNAMED
    4. 检查其他配置:

      • 确保 application.properties 中没有冲突配置;
      • 检查内存设置是否合理(如 -Xms-Xmx)。

    代码示例(修改后的启动脚本片段):

    # start.sh 示例
    #!/bin/bash
    
    export JAVA_HOME=/path/to/java8  # 指向 Java 8
    cd /path/to/nacos/bin
    ./startup.sh -m standalone
    

    或对于 Java 17 的情况:

    # start.sh 示例(Java 17)
    #!/bin/bash
    
    export JAVA_HOME=/path/to/java17
    cd /path/to/nacos/bin
    java -Dserver.port=8848 \
         -Dnacos.home=. \
         --add-opens java.base/java.io=ALL-UNNAMED \
         -jar nacos-server.jar
    

    重点总结:

    • 核心原因: Java 模块系统限制了对 java.io.FileSystem 的反射访问。
    • 推荐解决方案:
      • ✅ 使用 Java 8 运行 Nacos 2.5.2;
      • ✅ 升级到 Nacos 2.2.0+ 支持 Java 17;
      • ❌ 不建议长期依赖 --add-opens 参数。

    如果你需要进一步帮助,请提供你当前使用的操作系统和完整的启动脚本内容。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 1月15日
  • 已采纳回答 1月7日
  • 创建了问题 1月7日