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

Tomcat启动时JavaFX应用未同步启动的问题求助

问题解决:Tomcat启动后JavaFX窗口不显示

你的问题出在两个核心点上:

1. Tomcat的await()方法阻塞了主线程

tomcat.getServer().await()是阻塞方法,它会持续占用主线程,直到Tomcat服务器停止,这就导致该行代码之后的JavaFX启动逻辑完全没有执行机会。

2. JavaFX应用启动方式错误

JavaFX应用不能直接通过new ConfigurationGui().start(stage)初始化,必须使用Application.launch()方法触发,或者在JavaFX专属的应用线程中创建UI组件。

修改后的启动类代码

public class Start {
    
    public static void main(String args[]) {
        try {
            // 将Tomcat启动逻辑放入独立线程,避免阻塞主线程
            new Thread(() -> {
                try {
                    Tomcat tomcat = new Tomcat();
                    String webappDirectory = new File("src/main/webapp").getAbsolutePath();
                    tomcat.setPort(8080);
                    Context context = tomcat.addWebapp("", webappDirectory);
                    Tomcat.addServlet(context, "blockchain", new ServletContainer(new Applications()));
                    context.addServletMappingDecoded("/blockchain/api/*", "blockchain");
                    tomcat.start();
                    tomcat.getServer().await();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }).start();

            // 按JavaFX规范启动应用
            Application.launch(ConfigurationGui.class, args);
            
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

额外注意事项

  • 若项目为模块化结构(使用module-info.java),需在模块声明中添加JavaFX依赖:
module your.module.name {
    requires javafx.controls;
    requires javafx.fxml;
    // 同时添加Tomcat相关模块依赖,如tomcat.core、tomcat.servlet等
    exports your.package.name; // 导出ConfigurationGui所在的包
}
  • 确保JavaFX库已正确添加到项目编译和运行时的类路径中。

修改后,Tomcat会在后台线程启动运行,主线程专注于初始化JavaFX应用,两者就能同步正常工作了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 12:05:21