运行Gluon Sample的HelloFX报Failed to execute goal构建错误咨询
问题修复:HelloFX构建失败
从栈追踪信息可以确定报错根因是JavaFX运行时组件缺失,可按以下步骤修复:
- 先执行Maven命令补全依赖:
mvn clean dependency:copy-dependencies,排除依赖拉取不全的问题 - 检查NetBeans项目运行配置:右键项目->属性->运行,确认主类为
com.gluonhq.samples.hellofx.HelloFX,在VM选项栏添加参数:--module-path ${project.build.directory}/dependency --add-modules javafx.controls,javafx.fxml,javafx.graphics - 优先使用Gluon专属命令运行:在NetBeans的Maven目标栏执行
mvn gluonfx:run,该命令由Gluon官方插件适配,默认会自动匹配JavaFX运行时,不需要手动配置模块路径。
疑问解答
1. Maven配置的Gluon和本地GraalVM是否会产生冲突
不会产生冲突:
- Gluon的substrate插件本身不内置独立的GraalVM环境,仅会调用你本地
JAVA_HOME指向的GraalVM执行原生编译逻辑,pom.xml中配置的仅为插件版本、编译参数等规则,不会和本地GraalVM产生覆盖。 - 唯一需要注意的适配规则:pom.xml中配置的
gluonfx-maven-plugin版本需要和本地GraalVM大版本匹配,你当前使用的graalvm-ce-java16-21.2.0搭配1.0.0及以上版本的gluonfx插件即可正常运行。
2. HelloFX中添加Java-JavaScript互操作的实现步骤
GraalVM默认内置GraalJS引擎,不需要额外引入第三方JS运行时,按以下步骤配置即可:
- 在pom.xml中添加GraalJS相关依赖:
<dependency> <groupId>org.graalvm.js</groupId> <artifactId>js</artifactId> <version>21.2.0</version> </dependency> <dependency> <groupId>org.graalvm.js</groupId> <artifactId>js-scriptengine</artifactId> <version>21.2.0</version> </dependency>
- 业务代码中实现互操作逻辑,示例如下:
import org.graalvm.polyglot.Context; import org.graalvm.polyglot.Value; // 业务逻辑调用位置 try (Context jsContext = Context.create()) { // Java调用JS代码执行运算 Value calculateResult = jsContext.eval("js", "5 * 8 + 2"); System.out.println("JS执行结果:" + calculateResult.asInt()); // JS调用Java侧传入的对象 jsContext.getBindings("js").putMember("javaInput", "来自Java的参数"); jsContext.eval("js", "console.log('收到Java传递的内容:' + javaInput)"); }
- 如果需要打包为原生镜像,需要在pom.xml的
gluonfx-maven-plugin配置项中添加适配规则:
<configuration> <reflectionList> <list>com.oracle.truffle.js.scriptengine.GraalJSScriptEngine</list> </reflectionList> <resourcesList> <list>js.*</list> </resourcesList> </configuration>
配置完成后执行mvn gluonfx:build即可生成包含JS互操作能力的原生包。
内容的提问来源于stack exchange,提问作者Fred Little
相关产品推荐
相关产品推荐

