使用.jar文件路径中的空格从Java运行Java应用程序
我试图在Java应用程序中运行Java CUP(LEX/YACC解析器的Java版本) 这是我的代码(我从互联网上复制了大部分代码): 当我在Win7的命令提示符下运行这个命令时(不跳过反斜杠和双引号),它就会被执行。如果我在“-jar”之后注释掉所有内容,我会得到java选项(这是预期的,因为该命令是非法的),因此我知道它可以运行 我的猜测是,通过带有空格的路径才是问题所在。我尝试使用字符串[],但得到了相同的结果。转义空格也会导致错误 有人知道我如何解决这个问题吗使用.jar文件路径中的空格从Java运行Java应用程序,java,Java,我试图在Java应用程序中运行Java CUP(LEX/YACC解析器的Java版本) 这是我的代码(我从互联网上复制了大部分代码): 当我在Win7的命令提示符下运行这个命令时(不跳过反斜杠和双引号),它就会被执行。如果我在“-jar”之后注释掉所有内容,我会得到java选项(这是预期的,因为该命令是非法的),因此我知道它可以运行 我的猜测是,通过带有空格的路径才是问题所在。我尝试使用字符串[],但得到了相同的结果。转义空格也会导致错误 有人知道我如何解决这个问题吗 谢谢。看起来您缺少jar路
谢谢。看起来您缺少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\" " +
^^
Edit:millimoose指出它不使用shell来调用,所以我查看了文档,它显然只使用了一个来拆分空格。Java将拆分您的命令参数,即使它们用双引号括起来。因此,除了修复上面的反斜杠问题外,还需要使用接受
字符串[]
的形式。并且不需要双引号引用包含空格的参数
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);
您缺少反斜杠(
g:My Documents
)。我手头没有Windows来测试这是否合法,但我认为不合法。我不确定在使用Runtime.exec()
时是否有必要包含转义引号,因为它不通过shell。)@millimoose啊!谢谢,我不知道。事实上,[Runtime#exec(String)](显然只是使用StringTokenizer分割命令字符串,所以OP需要使用[Runtime#exec(String[])](取而代之的是。1.至于缺少的反斜杠,它在我所做的许多更改中被删除了。修复它没有任何作用。2.没有转义引号,我得到了一个“null”异常。3.从一个字符串切换到字符串数组时没有任何更改。第一个参数中的反斜杠在粘贴所有副本时被意外删除。添加它可以吗esn不能解决这个问题。使用字符串数组也不能解决这个问题(如原文章所述)。当使用只有一个字符串的数组时,我得到一个错误,表明无法找到指定的文件,这比以前的尝试要好得多。好的。你能发布你当时得到的错误的stacktrace吗?显然我没有输出,但我需要的文件仍然被创建了。啊,奇怪。很高兴它现在可以工作了。也许进程输出如此关于错误流的方法?这是一个CUP编译,我相信它会在标准数据流上输出。我会检查标准数据。
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);