在IntelliJ中找到文件,但不是在建立的jar

我通过编译器运行一些代码,我必须查询用户正在使用哪个操作系统来调用相应的二进制文件。 代码工作,并在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) 

我也试过在有问题的线路上取代删除! 结果是一样的。

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