У меня странная проблема. Я использую 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не может быть загружен. Есть идеи по причине?