从java执行命令,其中可能包含空格

时间:2015-07-21 16:38:19

标签: java command-line command-line-arguments processbuilder shellexecute

我正在尝试从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上运行此代码。

非常感谢

2 个答案:

答案 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");
//...