GraalVM GluonFX应用调用JAXBContext.newInstance()加载Glassfish库失败
问题概述
通过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
相关产品推荐
相关产品推荐

