01:目标
我想从一个JavaFX项目A运行一个JavaFX项目B
02: config
linux,eclipse,openJDK17
03:信息
当我运行Java (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只是一个带有按钮和TextField的阶段,单击Button,日期就会出现在TextField中。
05:信息
我尝试了Liberica完全JDK 18,Oracle JDK 18
06: information
我试图将JREs转换为eclipse。
07: information
我试图将项目B添加到ClassPath的项目A中
我试图将项目B添加到ModulePath的项目A中
08:从JavaFX项目A运行JavaFXproject 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、JREs设置为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
有什么方法可以告诉我一步一步地达到目标吗?有什么建议吗?或者想法?
谢谢。
发布于 2022-09-02 17:30:09
我自己回答
它有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个进程。
也许这个链接:
https://stackoverflow.com/questions/73455575
复制相似问题