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

启动bat文件时提示JavaFX运行时组件缺失的问题排查

问题描述

我正在使用Open JDK 11开发基于Maven的JavaFX模块,通过shade插件构建生成jar文件后,启动bat文件时出现以下错误:

Error: JavaFX runtime components are missing, and are required to run this application

C:\users\App_Java11>pause
Press any key to continue . . .

启动用的bat文件内容:

@set JAVA_BIN=C:/Program Files/openjdk-jdk-11/bin/java
@set JAVA_OPTS=%JAVA_OPTS% -module-path "C:/jars/lib" --add-modules=javafx.controls,javafx.fxml
@"%JAVA_BIN%" -Djavax.net.ssl.keyStore="some.jks" -Djavax.net.ssl.keyStorePassword=password -jar app.jar -Xmx350m
pause

项目的pom.xml配置:

<project xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <parent>
        <groupId>XX</groupId>
        <version>1.0.0</version>
        <artifactId>abc-maven-parent</artifactId>
    </parent>

    <version>1.0.0-SNAPSHOT</version>
    <artifactId>some-app</artifactId>

    <properties>
        <spring.version>5.3.21</spring.version>
        <javafx.version>11</javafx.version>
         <javafx.maven.plugin.version>0.0.6</javafx.maven.plugin.version>
    </properties>

    <build>
        <!--pluginManagement-->
        <plugins>
             <plugin> 
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-shade-plugin</artifactId>
                <version>3.2.1</version>
                <configuration>
                    <transformers>
                        <transformer implementation="com.github.edwgiz.mavenShadePlugin.log4j2CacheTransformer.PluginsCacheFileTransformer" />
                        <transformer implementation="org.apache.maven.plugins.shade.resource.ComponentsXmlResourceTransformer" />
                        <transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
                            <resource>META-INF/spring.handlers</resource>
                        </transformer>
                        <transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
                            <resource>META-INF/spring.schemas</resource>
                        </transformer>
                    </transformers>
                    <filters>
                        <filter>
                            <artifact>*:*</artifact>
                            <excludes>
                                <exclude>META-INF/*.SF</exclude>
                                <exclude>META-INF/*.DSA</exclude>
                                <exclude>META-INF/*.RSA</exclude>
                            </excludes>
                        </filter>
                    </filters>
                </configuration>
                <dependencies>
                    <dependency>
                        <groupId>com.github.edwgiz</groupId>
                        <artifactId>maven-shade-plugin.log4j2-cachefile-transformer</artifactId>
                        <version>2.6.1</version>
                    </dependency>
                </dependencies>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>shade</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.1</version>
                <configuration>
                    <release>${maven.compiler.release}</release>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.openjfx</groupId>
                <artifactId>javafx-maven-plugin</artifactId>
                <version>${javafx.maven.plugin.version}</version>
                <configuration>
                    <mainClass>com.application.Main</mainClass>
                </configuration>
            </plugin>
            <plugin>

                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <version>3.1.0</version>
                <configuration>
                    <archive>
                        <manifest>
                            <addClasspath>true</addClasspath>
                            <classpathPrefix>lib/</classpathPrefix>
                            <mainClass>com.application.Main</mainClass>
                        </manifest>
                    </archive>
                </configuration>
            </plugin>
        </plugins>
        <!--/pluginManagement-->
    </build>

    <dependencies>
        <dependency>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx-controls</artifactId>
            <version>${javafx.version}</version>
        </dependency>
        <dependency>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx-fxml</artifactId>
            <version>${javafx.version}</version>
        </dependency>
        <dependency>
            <groupId>com.gemstone.gemfire</groupId>
            <artifactId>gemfire</artifactId>
            <version>8.2.8</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-beans</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.8.2</version>
            <scope>test</scope>
        </dependency>
    </dependencies>
</project>
解决方案

方法一:修正bat文件参数顺序

当前bat中-Xmx350m放在-jar app.jar后,会被识别为jar的参数而非JVM参数,同时确保JAVA_OPTS的参数正确传递:

修改后的bat:

@set JAVA_BIN=C:/Program Files/openjdk-jdk-11/bin/java
@set JAVA_OPTS=%JAVA_OPTS% -module-path "C:/jars/lib" --add-modules=javafx.controls,javafx.fxml -Xmx350m
@"%JAVA_BIN%" %JAVA_OPTS% -Djavax.net.ssl.keyStore="some.jks" -Djavax.net.ssl.keyStorePassword=password -jar app.jar
pause

核心调整:

  • 将-Xmx350m移入JAVA_OPTS,确保它作为JVM参数生效
  • 执行Java命令时先传入%JAVA_OPTS%,再指定jar和其他参数

方法二:使用javafx-maven-plugin构建独立镜像

利用已引入的javafx-maven-plugin,直接构建包含JavaFX运行时的独立应用包,无需额外配置module-path:

  1. 修改pom.xml中javafx-maven-plugin的配置:
<plugin>
    <groupId>org.openjfx</groupId>
    <artifactId>javafx-maven-plugin</artifactId>
    <version>${javafx.maven.plugin.version}</version>
    <configuration>
        <mainClass>com.application.Main</mainClass>
        <launcher>app</launcher>
        <jlinkImageName>target/app-image</jlinkImageName>
        <jlinkZipName>app-image-zip</jlinkZipName>
    </configuration>
    <executions>
        <execution>
            <id>default-cli</id>
            <phase>package</phase>
            <goals>
                <goal>jlink</goal>
            </goals>
        </execution>
    </executions>
</plugin>
  1. 执行构建命令:
mvn clean package
  1. 启动应用:进入target/app-image/bin目录,运行app.bat(Windows)即可。

方法三:调整shade插件打包逻辑(适合坚持用shade的场景)

若要继续用shade插件,需处理JavaFX模块的打包方式,并调整启动类:

  1. 添加一个非JavaFX的启动类,间接启动应用:
public class Launcher {
    public static void main(String[] args) {
        com.application.Main.main(args);
    }
}
  1. 修改pom.xml中maven-shade-plugin和maven-jar-plugin的mainClass为com.application.Launcher

  2. 在shade插件的configuration中添加JavaFX依赖的打包规则:

<artifactSet>
    <includes>
        <include>org.openjfx:*</include>
    </includes>
</artifactSet>

注意:此方式仅能打包JavaFX的class文件,原生库(.dll/.so/.dylib)无法通过shade打包,需确保运行时这些库在系统路径中。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 03:25:56