我正在尝试从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 [],但我得到了相同的结果。转义空格也会导致错误。
有没有人知道如何解决这个问题?
感谢。
答案 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);