簡體   English   中英

從 JavaFX 項目 A 運行 JavaFX 項目 B

[英]run JavaFX project B from JavaFX project A

01:目標

我想從 JavaFX 項目 A 運行 JavaFX 項目 B

02:配置

linux,eclipse,打開JDK17

03:信息

當我運行 Java 項目 B(HelloWorld 打印到控制台)時,項目 A 編譯、運行並運行項目 B,它可以工作

這里的說明:

//
ProcessBuilder process01 = new ProcessBuilder("/usr/bin/java", "HelloWorld.java");

//
process01.directory(new File("../HelloWorld/src/org/example/"));

//
return process01
    .inheritIO()
    .start()
    .waitFor();

04:信息

JavaFX 項目 B 只是一個帶有 Button 和 TextField 的 Stage,單擊 Button 並且日期出現在 TextField 中。

05:信息

我嘗試使用 Liberica Full JDK 18,使用 Oracle JDK 18

06:信息

我試圖將 JRE 更改為 eclipse

07:信息

我試圖將項目 B 添加到 ClassPath 的項目 A

我試圖將項目 B 添加到 ModulePath 的項目 A

08:從JavaFX項目A運行JavaFX項目B的代碼(多次嘗試,都不行)

@FXML
    private void executerFichierJava02() {
        
        //
        System.out.println("");
        System.out.println("method: executerFichierJava02()");
        System.out.println("create 1 Service and 1 Task");
        System.out.println("return 1 ProcessBuilder to");
        System.out.println("execute 1 Java class (from project JavaFX_Test02_Desvstory)");
        
        final Service<Integer> service01 = new Service<Integer>() {
            
            // --- step 03, override createTask() method
            @Override
            protected Task<Integer> createTask() {
                
                return new Task<Integer>() {
                    
                    // --- step 04, override call() method
                    @Override
                    protected Integer call() throws Exception {
                        
                        // Java link: /usr/lib/jvm/java-17-openjdk-amd64/bin/java
                        
                        // JRE java-17-openJDK
                        
                        /*
                        try {
                            // Class.forName("applicationShowDate.Main.java");
                            // Class.forName("/media/sambano/home_HDD_EXTERNE/Documents/java/workspace_eclipse/JavaFX_Test02_Desvstory/src/applicationShowDate/Main.java");
                        }
                        catch (ClassNotFoundException cnfe) {
                            cnfe.printStackTrace();
                        }
                        */
                        
                        // compilation: 14 errors
                        // ProcessBuilder process01 = new ProcessBuilder("/usr/bin/javac", "Main.java");
                        
                        // service 01, failed
                        // ProcessBuilder process01 = new ProcessBuilder("/usr/bin/java --module-path /usr/lib/jvm/java-17-openjdk-amd64/lib/jrt-fs.jar\" --add-modules=javafx.controls.jar --add-modules=javafx.base.jar --add-modules=javafx.fxml.jar --add-modules=javafx.graphics.jar --add-modules=javafx.media.jar --add-modules=javafx.swing.jar --add-modules=javafx.web", "Main.java");
                        
                        // service 01, failed
                        // ProcessBuilder process01 = new ProcessBuilder("/usr/bin/java --module-path /usr/lib/jvm/java-17-openjdk-amd64/lib/jrt-fs.jar --add-modules=javafx.controls.jar --add-modules=javafx.base.jar --add-modules=javafx.fxml.jar --add-modules=javafx.graphics.jar --add-modules=javafx.media.jar --add-modules=javafx.swing.jar --add-modules=javafx.web", "Main.java");
                        
                        // service 01, failed
                        // ProcessBuilder process01 = new ProcessBuilder("/usr/bin/java --module-path /usr/lib/jvm/java-17-openjdk-amd64/lib/jrt-fs.jar --add-modules=javafx.controls.jar --add-modules=javafx.base.jar --add-modules=javafx.fxml.jar --add-modules=javafx.graphics.jar --add-modules=javafx.media.jar --add-modules=javafx.swing.jar --add-modules=javafx.web, --add-modules=javafx-swt.jar", "Main.java");
                        
                        // service 01, failed
                        // ProcessBuilder process01 = new ProcessBuilder("/usr/bin/javac --module-path /usr/lib/jvm/java-17-openjdk-amd64/lib/jrt-fs.jar\" --add-modules=javafx.controls.jar --add-modules=javafx.base.jar --add-modules=javafx.fxml.jar --add-modules=javafx.graphics.jar --add-modules=javafx.media.jar --add-modules=javafx.swing.jar --add-modules=javafx.web", "Main.java");
                        
                        // service 01, failed
                        // ProcessBuilder process01 = new ProcessBuilder("/usr/bin/javac -cp /usr/lib/jvm/java-17-openjdk-amd64/lib/jrt-fs.jar:/usr/lib/jvm/liberica_full_JDK18/lib/javafx.controls.jar:/usr/lib/jvm/liberica_full_JDK18/lib/javafx.base.jar:/usr/lib/jvm/liberica_full_JDK18/lib/javafx.fxml.jar:/usr/lib/jvm/liberica_full_JDK18/lib/javafx.graphics.jar:/usr/lib/jvm/liberica_full_JDK18/lib/javafx.media.jar:/usr/lib/jvm/liberica_full_JDK18/lib/javafx.swing.jar:/usr/lib/jvm/liberica_full_JDK18/lib/javafx.web", "Main.java");
                        
                        // service 01, failed
                        // ProcessBuilder process01 = new ProcessBuilder("/usr/bin/java --module-path /usr/lib/jvm/java-17-openjdk-amd64/lib/jrt-fs\" --add-modules=javafx.controls --add-modules=javafx.base --add-modules=javafx.fxml --add-modules=javafx.graphics --add-modules=javafx.media --add-modules=javafx.swing --add-modules=javafx.web", "Main.java");
                        
                        // service 01, failed
                        // ProcessBuilder process01 = new ProcessBuilder("/usr/bin/java --module-path /usr/lib/jvm/java-17-openjdk-amd64/lib/jrt-fs --add-modules=javafx.controls --add-modules=javafx.base --add-modules=javafx.fxml --add-modules=javafx.graphics --add-modules=javafx.media --add-modules=javafx.swing --add-modules=javafx.web, --add-modules=javafx-swt", "Main.java");
                        
                        // compilation: 14 errors
                        ProcessBuilder process01 = new ProcessBuilder("/usr/bin/java", "Main.java");
                        
                        //
                        // process01.directory(new File("/media/sambano/home_HDD_EXTERNE/Documents/java/workspace_eclipse/JavaFX_Test02_Desvstory/src/applicationShowDate/"));
                        
                        //
                        process01.directory(new File("../JavaFX_Test02_Desvstory/src/applicationShowDate/"));
                        
                        //
                        return process01
                                .inheritIO()
                                .start()
                                .waitFor();
                        
                    }
                    
                };
                
            }
            
        };
        
        // --------------------------------------------------------
        
        //
        service01.setOnReady(event -> {
            System.out.println("service 01 ready");
            
        });
        service01.setOnScheduled(event -> {
            System.out.println("service 01 scheduled");
        });
        service01.setOnRunning(event -> {
            System.out.println("service 01 running...");
        });
        service01.setOnSucceeded(event -> {
            System.out.println("service 01, success");
        });
        service01.setOnFailed(event -> {
            System.out.println("service 01, failed");
        });
        service01.setOnCancelled(event -> {
            System.out.println("service 01, cancelled");
        });
        
        // --------------------------------------------------------
        
        serviceB = service01;
        serviceB.start();
        
    }

