我正在尝试从java程序执行以下命令:
java -jar /opt/plasma/fr.inria.plasmalab.plasmalab-1.3.4.jar -t -a montecarlo -A"Total samples"=1000 -m models/translated/plasma/NaCl2.rml:rml --format csv -r models/translated/plasma/NaCl2.bltl:bltl
使用以下代码:
String totalSample = "-A\"Total samples\"=1000";
String mcCommand = "java -jar " + MChecker.getAppPath() + " -t "
+ "-a " + "montecarlo " + totalSample
+ " -m " + mcModelRelPath + ":rml " + "--format " + "csv "
+ "-r " + customQueryRelPath + ":bltl";
Process process = Runtime.getRuntime().exec(mcCommand);
int errCode = process.waitFor();
//then get the output, and error
但是会导致以下错误: 错误的参数说明:动态参数需要a = b但得到的值:"总计
我在终端中运行了相同的命令,它没有任何问题。但是当我在Java中创建命令并尝试调用该工具时,它不起作用。
我认为由于totalSample
参数包含空格而感到困惑。我接下来做的是把#34; \"在参数(String totalSample = "-A\"Total\\ samples\"=1000";
)中进行太空逃生,但它仍拒绝接受它。它给出了以下错误:
错误的参数说明:动态参数期望a = b形式的值但得到:"总计\
然后我使用ProcessBuilder对象运行相同的参数,如下所示:
String[] mcCommand = {"java", "-jar", MChecker.getAppPath(), "-t",
"-a", "montecarlo",totalSample, "-m",
mcModelRelPath + ":rml", "--format", "csv", "-r",
customQueryRelPath + ":bltl" };
ProcessBuilder pb = new ProcessBuilder(mcCommand);
Process process = pb.start();
process.waitFor();
但它仍然无效并抛出一些自定义异常。
我目前没有选择 - 你知道为什么这个命令不适用于Java,当它从终端接口工作得很好时?
BTW:我在Windows上运行了相同的代码,但是我必须在Ubuntu OS上运行此代码。非常感谢
答案 0 :(得分:0)
奇怪的是,Java Process和ProcessBuilder类无法正确传递参数。我不知道为什么,但因为我能够从终端执行命令。我决定先调用终端,然后执行命令。因此,我改变了我的命令,如下所示
String mcCommand[] = {
"/bin/sh",
"-c",
"java -jar /opt/plasma/fr.inria.plasmalab.plasmalab-1.3.4.jar -t -a montecarlo "+totalSample+" -m models/translated/plasma/NaCl2.rml:rml --format csv -r models/translated/plasma/NaCl2.bltl:bltl" };
尽管它是依赖于平台的解决方案,但目前对我来说还是可以的。
答案 1 :(得分:0)
使用Total samples
时,请勿为ProcessBuilder
添加额外的引号:
ProcessBuilder pb = new ProcessBuilder("java", "-jar", MChecker.getAppPath(), "-t",
"-a", "montecarlo", "-ATotal samples=1000",
"-m", mcModelRelPath + ":rml", "--format", "csv",
"-r", customQueryRelPath + ":bltl");
//...