2016-09-30 8 views
0

My 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(); 

相対パスからjarをとります

いますが、それは絶対パス先頭のスラッシュからロードされるようにしたい場合は/

先頭のスラッシュは絶対パスとみなさ
public final static String APKTOOLS_JAR_PATH = Defs.class.getResource("/home/user/myjars/apktool.jar").getPath(); 

関連する問題