[英]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 個進程。
也許這個鏈接:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.