在java

时间:2016-06-01 07:05:46

标签: java jar

我在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

但是当我在命令提示符下手动运行它时,它没有给我一个错误

2 个答案:

答案 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\""});