2017-10-09 2 views
1

Je cours du code à travers un compilateur, et je dois demander quel système d'exploitation l'utilisateur utilise pour appeler le binaire approprié. Le code fonctionne, et appelle le binaire dans IntelliJ, mais quand je construis un fichier jar avec gradle, j'obtiens un fichier non trouvé d'exception (le binaire) sur la ligne qui correspond à val tempBinaryCopy.Fichier trouvé dans IntelliJ mais pas dans le fichier jar construit

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) } 
} 

L'exception

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) 

J'ai également essayé de remplacer sur la ligne en question pour enlever le! et le résultat était le même.

Répondre

2

javaClass.classLoader.getResource("osx_linux") vous donne une instance de URL, URL.file vous donne la partie fichier de la URL. Cela peut fonctionner tant que le fichier n'est pas empaqueté dans un fichier JAR, mais comme vous pouvez le voir, il échoue si le fichier est compressé dans un fichier JAR. Vous devriez probablement utiliser à la place getResourceAsStream et copier le InputStream que vous recevez à la destination où vous voulez l'avoir.