我想用2 projectB从一个projectA执行一个ProcessBuilder。它可以工作,但我必须先注释一下ProcessBuilder才能执行第二个。
这里是我的第一个代码(只有一个名为F04_C.java的文件)
@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>() {
// override createTask() method
@Override
protected Task<Integer> createTask() {
return new Task<Integer>() {
// override call() method
@Override
protected Integer call() throws Exception {
// first ProcessBuilder
ProcessBuilder process01 = new ProcessBuilder("/usr/bin/javac", "-d", "./out", "../JavaFX_Test01_Hello_Devstory/src/module-info.java", "../JavaFX_Test01_Hello_Devstory/src/application/Main.java");
// second ProcessBuilder
ProcessBuilder process01 = new ProcessBuilder("/usr/bin/java", "-p", "./out", "-m", "JavaFX_Test01_Hello_Devstory/application.Main");
return process01
.inheritIO()
.start()
.waitFor();
}
};
}
};
// step start Service
serviceB = service01;
serviceB.start();
}已经说过:
我不得不评论第一或第二ProcessBuilder,我不能运行程序与两种指令。因此,经过研究,我找到了一个链接,以帮助我实现我的目标。How to return 2 values from a Java method?
它告诉我们创建一个类(最好的方法)来返回我想返回的实例。
因此,使用上面的链接,我编写了一个类来返回2 ProcessBuilder
我向您展示了类文件和更新的F04_C.java文件。
package application.model;
public class ClassPB {
//
private ProcessBuilder pb01 = new ProcessBuilder();
private ProcessBuilder pb02 = new ProcessBuilder();
// constructeur(s)
public ClassPB(ProcessBuilder p_pb01, ProcessBuilder p_pb02) {
this.pb01 = p_pb01;
this.pb02 = p_pb02;
}
// getter(s)
public ProcessBuilder getPB01() {
return this.pb01;
}
public ProcessBuilder getPB02() {
return this.pb02;
}
}更新的F04_C.java
@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>() {
// override createTask() method
@Override
protected Task<Integer> createTask() {
return new Task<Integer>() {
// override call() method
@Override
protected Integer call() throws Exception {
ClassPB pbCombines = something();
return pbCombines;
}
};
}
};
serviceB = service01;
serviceB.start();
}
public static ClassPB something() {
ProcessBuilder pb01 = new ProcessBuilder("/usr/bin/javac", "-d", "./out", "../JavaFX_Test01_Hello_Devstory/src/module-info.java", "../JavaFX_Test01_Hello_Devstory/src/application/Main.java");
ProcessBuilder pb02 = new ProcessBuilder("/usr/bin/java", "-p", "./out", "-m", "JavaFX_Test01_Hello_Devstory/application.Main");
try {
pb01
.inheritIO()
.start()
.waitFor();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
pb02
.inheritIO()
.start()
.waitFor();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return new ClassPB(pb01, pb02);
}但是现在我有一个问题:我必须返回一个Integer,我不知道如何解决这个问题。有什么建议线索吗?
谢谢
发布于 2022-10-03 09:58:52
好吧,我自己回答。
我找到了一个解决方案,也许不是一个很好的解决方案,但它有效。
类文件ClassPB没有更改,我也没有发布它。
我将F04_C.java文件更改如下:
中返回
以下是代码:
@FXML
private void executerFichierJava02() {
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 {
ClassPB pbCombines = retourner2ProcessBuilder("/usr/bin/javac",
"-d",
"./out",
"../JavaFX_Test01_Hello_Devstory/src/module-info.java",
"../JavaFX_Test01_Hello_Devstory/src/application/Main.java",
"/usr/bin/java",
"-p",
"./out",
"-m",
"JavaFX_Test01_Hello_Devstory/application.Main");
// state class variable scope to follow
// state of service01
// if everything is okay, setted to 1, 2 then 3
return state;
}
};
}
};
service01.setOnReady(event -> {
// not displayed into console
System.out.println("service 01 ready");
System.out.println("value of state: " + state);
System.out.println("value of getException(): " + service01.getException());
System.out.println("value of getValue(): " + service01.getValue());
});
service01.setOnScheduled(event -> {
System.out.println("service 01 scheduled");
state = 1;
System.out.println("value of state: " + state);
System.out.println("value of getException(): " + service01.getException());
System.out.println("value of getValue(): " + service01.getValue());
});
service01.setOnRunning(event -> {
System.out.println("service 01 running...");
state = 2;
System.out.println("value of state: " + state);
System.out.println("value of getException(): " + service01.getException());
System.out.println("value of getValue(): " + service01.getValue());
});
service01.setOnSucceeded(event -> {
System.out.println("service 01, state, success");
System.out.println("service 01, state, finished");
state = 3;
System.out.println("value of state: " + state);
System.out.println("value of getException(): " + service01.getException());
System.out.println("value of getValue(): " + service01.getValue());
});
service01.setOnFailed(event -> {
System.out.println("service 01, state, failed");
System.err.println("service failed");
state = 4;
System.out.println("value of state: " + state);
service01.getException().printStackTrace();
System.out.println("value of getException(): " + service01.getException());
System.out.println("value of getValue(): " + service01.getValue());
});
service01.setOnCancelled(event -> {
System.out.println("service 01, state, cancelled");
state = 5;
System.out.println("value of state: " + state);
System.out.println("value of getException(): " + service01.getException());
System.out.println("value of getValue(): " + service01.getValue());
});
// --------------------------------------------------------
// start Service
serviceB = service01;
serviceB.start();
}
// =======================================================
// methode 07C
public static ClassPB retourner2ProcessBuilder(String p01,
String p02,
String p03,
String p04,
String p05,
String p06,
String p07,
String p08,
String p09,
String p10) {
// ProcessBuilder pb01 = new ProcessBuilder("/usr/bin/javac", "-d", "./out", "../JavaFX_Test01_Hello_Devstory/src/module-info.java", "../JavaFX_Test01_Hello_Devstory/src/application/Main.java");
ProcessBuilder pb01 = new ProcessBuilder(p01, p02, p03, p04, p05);
// ProcessBuilder pb02 = new ProcessBuilder("/usr/bin/java", "-p", "./out", "-m", "JavaFX_Test01_Hello_Devstory/application.Main");
ProcessBuilder pb02 = new ProcessBuilder(p06, p07, p08, p09, p10);
try {
pb01
.inheritIO()
.start()
.waitFor();
} catch (InterruptedException except) {
except.printStackTrace();
} catch (IOException except) {
except.printStackTrace();
}
try {
pb02
.inheritIO()
.start()
.waitFor();
} catch (InterruptedException except) {
except.printStackTrace();
} catch (IOException except) {
except.printStackTrace();
}
return new ClassPB(pb01, pb02);
}我试着说清楚我的英语。我希望你能理解,因为我翻译了几个句子。
retourner2ProcessBuilder()有10个args:
5用于第一次ProcessBuilder
5用于第二次ProcessBuilder
其目标是:
读取带有所有项目的settings.properties文件,并能够运行我的主要项目。
谢谢。
再见
https://stackoverflow.com/questions/73924557
复制相似问题