与 TomcatServer 同时启动 JavaFX 应用程序

Thr*_*est 0 java tomcat javafx

我创建了一个项目,需要一个 tomcat 服务器来托管一个小网站。现在我想向该项目添加一个 JavaFX 应用程序。这也应该在 Tomcat 启动时启动,但不幸的是没有任何反应。FX 已添加到项目库中。

public class Start {
    
    public static void main( String args[] )
    {
        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( );
            
            ConfigurationGui config = new ConfigurationGui();
            Stage stage = new Stage();
            config.start(stage);
            
        }
        catch ( Exception e )
        {
            e.printStackTrace( );
        }
    }

}
Run Code Online (Sandbox Code Playgroud)

应用级:

import javafx.application.Application;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.layout.BorderPane;
import javafx.stage.Stage;

public class ConfigurationGui extends Application {

    @Override
    public void start(Stage primaryStage) throws Exception {
        Parent root = new BorderPane();
        Scene scene = new Scene(root,400,400);
        scene.getStylesheets().add(getClass().getResource("application.css").toExternalForm());
        primaryStage.setScene(scene);
        primaryStage.show();
        
    }

}

Run Code Online (Sandbox Code Playgroud)

jew*_*sea 6

启动时不要等待()

这就是await()对 tomcat 服务器所做的事情:

等待收到正确的关闭命令,然后返回。

您声明希望在应用程序运行时 Tomcat 服务器也运行。因此,您不应在启动 JavaFX 应用程序之前等待服务器关闭。

使用 JavaFX 应用程序生命周期

start()不应在 JavaFX 应用程序上直接调用,而launch()应调用应用程序方法来启动应用程序。应该这样做,以便 JavaFX 应用程序和系统遵循 JavaFX 应用程序生命周期,如Applicationjavadoc 中所述。

可能还会将 tomcat 初始化代码移至 appinit()方法中并存储 tomcat 服务器引用,以便稍后可以向其发送消息(例如,在不再需要时将其关闭)。

如果您想在应用程序完成时正常关闭 Tomcat 服务器,请stop()从应用程序stop()方法中调用服务器方法。如果您愿意,您可以在拨打电话后等待服务器正常关闭,但以稳健的方式执行此操作超出了我在此讨论的范围。

您可能可以完全摆脱您的Start类,只需将 main 方法放在 JavaFX 应用程序类中,然后使用它来启动您的应用程序。

根据您想要的集成质量,您可能可以添加更多逻辑来很好地同步 JavaFX 应用程序生命周期与 Tomcat 服务器Lifecycle,详细讨论此类集成超出了本答案的范围。

不要src从代码中引用目录

src\main是项目目录而不是运行时位置,您不应src直接从代码中引用该目录。