从Java运行Java应用程序,并在.jar文件路径中使用空格

时间:2013-01-25 17:15:42

标签: java

我正在尝试从Java应用程序中运行Java CUP(LEX / YACC解析器的Java版本)。

这是我的代码(我从互联网上复制了大部分代码):

String command  = "java " +
                  "-jar " +
                  "\"g:My Documents\\Dropbox\\Final Project\\Code\\Mano CPU\\Inputs\\Parser\\java-cup-11a.jar\" " +
                  "-destdir " +
                  "\"g:\\My Documents\\Dropbox\\Final Project\\Code\\Mano CPU\\src\\Assembler\" " +
                  "\"G:\\My Documents\\Dropbox\\Final Project\\Code\\Mano CPU\\Inputs\\Assembler\\Assembler.cup\"";

Process p = Runtime.getRuntime().exec(command);
BufferedReader reader=new BufferedReader(new InputStreamReader(p.getInputStream()));
String line=reader.readLine();
while(line!=null)
{
    System.out.println(line);
    line=reader.readLine();
}

当我在Win 7的命令提示符中运行此命令时(没有转义反斜杠和双键),它将被执行。如果我在“-jar”之后注释掉所有内容,我会得到java选项(这是预期的,因为命令是非法的),所以我知道它可以运行。

我的猜测是,传递带空格的路径是个问题。我尝试使用String [],但我得到了相同的结果。转义空格也会导致错误。

有没有人知道如何解决这个问题?

感谢。

1 个答案:

答案 0 :(得分:3)

看起来你错过了jar路径中的第一个反斜杠:

String command  = "java " +
                  "-jar " +
                  "\"g:My Documents\\Dropbox\\Final Project\\Code\\Mano CPU\\Inputs\\Parser\\java-cup-11a.jar\" " +

应该是

String command  = "java " +
                  "-jar " +
                  "\"g:\\My Documents\\Dropbox\\Final Project\\Code\\Mano CPU\\Inputs\\Parser\\java-cup-11a.jar\" " +
                       ^^

编辑: millimoose指出Runtime#exec(String)没有使用shell来调用,所以我检查了文档,显然只是使用StringTokenizer分隔空格。即使它们用双引号括起来,Java也会拆分你的命令参数。因此,除了修复上面的反斜杠问题之外,您还需要使用接受String[]的{​​{3}}形式。而且你不需要双引号包含空格。

String[] command = new String[] {
                       "java",
                       "-jar",
                       "g:\\My Documents\\Dropbox\\Final Project\\Code\\Mano CPU\\Inputs\\Parser\\java-cup-11a.jar",
                       "-destdir",
                       "g:\\My Documents\\Dropbox\\Final Project\\Code\\Mano CPU\\src\\Assembler",
                       "G:\\My Documents\\Dropbox\\Final Project\\Code\\Mano CPU\\Inputs\\Assembler\\Assembler.cup",
                   };

Process p = Runtime.getRuntime().exec(command);