2

我正在尝试从 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[],但得到了相同的结果。转义空格也会导致错误。

有人知道我该如何解决这个问题吗?

谢谢。

4

1 回答 1

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 来调用,所以我检查了文档,它显然只是使用 aStringTokenizer分割空格。Java 会拆分您的命令参数,即使它们用双引号括起来。因此,除了解决上述反斜杠问题之外,您还需要使用exec接受String[]. 而且您不需要双引号包含空格的参数。

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);
于 2013-01-25T17:21:51.647 回答