2016-06-01 198 views
0

我在java中执行jar文件。到目前为止我的代码完美地工作在java中执行jar文件

IM通过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 

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

回答

4

你应该引用的是让你的命令行中的令牌。使用.exec(String[])版本

Runtime.getRuntime().exec(new String[]{"java" 
    , "-jar" 
    , a 
    , selectedFile.getAbsolutePath()}); 
+0

谢谢。你的代码完美无缺 – knowme

1

将引号添加到命令字符串不起作用。

exec(String, ...)的Javadoc这样说:

更确切地说,该命令串被分成使用由呼叫new StringTokenizer(command)与字符类别无需进一步修改创建StringTokenizer令牌。然后将令牌生成器生成的令牌以相同的顺序放入新字符串数组cmdarray中。

如果你再看看Javadoc文档StringTokenizer,它说:

StringTokenizer的方法不标识符,数字和引用字符串区分,它们也不识别和跳过注释。

标记生成器[由new StringTokeniser(string)产生]使用默认分隔符集,这是 “\吨\ n \ r \ F”。

换句话说,exec会将命令字符串拆分为参数,忽略任何引用。

任何引号(或双反斜杠转义符)将被简单地视为正式字符。例如:

exec("java -jar \"C:/Users/My User Name/foo.jar\""); 

将尝试查找名为"C:/Users/My的JAR文件。是的...在路径名的开头有一个引号。

你可以通过自己做论证来避免这个问题;例如

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