我面临一个奇怪的问题。我正在使用Gradle启动一个应用程序,该应用程序产生了很长的类路径。为了不达到命令长度限制,我决定创建一个包含MANIFEST.MF的Jar文件,其中包含类路径条目。
这是创建此类Jar的Gradle任务:
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)
}
}
}
这是创建Java执行的Gradle任务(文件夹中每个文件一个):
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下则无法运行。我将问题固定在保存类路径的jar文件中。实际上,我可以在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版本无法加载。有什么想法吗?