在IntelliJ中找到的文件,但在内置的jar

时间:2017-10-09 15:49:08

标签: gradle kotlin

我正在通过编译器运行一些代码,我必须查询用户使用哪个操作系统来调用适当的二进制文件。代码工作,并在IntelliJ中调用二进制文件,但是当我使用gradle构建一个jar文件时,我得到一个与val tempBinaryCopy对应的行上找不到文件异常(二进制文件)。

 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)

我也尝试过更换有问题的线来删除!结果是一样的。

1 个答案:

答案 0 :(得分:2)

javaClass.classLoader.getResource("osx_linux")为您提供了URL的实例,URL.file为您提供了URL的文件部分。只要文件没有打包在JAR中,这可能会起作用,但是如果文件打包到JAR中,您会看到失败。您可能应该使用getResourceAsStream并将您收到的InputStream复制到您想要的目的地。