我在java中执行一个jar文件。到目前为止,我的代码完美无缺。
我通过java执行epubcheck,因为它是一个控制台应用程序
这是epubcheck的地址
https://github.com/IDPF/epubcheck
除非我需要浏览的文件的名称包含 ' 标志 和文件夹上的文件夹名称或空格上的空格。
这是文件夹名称
的错误Unrecognized argument: 'Files\1.epub'
这是文件名包含'
时的错误Unrecognized argument: 'the'
这是我的代码
String a = System.getProperty("user.dir") + "\\epubcheck-4.0.1\\" + "epubcheck.jar";
Process p = Runtime.getRuntime().exec("java -jar" + " " + a + " " + selectedFile.getAbsolutePath());
这是如何运行epubchecker
java -jar epubcheck.jar file.epub
但是当我在命令提示符下手动运行它时,它没有给我一个错误
答案 0 :(得分:4)
您应该引用构成命令行的标记。使用.exec(String[])
版本
Runtime.getRuntime().exec(new String[]{"java"
, "-jar"
, a
, selectedFile.getAbsolutePath()});
答案 1 :(得分:1)
在命令字符串中添加引号不起作用。
exec(String, ...)
的javadoc说:
更准确地说,命令字符串使用调用
StringTokenizer
创建的new StringTokenizer(command)
分解为标记,而不进一步修改字符类别。然后,由标记生成器生成的标记以相同的顺序放置在新的字符串数组cmdarray
中。
如果您再查看StringTokenizer
的javadoc,它会说:
StringTokenizer方法不区分标识符,数字和带引号的字符串,也不识别和跳过注释。
和
tokenizer [由
new StringTokeniser(string)
生成]使用默认分隔符集,即" \吨\ n \ r \ F"
换句话说,exec
会将命令字符串拆分为参数,忽略任何引用。
任何引号(或双反斜杠转义)都将被视为正常字符。例如:
exec("java -jar \"C:/Users/My User Name/foo.jar\"");
将尝试查找名为"C:/Users/My
的JAR文件。是的......在路径名的开头有一个引号。
你可以自己做一下这个问题来避免这个问题; e.g。
exec(new String[]{"java",
"-jar",
"C:/Users/My User Name/foo.jar"});
请注意,没有添加引号。
如果(由于某种原因)您的应用程序提供了已引用的路径名,也可以使用shell来处理引用。例如(Linux / Unix / Mac OSX)
exec(new String[]{"bash",
"-c",
"java -jar \"/home/me/silly dir/foo.jar\""});