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

Eclipse中JavaFX项目生成.exe报错:缺失JavaFX运行时组件

问题描述

我被这个问题困扰3天了。我的JavaFX项目在Eclipse里点击运行按钮能正常运行,但生成可执行.exe文件时遇到问题。项目的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>

    <groupId>com.schematix</groupId>
    <artifactId>schematix</artifactId>
    <version>1.0.0</version>
    <packaging>jar</packaging>
    <description>Building electricity calculator</description>
    <url>http://maven.apache.org</url>

    <properties>
        <runtime.version>7.0.0.Final</runtime.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <dependencies>
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-core</artifactId>
            <version>1.2.3</version>
        </dependency>
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-classic</artifactId>
            <version>1.2.3</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.7.30</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-core</artifactId>
            <version>2.12.2</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.12.2</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>3.9</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>3.9</version>
        </dependency>
        <dependency>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx-controls</artifactId>
            <version>20.0.1</version>
        </dependency>

    </dependencies>

    <build>
        <sourceDirectory>src</sourceDirectory>

        <resources>
            <resource>
                <directory>src/resources</directory>
            </resource>
        </resources>

        <plugins>
            <plugin>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.7.0</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

我的编译器合规级别已设置为17。生成JAR的步骤是:右键项目→Export→Runnable JAR file→选择“Extract required libraries into generated JAR”,指定正确的启动配置和导出路径。之后用Launch4j工具,在Basic选项卡设置输出.exe路径、选择JAR文件及图标,在JRE选项卡设置最低JRE版本为17,点击Build wrapper生成.exe,但测试时出现报错:

错误:JavaFX运行时组件缺失,运行此应用需要这些组件


问题根源

Eclipse运行时会自动加载配置好的JavaFX SDK,但普通的Runnable JAR导出方式无法正确打包JavaFX的模块化依赖——JavaFX从11开始是独立的模块化库,不能像普通依赖那样直接合并到JAR中;同时你的pom.xml未配置JavaFX专用打包插件,导致导出的JAR不包含JavaFX运行时,也未正确处理模块路径。


解决方法

方法1:用Maven JavaFX插件打包(推荐)

这种方式会自动处理JavaFX依赖和模块化,直接生成包含JRE和JavaFX运行时的exe文件:

  1. 修改pom.xml,更新编译插件版本并添加JavaFX打包插件:
<properties>
    <java.version>17</java.version>
    <javafx.version>20.0.1</javafx.version>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>

<build>
    <plugins>
        <!-- 修正编译插件的Java版本,与合规级别保持一致 -->
        <plugin>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.11.0</version>
            <configuration>
                <source>${java.version}</source>
                <target>${java.version}</target>
            </configuration>
        </plugin>
        <!-- 添加JavaFX打包插件 -->
        <plugin>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx-maven-plugin</artifactId>
            <version>0.0.8</version>
            <executions>
                <execution>
                    <id>default-cli</id>
                    <configuration>
                        <mainClass>com.schematix.Main</mainClass> <!-- 替换为你的主类全路径 -->
                    </configuration>
                </execution>
                <execution>
                    <id>jpackage</id>
                    <goals>
                        <goal>jpackage</goal>
                    </goals>
                    <configuration>
                        <mainClass>com.schematix.Main</mainClass>
                        <type>exe</type>
                        <icon>src/resources/your-icon.ico</icon> <!-- 替换为你的图标路径 -->
                        <jpackageArguments>
                            <argument>--win-console</argument> <!-- 可选,用于调试时查看日志 -->
                        </jpackageArguments>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>
  1. 在Eclipse的Maven面板依次执行clean→compile→javafx:jpackage,插件会自动生成包含完整运行环境的exe文件,输出在target/jpackage目录下。

方法2:调整现有流程,手动指定JavaFX模块路径

如果坚持使用Launch4j,需要手动配置JavaFX的模块路径:

  1. 导出JAR时,不要选择“Extract required libraries into generated JAR”,改用“Package required libraries into generated JAR”或“Copy required libraries into a sub-folder next to the generated JAR”,确保JavaFX的JAR文件被单独保留。
  2. 下载与pom.xml中版本一致的JavaFX SDK(20.0.1),解压到本地目录。
  3. 在Launch4j的“JRE”选项卡中,找到“VM options”并添加:
--module-path "你的JavaFX SDK路径/lib" --add-modules javafx.controls
  1. 重新生成exe,运行时确保JavaFX SDK的lib目录与exe、JAR文件路径对应。

额外注意点
  • pom.xml中maven-compiler-plugin的source和target仍为1.8,与你设置的17级合规级别冲突,必须修改为17,否则编译出的字节码可能不兼容。
  • JavaFX 20需要JDK 17及以上,Launch4j中设置的最低JRE版本必须保持一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 17:18:11