這里的跟蹤顯示 14 個錯誤:


method: executerFichierJava02()
create 1 Service and 1 Task
return 1 ProcessBuilder to
execute 1 Java class (from project JavaFX_Test02_Desvstory)
par le callback, service 01 scheduled
par le callback, service 01 running...
Main.java:3: error: package javafx.application does not exist
import javafx.application.Application;
                         ^
Main.java:4: error: package javafx.fxml does not exist
import javafx.fxml.FXMLLoader;
                  ^
Main.java:5: error: package javafx.stage does not exist
import javafx.stage.Stage;
                   ^
Main.java:6: error: package javafx.scene does not exist
import javafx.scene.Parent;
                   ^
Main.java:7: error: package javafx.scene does not exist
import javafx.scene.Scene;
                   ^
Main.java:8: error: package javafx.scene.layout does not exist
import javafx.scene.layout.BorderPane;
                          ^
Main.java:11: error: cannot find symbol
public class Main extends Application {
                          ^
  symbol: class Application
Main.java:14: error: cannot find symbol
    public void start(Stage primaryStage) {
                      ^
  symbol:   class Stage
  location: class Main
Main.java:13: error: method does not override or implement a method from a supertype
    @Override
    ^
Main.java:17: error: cannot find symbol
            Parent root = FXMLLoader.load(getClass().getResource("/applicationShowDate/fenetrePrincipale.fxml"));
            ^
  symbol:   class Parent
  location: class Main
Main.java:17: error: cannot find symbol
            Parent root = FXMLLoader.load(getClass().getResource("/applicationShowDate/fenetrePrincipale.fxml"));
                          ^
  symbol:   variable FXMLLoader
  location: class Main
Main.java:17: error: cannot find symbol
            Parent root = FXMLLoader.load(getClass().getResource("/applicationShowDate/fenetrePrincipale.fxml"));
                                          ^
  symbol:   method getClass()
  location: class Main
Main.java:24: error: cannot find symbol
            primaryStage.setScene(new Scene(root));
                                      ^
  symbol:   class Scene
  location: class Main
Main.java:33: error: cannot find symbol
        launch(args);
        ^
  symbol:   method launch(String[])
  location: class Main
14 errors
error: compilation failed
par le callback, service 01, etat, success

許多評論向您展示,我嘗試過的說明。

正如我所說,我已經嘗試更改 JDK,JRE,將 JavaFX 項目 B 設置為 ClassPath 和/或 ModulePath 的 JavaFX 項目 A。

我也試過這個鏈接

https://openjfx.io/openjfx-docs/#install-javafx

嘗試進入終端但未更改 PATH_TO_FX

這里是命令行:


java --module-path /media/sambano/home_HDD_EXTERNE/Documents/java/workspace_eclipse/JavaFX_Test29_Threads_Services_Processes/utilitaires/javafx-sdk-18.0.1/lib --add-modules javafx.controls,javafx.fxml,javafx.base,javafx.graphics /media/sambano/home_HDD_EXTERNE/Documents/java/workspace_eclipse/JavaFX_Test29_Threads_Services_Processes/src/application/Main.java

我用它的 JRE 回到 openJDK17,從 ModulePath 和 ClassPath 的項目 A 中刪除了 JavaFX 項目 B,只是為了得到一個干凈的情況(以避免誤解)。

我不想用。jar

有沒有辦法告訴我一步一步達到目標? 有什么建議嗎? 或想法?

謝謝你。

我自己回答

與 Liberica:它有 JavaFX 二進制文件

@FXML
    private void executerFichierJava02() {
        
        //
        System.out.println("");
        System.out.println("method: executerFichierJava02()");
        System.out.println("create 1 Service and 1 Task");
        System.out.println("return 1 ProcessBuilder to");
        System.out.println("execute 1 Java class (from project JavaFX_Test02_Desvstory)");
        
        final Service<Integer> service01 = new Service<Integer>() {
            
            // --- step 03, override createTask() method
            @Override
            protected Task<Integer> createTask() {
                
                return new Task<Integer>() {
                    
                    // --- step 04, override call() method
                    @Override
                    protected Integer call() throws Exception {
                        
                        //-------------------------------------------------
                        //
                        ProcessBuilder process02 = new ProcessBuilder();
                        
                        // cree 1 vue de l'environnement de process02
                        Map<String, String> vue02 = process02.environment();
                        
                        // verif de l'environnement par la console
                        for (Map.Entry<String, String> entree :
                             vue02.entrySet()) {
                            // affiche cké et valeur separement
                            System.out.println("Key = " + entree.getKey()
                                               + ", Value = "
                                               + entree.getValue());
                        }
                        //--------------------------------------------------

                        // 07: fonctionne
                        // chemins absolus
                        // aussi ds eclipse que ds le terminal
                        // trouver 1 moyen de retourner les 2 ProcessBuilder
                        // lien: https://stackoverflow.com/questions/2832472/how-to-return-2-values-from-a-java-method
                        // ProcessBuilder process01 = new ProcessBuilder("/usr/bin/javac", "-d", "./out", "/media/sambano/home_HDD_EXTERNE/Documents/java/workspace_eclipse/JavaFX_Test01_Hello_Devstory/src/module-info.java", "/media/sambano/home_HDD_EXTERNE/Documents/java/workspace_eclipse/JavaFX_Test01_Hello_Devstory/src/application/Main.java");
                        ProcessBuilder process01 = new ProcessBuilder("/usr/bin/java", "-p", "./out", "-m", "JavaFX_Test01_Hello_Devstory/application.Main");
                        
                        //
                        return process01
                                .inheritIO()
                                .start()
                                .waitFor();
                        
                    }
                    
                };
                
            }
            
        };
        
        // --------------------------------------------------------
        
        //
        // 2° possibilité, en utilisant des callbacks
        service01.setOnReady(event -> {
            System.out.println("par le callback, service 01 ready");
            
        });
        service01.setOnScheduled(event -> {
            System.out.println("par le callback, service 01 scheduled");
        });
        service01.setOnRunning(event -> {
            System.out.println("par le callback, service 01 running...");
        });
        service01.setOnSucceeded(event -> {
            System.out.println("par le callback, service 01, etat, success");
        });
        service01.setOnFailed(event -> {
            System.out.println("par le callback, service 01, etat, failed");
            System.err.println("echec du service");
            service01.getException().printStackTrace();
        });
        service01.setOnCancelled(event -> {
            System.out.println("par le callback, service 01, etat, cancelled");
        });
        
        // --------------------------------------------------------
        
        // demarrer l'instance de Service
        // la variable portée class
        // prend la valeur de la variable portée locale
        serviceB = service01;
        
        // on demarre l'instance service de Service
        serviceB.start();       
        
    }

現在我需要找到如何返回 2 個進程。

也許這個鏈接:

如何從 Java 方法返回 2 個值?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM