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

JavaFX运行时组件缺失,双击运行Jar文件失败求助

解决JavaFX Jar运行时"JavaFX runtime components are missing"错误

问题描述

双击或通过命令行运行JavaFX Jar文件时,出现如下错误:

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

已尝试创建launch类调用继承Application的Main类的main方法,但问题仍未解决。

现有代码

launch类

package com.application;

public class launch {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Main.main(args);
    }

}

Main类

package com.application;

import java.io.File;

import javafx.application.Application;
import javafx.application.Platform;
import javafx.event.EventHandler;
import javafx.fxml.FXMLLoader;
import javafx.stage.Stage;
import javafx.stage.WindowEvent;
import javafx.scene.Parent;
import javafx.scene.Scene;

public class Main extends Application {

    @Override
    public void start(Stage primaryStage) {
        try {
            File del;
            try {
                del = new File("errorscanReport.txt");
                del.delete();
            } catch (Exception e) {
                // TODO Auto-generated catch block
            }
            
            try {
                del = new File("errorss.txt");
                del.delete();
            } catch (Exception e) {
                // TODO Auto-generated catch block
            }
            
            try {
                del = new File("error.txt");
                del.delete();
            } catch (Exception e) {
                // TODO Auto-generated catch block
            }
            try {
                File f = new File("AutoMoveError.txt");
                f.delete();
            } catch (Exception em) {
                // TODO: handle exception
            }
            
            Parent root = FXMLLoader.load(getClass().getResource("MainScene.fxml"));
            Scene scene = new Scene(root);
            primaryStage.setHeight(500);
            primaryStage.setWidth(700);
            primaryStage.setTitle("HUMANOID");
            primaryStage.setScene(scene);
            primaryStage.show();
            
            primaryStage.setOnCloseRequest(new EventHandler<WindowEvent>() {
                
                @Override
                public void handle(WindowEvent arg0) {
                    // TODO Auto-generated method stub
                    MainSceneController.stop_flag = true;
                    Platform.exit();
                }
            });
            
        } catch(Exception e) {
            System.out.println(e.toString());
        }
    }

    public static void main(String[] args) {
        launch(args);
    }

}

解决方案

方法1:模块化打包(推荐)

  1. 确保项目为模块化结构,在module-info.java中声明JavaFX依赖:
module com.application {
    requires javafx.controls;
    requires javafx.fxml;
    opens com.application to javafx.fxml;
    exports com.application;
}
  1. 使用jlink创建包含JavaFX组件的自定义运行时镜像:
jlink --module-path "path/to/javafx/lib;path/to/your/compiled/modules" --add-modules com.application --output runtime
  1. 生成启动脚本:
    • Windows(.bat文件):
      runtime\bin\java -m com.application/com.application.launch
      
    • Linux/macOS(.sh文件):
      ./runtime/bin/java -m com.application/com.application.launch
      

用户双击脚本即可直接运行应用。

方法2:打包包含JavaFX依赖的可执行Jar

使用构建工具将JavaFX组件打包进Jar:

  • Maven:配置javafx-maven-plugin,启用jar目标并设置attachClasses为true,打包后生成的Jar包含所有依赖。
  • Gradle:配置javafx-gradle-plugin的jar任务,将JavaFX依赖合并到最终Jar中。
    打包完成后,双击Jar即可运行。

方法3:命令行指定JavaFX路径(配合脚本实现双击)

若不想重新打包,可通过命令行指定JavaFX运行时路径:

java --module-path "path/to/javafx/lib" --add-modules javafx.controls,javafx.fxml -jar your-application.jar

将上述命令写入.bat(Windows)或.sh(Linux/macOS)脚本,用户双击脚本即可启动应用。

原启动类无效的原因

你的launch类只是调用了Main的main方法,而Main的main最终还是调用了Application.launch(),该方法依然依赖JavaFX runtime组件。问题根源是运行环境中缺少JavaFX,和启动类的写法无关。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 01:57:22