Файл найден в IntelliJ, но не встроен в банку

Я запускаю некоторый код через компилятор, и я должен запросить, какую операционную систему использует пользователь, чтобы вызвать соответствующий двоичный файл. Код работает и вызывает двоичный файл в IntelliJ, но когда я создаю файл jar с помощью gradle, я получаю исключение из файла (не двоичное) в строке, которое соответствует 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 вы получаете, в пункт назначения, где вы хотите его получить.

Intereting Posts