Запуск Java с указанием classpath в файле MANIFEST.MF не работает в Windows - PullRequest
0 голосов
/ 08 ноября 2019

У меня странная проблема. Я использую Gradle для запуска приложения, которое создает очень длинный путь к классам. Чтобы не достигать предела длины команды, я решил создать файл Jar с файлом MANIFEST.MF, содержащим записи пути к классам.

Это задача Gradle, создающая такой Jar:

val classpathJar by tasks.register<Jar>("classpathJar") {
    appendix = "classpath"
    doFirst {
        manifest {
            val classpath = sourceSets["main"].runtimeClasspath.files
                .filter { it.isFile && it.extension == "jar" }
                .joinToString (separator = " ") { it.absolutePath }
            attributes("Class-Path" to classpath)
        }
    }
}

и это задача Gradle, создающая выполнение Java (по одному на файл в папке):

File(rootProject.rootDir.path + "/src/main/yaml").listFiles()
    .filter { it.name.matches(Regex("""\d{2}-.*\.yml""")) }
    .sortedBy { it.nameWithoutExtension }
    .forEach {
        val task by tasks.register<JavaExec>(it.nameWithoutExtension) {
            group = alchemistGroup
            description = "Launches simulation ${it.nameWithoutExtension}"
            main = "it.unibo.alchemist.Alchemist"
            classpath = sourceSets["main"].runtimeClasspath.filter { it.isDirectory } + classpathJar.outputs.files
            args(
                "-y", it.absolutePath,
                "-g", "effects/${it.nameWithoutExtension}.aes"
            )
            if (System.getenv("CI") == "true") {
                args("-hl", "-t", "10")
            }
        }
        task.dependsOn(classpathJar)
        runAll.dependsOn(task)
    }

Это работает как в Linux, так и в MacOS, но не в Windows. Я прикрепил проблему к файлу фляги, содержащей путь к классу. Фактически, я могу сгенерировать файл под Linux или MacOS и запустить: java -cp build/libs/alchemist-sapere-incarnation-tutorial-classpath.jar it.unibo.alchemist.Alchemist, класс загружается и приложение запускается.

В Windows мне предоставляется ClassNotFoundException.

В Linux файл MANIFEST.MF выглядит следующим образом:

Manifest-Version: 1.0
Class-Path: /home/userrr/.gradle/caches/modules-2/files-2.1/it.unibo.alc
 hemist/alchemist/9.2.0/c6040b4e6e93c504252e520710912e0348f8af67/alchemi
 st-9.2.0.jar /home/userrr/.gradle/caches/modules-2/files-2.1/it.unibo.a
[snip]
 75da39a7040257bd51d21a231b76c915872d38/javax.inject-1.jar /home/userrr/
 .gradle/caches/modules-2/files-2.1/aopalliance/aopalliance/1.0/235ba8b4
 89512805ac13a8f9ea77a1ca5ebe3e8/aopalliance-1.0.jar


В то время как в Windows я получаю:

Manifest-Version: 1.0
Class-Path: C:\Users\userr\.gradle\caches\modules-2\files-2.1\it.unibo.a
 lchemist\alchemist\9.2.1\78c91c32761534c67f8fd5550a92377523173bb3\alche
 mist-9.2.1.jar C:\Users\userr\.gradle\caches\modules-2\files-2.1\it.uni
[snip]
 75da39a7040257bd51d21a231b76c915872d38\javax.inject-1.jar C:\Users\user
 r\.gradle\caches\modules-2\files-2.1\aopalliance\aopalliance\1.0\235ba8
 b489512805ac13a8f9ea77a1ca5ebe3e8\aopalliance-1.0.jar


Они оба выглядят правильно, но версия для Windowsне может быть загружен. Есть идеи по причине?

...