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

如何将JavaFX的--module-path等配置嵌入Jar实现双击运行?

问题描述

我在IntelliJ IDEA中通过以下Maven配置编译并生成了JavaFX应用的Jar包:

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.10.1</version>
            <configuration>
                <source>18</source>
                <target>18</target>
            </configuration>
        </plugin>
        <plugin>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx-maven-plugin</artifactId>
            <version>0.0.8</version>
            <executions>
                <execution>
                    <!-- Default configuration for running with: mvn clean javafx:run -->
                    <id>default-cli</id>
                    <configuration>
                        <mainClass>net.golbarg.nahjolfasahe/net.golbarg.nahjolfasahe.MainApp</mainClass>
                        <launcher>app</launcher>
                        <compress>2</compress>
                        <jlinkZipName>app</jlinkZipName>
                        <jlinkImageName>app</jlinkImageName>
                        <noManPages>true</noManPages>
                        <stripDebug>true</stripDebug>
                        <noHeaderFiles>true</noHeaderFiles>
                    </configuration>
                </execution>
            </executions>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-dependency-plugin</artifactId>
            <executions>
                <execution>
                    <id>copy-dependencies</id>
                    <phase>prepare-package</phase>
                    <goals>
                        <goal>copy-dependencies</goal>
                    </goals>
                    <configuration>
                        <outputDirectory>
                            ${project.build.directory}/libs
                        </outputDirectory>
                    </configuration>
                </execution>
            </executions>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-jar-plugin</artifactId>
            <version>3.3.0</version>
            <configuration>
                <archive>
                    <manifest>
                        <addClasspath>true</addClasspath>
                        <classpathPrefix>libs/</classpathPrefix>
                        <mainClass>
                            net.golbarg.nahjolfasahe.MainApp
                        </mainClass>
                    </manifest>
                </archive>
                <finalName>setup</finalName>
            </configuration>
        </plugin>
    </plugins>
</build>

但运行该Jar包时必须使用如下命令:

"C:\Program Files\Java\jdk-18.0.1.1\bin\java.exe" --module-path "C:\Program Files\Java\javafx\javafx-sdk-19\lib" --add-modules javafx.controls,javafx.fxml,javafx.swing -Dfile.encoding=windows-1252 -jar C:\work\system\NahjolFasahe\target\setup.jar

即必须指定--module-path和--add-modules参数才能运行。

请问如何简化操作?能否通过修改Maven配置或在生成的Jar包清单文件中添加这些配置,让Jar包可通过双击直接打开运行?

解决方案

1. 无法通过Jar清单直接实现双击运行

Java的Jar清单文件(MANIFEST.MF)不支持声明模块路径和要添加的模块,因为这些是JVM启动参数,不属于Jar清单的规范内容。所以直接修改清单无法实现双击运行。

2. 方法一:使用JavaFX Maven插件生成独立运行镜像(推荐)

你当前的javafx-maven-plugin已经配置了jlink相关参数,直接执行以下Maven命令即可生成包含JRE和JavaFX依赖的独立运行包:

mvn clean javafx:jlink

执行完成后,在target/app目录下会生成一个独立的应用镜像,里面包含:

  • 精简后的JRE(仅包含应用需要的模块)
  • JavaFX依赖模块
  • 可直接双击运行的启动脚本(Windows下是app.exe,Linux/macOS下是app)

这种方式不需要用户额外安装JDK/JRE,双击启动脚本就能运行应用,是JavaFX应用分发的标准方式。

3. 方法二:打包成包含JavaFX依赖的"胖Jar"

可以使用maven-assembly-plugin将JavaFX模块和应用代码打包到同一个Jar中,步骤如下:

  1. 在pom.xml的build/plugins中添加以下插件配置:
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-assembly-plugin</artifactId>
    <version>3.6.0</version>
    <executions>
        <execution>
            <id>make-assembly</id>
            <phase>package</phase>
            <goals>
                <goal>single</goal>
            </goals>
            <configuration>
                <archive>
                    <manifest>
                        <mainClass>net.golbarg.nahjolfasahe.MainApp</mainClass>
                    </manifest>
                </archive>
                <descriptorRefs>
                    <descriptorRef>jar-with-dependencies</descriptorRef>
                </descriptorRefs>
                <appendAssemblyId>false</appendAssemblyId>
                <finalName>setup-fat</finalName>
            </configuration>
        </execution>
    </executions>
</plugin>
  1. 执行打包命令:
mvn clean package
  1. 运行生成的胖Jar:
java -jar target/setup-fat.jar

注意:这种方式需要用户本地安装了兼容版本的JDK/JRE,且JavaFX模块会被打包到Jar中,文件体积会比jlink生成的镜像大一些。

4. 方法三:创建启动脚本简化命令

如果不想修改打包方式,可以创建一个批处理脚本(Windows下是.bat,Linux/macOS下是.sh),将启动命令封装进去:

  • Windows批处理脚本(run-app.bat):
@echo off
"C:\Program Files\Java\jdk-18.0.1.1\bin\java.exe" --module-path "C:\Program Files\Java\javafx\javafx-sdk-19\lib" --add-modules javafx.controls,javafx.fxml,javafx.swing -Dfile.encoding=windows-1252 -jar "%~dp0setup.jar"
pause

将脚本和setup.jar放在同一目录,双击脚本即可运行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 15:30:58