繁体   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