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

使用Maven导出JavaFX项目Jar包时遇运行异常问题

问题:JavaFX Maven打包后无参数运行报错

我用Maven导出JavaFX项目的Jar包,pom.xml中已配置所有JavaFX依赖,生成Jar包时Maven无警告,但运行时提示:

Error: Could not find or load main class packagename.MAIN
Caused by: java.lang.NoClassDefFoundError: javafx/application/Application

添加VM参数后可正常运行,但我希望无需参数也能运行,恳请帮忙解答。

原pom.xml配置:

<?xml version="1.0" encoding="UTF-8"?>
<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>prova</groupId>
    <artifactId>name</artifactId>
    <version>1.0</version>
    <name>ClientS</name>

    <properties>
        <maven.compiler.source>17</maven.compiler.source>
        <maven.compiler.target>17</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <javafx.maven.plugin.vertion>0.0.8</javafx.maven.plugin.vertion>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx-controls</artifactId>
            <version>21-ea+24</version>
        </dependency>

        <dependency>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx-graphics</artifactId>
            <version>21-ea+24</version>
        </dependency>
        <dependency>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx-base</artifactId>
            <version>21-ea+24</version>
        </dependency>
        <dependency>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx-fxml</artifactId>
            <version>21-ea+24</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <!-- Configure maven-jar-plugin to include the manifest file -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <version>3.3.0</version> <!-- Adjust the version if needed -->

                <configuration>
                    <archive>
                        <manifestFile>src/main/resources/META-INF/MANIFEST.MF</manifestFile>
                    </archive>
                </configuration>
            </plugin>

            <!-- Configure javafx-maven-plugin for JavaFX -->
            <plugin>
                <groupId>org.openjfx</groupId>
                <artifactId>javafx-maven-plugin</artifactId>
                <version>0.0.8</version>
                <configuration>
                    <mainClass>packagename.MAIN</mainClass>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

问题原因

  1. JavaFX从JDK 11开始作为独立模块存在,默认不在JDK的类路径中,普通Maven打包生成的Jar只包含自身代码,不会自动将JavaFX依赖打包进去。
  2. 当前配置的maven-jar-plugin仅打包项目代码,javafx-maven-plugin仅指定了主类,未执行生成可执行Jar的逻辑,导致运行时找不到JavaFX核心类。

解决方法

修改pom.xml,让javafx-maven-plugin负责生成包含JavaFX依赖的可执行Jar,同时移除手动指定的MANIFEST文件引用:

修改后的pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>prova</groupId>
    <artifactId>name</artifactId>
    <version>1.0</version>
    <name>ClientS</name>

    <properties>
        <maven.compiler.source>17</maven.compiler.source>
        <maven.compiler.target>17</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <javafx.maven.plugin.version>0.0.8</javafx.maven.plugin.version> <!-- 修正拼写错误 -->
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx-controls</artifactId>
            <version>21-ea+24</version>
        </dependency>

        <dependency>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx-graphics</artifactId>
            <version>21-ea+24</version>
        </dependency>
        <dependency>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx-base</artifactId>
            <version>21-ea+24</version>
        </dependency>
        <dependency>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx-fxml</artifactId>
            <version>21-ea+24</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <!-- 移除自定义MANIFEST配置,由javafx-maven-plugin自动生成 -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <version>3.3.0</version>
            </plugin>

            <!-- 配置javafx-maven-plugin生成可执行Jar -->
            <plugin>
                <groupId>org.openjfx</groupId>
                <artifactId>javafx-maven-plugin</artifactId>
                <version>${javafx.maven.plugin.version}</version>
                <configuration>
                    <mainClass>packagename.MAIN</mainClass>
                </configuration>
                <executions>
                    <execution>
                        <id>default-cli</id>
                        <goals>
                            <goal>jar</goal> <!-- 生成包含JavaFX依赖的可执行Jar -->
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</project>

打包与运行

  1. 执行打包命令:mvn clean javafx:jar
  2. 打包完成后,在target目录下会生成类似name-1.0-jfx.jar的可执行Jar
  3. 直接运行:java -jar target/name-1.0-jfx.jar,无需额外VM参数即可启动程序

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 19:40:19