如何使用 Gradle 设置 JPMS 模块的 ModuleMainClass 属性?

How can I set the ModuleMainClass attribute of a JPMS module using Gradle?

我正在使用 Gradle (6.0.1) 和 moduleplugin to build an application out of JPMS modules 使用 JDK 13.

然而,即使应用了 the application plugin 并设置了 mainClassName,它也不会在 module-info.class 中设置 ModuleMainClass 属性,所以当我将它链接到一个独立的JVM 和 运行 java -m mymodule 我收到此消息:

module mymodule does not have a ModuleMainClass attribute, use -m <module>/<main-class>

在引擎盖下挖掘看起来 moduleplugin 根本没有改变 jar 任务,开箱即用的 gradle jar 任务实际上并不使用 the JDK's jar command,它只是压缩一切都在自己身上。

据我所知,在 module-info.class 中设置 ModuleMainClass 属性的唯一方法是使用 JDK 的 jar 命令:jar --main-class=CLASSNAME -C <classes dir> .

除了编写我自己的 gradle 任务之外,有没有办法做到这一点?如果没有,有没有人有用调用 JDK 命令替换 gradle jar 任务的示例?

(请注意这个问题 而不是 关于在 jar 的 MANIFEST.MF 中设置 Main-Class - 这很简单,但在调用 java -m <modulename>.)

gradle 中的 jar 任务似乎没有正确构建 jar 以在 module-info.class 中包含 module-main-class。事实上,它看起来根本不像是在调用 jar 命令,这有点误导。所以这是一个更新版本:

jar {
    doLast {
        project.exec {
            workingDir destinationDirectory.get()
            executable 'jar'
            args '--update'
            args '--file', archiveFileName.get()
            args '--main-class', mainClassName
            args '.'
        }
    }
}

Jar 命令语法部分取自此 tutorial

这看起来很简陋,但它确实有效,希望有一天 Jar 任务将包括最后一部分。