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

使用jpackage打包含JavaFX与Jetty WebSocket的.exe无法启动求助

  • 确保项目模块化配置正确
    在module-info.java中声明所有依赖模块,同时处理Jetty的反射访问需求:
    module your.app.module {
        // JavaFX核心依赖模块
        requires javafx.controls;
        requires javafx.fxml;
        // Jetty相关自动模块(根据实际引入的依赖调整)
        requires org.eclipse.jetty.server;
        requires org.eclipse.jetty.servlet;
        requires org.eclipse.jetty.websocket.server;
        requires org.eclipse.jetty.websocket.client;
        // 开放Jetty需要反射访问的包
        opens com.your.app.web to org.eclipse.jetty.server, org.eclipse.jetty.websocket.server;
        // 导出主类所在包
        exports com.your.app.main;
    }
    
  • jlink构建runtime时包含所有依赖
    使用Maven的maven-jlink-plugin时,需指定JavaFX的jmods路径,并显式添加Jetty的自动模块:
    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-jlink-plugin</artifactId>
        <version>3.3.0</version>
        <configuration>
            <moduleName>your.app.module</moduleName>
            <jlinkImageDirectory>${project.build.directory}/jlink-image</jlinkImageDirectory>
            <jlinkExecutable>${java.home}/bin/jlink</jlinkExecutable>
            <addModules>
                <module>your.app.module</module>
                <module>org.eclipse.jetty.server</module>
                <module>org.eclipse.jetty.websocket.server</module>
                <!-- 其他Jetty依赖模块 -->
            </addModules>
            <javafxJmodsPath>${javafx.sdk.path}/jmods</javafxJmodsPath>
        </configuration>
    </plugin>
    
  • jpackage打包的关键配置
    • 通过--runtime-image指定jlink生成的镜像路径
    • 用--main-module或--main-class明确启动入口
    • 若Jetty依赖外部配置文件,用--include-resources将资源打包进应用
    • 添加必要的Java运行参数,比如允许反射的相关配置
问题2:如何获取闪退应用的运行日志?Java是否有监控jpackage生成.exe的方法?
  • 直接查看控制台输出
    打开命令提示符(CMD),切换到exe所在目录,直接在命令行中运行该exe。此时程序的错误信息会打印在控制台,不会直接闪退,能快速定位问题。
  • 配置日志文件输出
    打包时通过--java-options指定日志输出到文件:
    jpackage --runtime-image ./jlink-image --main-module your.app.module/com.your.app.main.Main --java-options "-Djava.util.logging.fileHandler.pattern=app.log -Djava.util.logging.fileHandler.level=ALL" --name YourApp
    
    运行exe后,同一目录会生成app.log,包含详细运行日志。
  • JVM监控工具
    若程序能短暂运行,打包时添加JMX参数,用JDK自带的jconsole或jvisualvm连接监控:
    jpackage --runtime-image ./jlink-image --main-module your.app.module/com.your.app.main.Main --java-options "-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=9010 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false" --name YourApp
    
    启动exe后,打开jconsole连接localhost:9010,即可查看JVM状态、线程、内存等信息。
问题3:如何验证应用镜像中的runtime已加载所有必要依赖?
  • 查看runtime包含的模块
    进入jlink生成的runtime镜像的bin目录,运行:
    java --list-modules
    
    输出列表需包含JavaFX模块、Jetty自动模块和你的应用模块。
  • 用jdeps分析依赖
    对应用jar包运行jdeps命令,查看依赖的模块:
    jdeps --list-deps your-app.jar
    
    将结果与java --list-modules的输出对比,确认无缺失。
  • 在代码中打印加载的模块
    在启动类的main方法开头添加代码,启动时打印所有已加载模块:
    public static void main(String[] args) {
        ModuleLayer.boot().modules().forEach(module -> {
            System.out.println("Loaded module: " + module.getName());
        });
        launch(args);
    }
    
    通过命令行运行exe,即可验证Jetty和JavaFX模块是否已加载。
  • 检查runtime模块镜像
    进入jlink生成的runtime的lib目录,运行jimage list modules命令,查看模块镜像文件中的内容,确认所有依赖模块都已包含。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 08:18:22