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

GluonFX Native Build后CSS失效、菜单无标签问题咨询

GluonFX构建独立程序后CSS样式丢失、控件渲染异常的解决方案

问题现象

  • 执行gluonfx:run和gluonfx:runagent时应用运行正常,但gluonfx:build生成的独立程序出现CSS样式丢失、菜单项无标签(控件存在但无文本显示)的问题
  • 终端运行独立程序时触发警告:Unsupported JavaFX configuration: classes were loaded from 'unnamed module @71c7db30'
  • 自定义项目结构(src/apppackages等)和标准Maven资源结构下均出现该异常

环境信息

  • GluonFX/GraalVM版本:graalvm-svm-java17-linux-gluon-22.1.0.1-Final
  • Java版本:17
  • 操作系统:Linux

重现步骤

  • 生成最小化Gluon应用(取消所有选项)
  • 执行mvn gluonfx:run和mvn gluonfx:runagent,界面可见蓝色Label
  • 执行mvn gluonfx:build,运行生成的独立程序,蓝色Label消失
  • 检查META-INF/resource-config.json,已包含com/mycompany/sample/styles.css条目

解决方案

1. 修正资源加载方式

将CSS和资源的加载逻辑改为通过ClassLoader获取,避免GraalVM静态分析时遗漏资源引用:

// 替换原CSS加载代码
scene.getStylesheets().add(ClassLoader.getSystemResource("com/mycompany/sample/styles.css").toExternalForm());

// 替换图片加载代码
ImageView imageView = new ImageView(new Image(ClassLoader.getSystemResourceAsStream("com/mycompany/sample/openduke.png")));

2. 显式配置GraalVM元数据

在项目src/main/resources/META-INF/native-image目录下创建以下配置文件:

resource-config.json

确保所有需要的资源被纳入原生镜像:

{
  "resources": [
    {
      "pattern": "\\Qcom/mycompany/sample/styles.css\\E"
    },
    {
      "pattern": "\\Qcom/mycompany/sample/openduke.png\\E"
    }
  ]
}

reflect-config.json

添加JavaFX控件的反射配置,解决菜单项无标签问题(MenuItem等控件的文本属性依赖反射机制):

[
  {
    "name": "javafx.scene.control.Labeled",
    "allDeclaredConstructors": true,
    "allPublicConstructors": true,
    "allDeclaredMethods": true,
    "allPublicMethods": true,
    "allDeclaredFields": true,
    "allPublicFields": true
  },
  {
    "name": "javafx.scene.control.MenuItem",
    "allDeclaredConstructors": true,
    "allPublicConstructors": true,
    "allDeclaredMethods": true,
    "allPublicMethods": true,
    "allDeclaredFields": true,
    "allPublicFields": true
  }
]

3. 调整Maven构建配置

确保pom.xml中正确配置资源目录(以自定义结构为例):

<build>
  <resources>
    <resource>
      <directory>src/apppackages/resources</directory>
      <includes>
        <include>**/*.css</include>
        <include>**/*.png</include>
      </includes>
    </resource>
  </resources>
  <plugins>
    <plugin>
      <groupId>com.gluonhq</groupId>
      <artifactId>gluonfx-maven-plugin</artifactId>
      <version>2.1.0</version>
      <configuration>
        <mainClass>com.mycompany.sample.Main</mainClass>
      </configuration>
    </plugin>
  </plugins>
</build>

4. 清理重新构建

执行以下命令彻底清理并重新生成原生镜像:

mvn clean
mvn gluonfx:runagent
mvn gluonfx:build

原理说明

  • GraalVM原生镜像采用静态分析机制,仅纳入明确引用的资源和类,使用ClassLoader加载资源可确保被静态分析捕获
  • 菜单项无标签是因为Labeled(包含MenuItem)控件的文本属性依赖反射,必须显式配置反射元数据才能正常工作
  • 上述配置会自动修正JavaFX模块加载问题,消除Unsupported JavaFX configuration警告

内容的提问来源于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 04:01:15