You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

NetBeans含JAXB项目用GraalVM 22+启动报错求助

解决GraalVM 22.x+搭配NetBeans 15运行含JAXB项目的主类加载错误

问题现象

  • 把本地GraalVM从graalvm-ce-java17-22.2.0升级到graalvm-ce-java19-22.3.0后,NetBeans 15里带JAXB绑定的项目启动就失败,报错:
    Error: Could not find or load main class FQN-OF-MAIN-CLASS in module jdk.internal.vm.compiler
    
  • 关联的Ant脚本也执行失败,但这两种情况正常:
    • 新建的Hello World项目能正常运行
    • 把出问题的项目打包成Jar,在命令行里运行完全没问题
  • 排查后发现规律:
    • 用标准JDK 1.8或者GraalVM 21.1启动NetBeans时,带JAXB的项目都能正常运行
    • 只要用GraalVM 22及以上版本启动NetBeans,所有含JAXB的项目都会触发这个错误

原因分析

GraalVM 22.x版本开始对JDK模块系统的处理逻辑有调整,而NetBeans 15自带的Ant构建脚本在搭配高版本GraalVM时,会错误地把JAXB相关依赖和jdk.internal.vm.compiler模块绑定到一起,导致主类的加载路径混乱,没法正确找到项目里的主类。

解决方案

方案1:修改项目的Ant构建配置

在项目的build.xml里添加JAXB模块的显式声明,避免模块冲突:

<target name="-run-java" depends="-run-pre-init, -run-init, -run-classpath">
    <java classname="${main.class}" fork="true">
        <!-- 显式添加JAXB模块 -->
        <jvmarg value="--add-modules=java.xml.bind"/>
        <!-- 开放必要的模块访问权限 -->
        <jvmarg value="--add-opens=java.base/java.lang=ALL-UNNAMED"/>
        <classpath refid="run.classpath"/>
    </java>
</target>

方案2:拆分NetBeans和项目的JDK使用版本

让NetBeans启动时用标准JDK 1.8或GraalVM 21.1,项目编译运行时再用GraalVM 22.x:

  1. 找到NetBeans安装目录下的etc/netbeans.conf文件
  2. 修改netbeans_jdkhome参数,指向标准JDK 1.8或GraalVM 21.1的路径,比如:
    netbeans_jdkhome="C:\Program Files\Java\graalvm-ce-java17-21.1.0"
    
  3. 打开NetBeans里的问题项目,右键选「属性」→「构建」→「编译」,把「Java平台」改成graalvm-ce-java19-22.3.0

方案3:升级NetBeans版本

NetBeans 16及以后的版本对GraalVM 22.x+的兼容性做了优化,直接升级NetBeans就能解决这个模块冲突问题。

内容的提问来源于stack exchange,提问作者Michael

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 14:30:48