2016-09-30 106 views
0

我的java使用ProcessBuilder运行几个使用其他jar添加到资源中的命令。ProcessBuilder在包装jar上调用java -jar失败

它工作正常,在Eclipse中,但一旦我把它出口到可执行的JAR,这是行不通的:

//Defs Class has this line 
public final static String APKTOOLS_JAR_PATH = Defs.class.getResource("/apktool.jar").getPath(); 

ProcessBuilder pb = new ProcessBuilder("java", "-jar", Defs.APKTOOLS_JAR_PATH, "d", apkPath, "-o", decodePath, "-f"); 
pb.redirectError(Redirect.INHERIT); 
Process p = pb.start(); 

我回去:

Error: Unable to access jarfile apktool.jar 
+0

apktool.jar可能实际上是不对的地方它需要。试着把它放在主要的旁边? –

+0

只是猜测在这里 - 但是在getResource行中的前导“/” - 可能将其删除? (使用绝对路径名和相对路径).. – FreudianSlip

+0

URL **的getPath()方法不会将URL转换为有效的文件名。改为使用'Paths.get(Defs.class.getResource(“/ apktool.jar”)toURI())。toString()'。请注意,从.jar运行时,这会失败,因为.jar中的资源根本不是单独的文件。在这种情况下,您需要将其从.jar中复制出来;我建议将其复制到[临时文件](http://docs.oracle.com/javase/8/docs/api/java/nio/file/Files.html#createTempFile-java.lang.String-java.lang .String-java.nio.file.attribute.FileAttribute ...-)。 – VGR

回答

0

如果您在apktool.jar与您的java类运行的目录相同

public final static String APKTOOLS_JAR_PATH = Defs.class.getResource("apktool.jar").getPath(); 

从何处获取相对路径的罐子

,但如果你想要的是从一个绝对路径斜线加载/应该做的

public final static String APKTOOLS_JAR_PATH = Defs.class.getResource("/home/user/myjars/apktool.jar").getPath(); 

其中斜线视为绝对路径