启动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:
- 修改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>
- 执行构建命令:
mvn clean package
- 启动应用:进入
target/app-image/bin目录,运行app.bat(Windows)即可。
方法三:调整shade插件打包逻辑(适合坚持用shade的场景)
若要继续用shade插件,需处理JavaFX模块的打包方式,并调整启动类:
- 添加一个非JavaFX的启动类,间接启动应用:
public class Launcher { public static void main(String[] args) { com.application.Main.main(args); } }
修改pom.xml中maven-shade-plugin和maven-jar-plugin的
mainClass为com.application.Launcher在shade插件的
configuration中添加JavaFX依赖的打包规则:
<artifactSet> <includes> <include>org.openjfx:*</include> </includes> </artifactSet>
注意:此方式仅能打包JavaFX的class文件,原生库(.dll/.so/.dylib)无法通过shade打包,需确保运行时这些库在系统路径中。
内容的提问来源于stack exchange,提问作者Jeff Cook
相关产品推荐
相关产品推荐

