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

GraalVM GluonFX应用调用JAXBContext.newInstance()加载Glassfish库失败

GluonFX GraalVM应用JAXB初始化异常:ReflectionNavigator.getInstance找不到

问题概述

通过Maven构建GluonFX GraalVM原生应用时,调用JAXBContext.newInstance()触发Glassfish运行时库加载失败,核心异常为ReflectionNavigator.getInstance can't be found。该应用在本地命令行、Eclipse中以非GraalVM原生模式运行完全正常,推测是GraalVM未正确配置以定位Jakarta JAXB相关依赖。

运行异常信息

$ ./app
Jul 17, 2023 3:30:00 PM com.sun.javafx.application.PlatformImpl startup
WARNING: Unsupported JavaFX configuration: classes were loaded from 'unnamed module @71c7db30'
Exception in Application start method
Exception in thread "main" java.lang.RuntimeException: Exception in Application start method
    at com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:893)
    at com.sun.javafx.application.LauncherImpl.lambda$launchApplication$2(LauncherImpl.java:195)
    at java.lang.Thread.run(Thread.java:833)
    at com.oracle.svm.core.thread.PlatformThreads.threadStartRoutine(PlatformThreads.java:704)
    at com.oracle.svm.core.posix.thread.PosixPlatformThreads.pthreadStartRoutine(PosixPlatformThreads.java:202)
Caused by: java.lang.ExceptionInInitializerError
    at org.glassfish.jaxb.runtime.v2.model.impl.RuntimeModelBuilder.<init>(RuntimeModelBuilder.java:61)
    at org.glassfish.jaxb.runtime.v2.runtime.JAXBContextImpl.getTypeInfoSet(JAXBContextImpl.java:405)
    at org.glassfish.jaxb.runtime.v2.runtime.JAXBContextImpl.<init>(JAXBContextImpl.java:255)
    at org.glassfish.jaxb.runtime.v2.runtime.JAXBContextImpl$JAXBContextBuilder.build(JAXBContextImpl.java:1115)
    at org.glassfish.jaxb.runtime.v2.ContextFactory.createContext(ContextFactory.java:144)
    at org.glassfish.jaxb.runtime.v2.JAXBContextFactory.createContext(JAXBContextFactory.java:44)
    at jakarta.xml.bind.ContextFinder.find(ContextFinder.java:368)
    at jakarta.xml.bind.JAXBContext.newInstance(JAXBContext.java:605)
    at jakarta.xml.bind.JAXBContext.newInstance(JAXBContext.java:546)
    ...
com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$9(LauncherImpl.java:839)
    at com.sun.javafx.application.PlatformImpl.lambda$runAndWait$12(PlatformImpl.java:483)
    at com.sun.javafx.application.PlatformImpl.lambda$runLater$10(PlatformImpl.java:456)
    at java.security.AccessController.executePrivileged(AccessController.java:169)
    at java.security.AccessController.doPrivileged(AccessController.java:399)
    at com.sun.javafx.application.PlatformImpl.lambda$runLater$11(PlatformImpl.java:455)
    at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95)
    at com.oracle.svm.jni.JNIJavaCallWrappers.jniInvoke_VA_LIST_Runnable_run_16403f8d32adb631126daa893e5e80085c5d6325(JNIJavaCallWrappers.java:0)
    at com.sun.glass.ui.gtk.GtkApplication._runLoop(GtkApplication.java)
    at com.sun.glass.ui.gtk.GtkApplication.lambda$runLoop$10(GtkApplication.java:263)
    ... 3 more
Caused by: java.lang.IllegalStateException: ReflectionNavigator.getInstance can't be found
    at org.glassfish.jaxb.runtime.v2.model.impl.Utils$1.run(Utils.java:55)
    at org.glassfish.jaxb.runtime.v2.model.impl.Utils$1.run(Utils.java:47)
    at java.security.AccessController.executePrivileged(AccessController.java:169)
    at java.security.AccessController.doPrivileged(AccessController.java:318)
    at org.glassfish.jaxb.runtime.v2.model.impl.Utils.<clinit>(Utils.java:46)
    ... 27 more

POM.xml相关依赖配置

<dependency>
    <groupId>jakarta.xml.bind</groupId>
    <artifactId>jakarta.xml.bind-api</artifactId>
    <version>4.0.0</version>
</dependency>
<dependency>
    <groupId>jakarta.activation</groupId>
    <artifactId>jakarta.activation-api</artifactId>
    <version>2.1.0</version>
</dependency>
<dependency>
    <groupId>org.glassfish.jaxb</groupId>
    <artifactId>jaxb-runtime</artifactId>
    <version>4.0.0</version>
    <scope>runtime</scope>
</dependency>
<dependency>
    <groupId>org.glassfish.jaxb</groupId>
    <artifactId>jaxb-core</artifactId>
    <version>4.0.0</version>
    <scope>runtime</scope>
</dependency>
<dependency>
    <groupId>com.sun.istack</groupId>
    <artifactId>istack-commons-runtime</artifactId>
    <version>3.0.11</version>
    <scope>runtime</scope>
</dependency>
<dependency>
    <groupId>org.glassfish.jaxb</groupId>
    <artifactId>txw2</artifactId>
    <version>4.0.0</version>
    <scope>runtime</scope>
</dependency>

环境信息

  • Linux Mint 21
  • Java 17
  • GluonFX GraalVM:graalvm-svm-java17-linux-gluon-22.1.0.1-Final

解决方案

1. 添加GraalVM反射配置

GraalVM原生编译无法自动检测JAXB的反射调用,需手动创建反射配置文件src/main/resources/META-INF/native-image/org.glassfish.jaxb/jaxb-runtime/reflect-config.json,内容如下:

[
  {
    "name": "com.sun.xml.bind.v2.model.impl.ReflectionNavigator",
    "methods": [
      {
        "name": "getInstance",
        "parameterTypes": []
      }
    ]
  },
  {
    "name": "org.glassfish.jaxb.runtime.v2.model.impl.ReflectionNavigator",
    "methods": [
      {
        "name": "getInstance",
        "parameterTypes": []
      }
    ]
  }
]

2. 调整依赖范围

将jaxb-runtime、jaxb-core等依赖的<scope>从runtime改为compile,确保GraalVM编译时能扫描到相关类:

<dependency>
    <groupId>org.glassfish.jaxb</groupId>
    <artifactId>jaxb-runtime</artifactId>
    <version>4.0.0</version>
    <scope>compile</scope>
</dependency>
<dependency>
    <groupId>org.glassfish.jaxb</groupId>
    <artifactId>jaxb-core</artifactId>
    <version>4.0.0</version>
    <scope>compile</scope>
</dependency>

3. 配置GluonFX插件

在Maven的GluonFX插件中直接指定需要反射的类,避免遗漏:

<plugin>
    <groupId>com.gluonhq</groupId>
    <artifactId>gluonfx-maven-plugin</artifactId>
    <version>2.1.0</version>
    <configuration>
        <mainClass>你的主类全路径</mainClass>
        <reflectionList>
            <list>org.glassfish.jaxb.runtime.v2.model.impl.ReflectionNavigator</list>
            <list>com.sun.xml.bind.v2.model.impl.ReflectionNavigator</list>
        </reflectionList>
    </configuration>
</plugin>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 02:07:02