2017-10-09 24 views
1

コンパイラでいくつかのコードを実行していますが、ユーザーが適切なバイナリを呼び出すために使用しているオペレーティングシステムを問い合わせる必要があります。コードは動作し、IntelliJのバイナリを呼び出しますが、gradleを使ってjarファイルを作成すると、val tempBinaryCopyに対応する行に例外が見つからないファイル(バイナリファイル)が生成されます。ファイルはIntelliJで見つかりましたが、ビルドされたjarでは見つかりません

fun assemble(file: String) { 

    val currentDirectory = System.getProperty("user.dir") 

    val binary = when { 
     System.getProperty("os.name").startsWith("Linux") -> javaClass.classLoader.getResource("osx_linux").file 
     System.getProperty("os.name").startsWith("Mac") -> javaClass.classLoader.getResource("osx_mac").file 
     else ->javaClass.classLoader.getResource("osx_win.exe").file 
    } 

    val binaryFile = File(binary).name 
    val assemblyFile = File(file).name 

    val tempBinaryCopy = File(binary).copyTo(File(currentDirectory, binaryFile), true) 
    val tempAssemblyCopy = File(file).copyTo(File(currentDirectory, assemblyFile), true) 

    tempAssemblyCopy.deleteOnExit() 
    tempBinaryCopy.deleteOnExit() 

    Files.setPosixFilePermissions(tempBinaryCopy.toPath(), setOf(PosixFilePermission.OWNER_EXECUTE)) 
    val process = Runtime.getRuntime().exec(arrayOf(tempBinaryCopy.absolutePath, tempAssemblyCopy.absolutePath, "-v")) 
    process.inputStream.bufferedReader().readLines().forEach { println(it) } 
} 

例外

Exception in thread "main" kotlin.io.NoSuchFileException: file:/Users/dross/Desktop/OS.jar!/osx_mac: The source file doesn't exist. 
at kotlin.io.FilesKt__UtilsKt.copyTo(Utils.kt:179) 
at kotlin.io.FilesKt__UtilsKt.copyTo$default(Utils.kt:177) 
at com.max.power.os.assembler.ProvidedAssembler.assemble(ProvidedAssembler.kt:22) 

私はまた、削除するために、問題の行に置き換える試してみました!結果は同じでした。

答えて

2

javaClass.classLoader.getResource("osx_linux")は、URLのインスタンスを返します。URL.fileは、URLのファイル部分を提供します。これは、ファイルがJARにパッケージ化されていない限り動作しますが、ファイルがJARにパックされている場合には失敗することがあります。おそらくgetResourceAsStreamを使用して、InputStreamのコピーを送信先に送ってください。

関連する問題