在Windows下无法使用MANIFEST.MF文件中指定的类路径启动Java

我面临一个奇怪的问题。我正在使用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版本无法加载。有什么想法吗?

chitow 回答:在Windows下无法使用MANIFEST.MF文件中指定的类路径启动Java

暂时没有好的解决方案,如果你有好的解决方案,请发邮件至:iooj@foxmail.com
本文链接:https://www.f2er.com/3136640.html

大家都在问