2

我正在使用带有模块插件的 Gradle (6.0.1)来使用 JDK 13从JPMS模块构建应用程序。

但是,即使应用application插件并对其进行了mainClassName设置,它也不会在 中设置ModuleMainClass属性module-info.class,因此当我将其链接到独立的 JVM 并运行时,java -m mymodule我会收到以下消息:

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

在引擎盖下挖掘它看起来模块插件根本不会改变 jar 任务,并且开箱即用的 gradle jar 任务实际上并不使用JDK 的jar命令,它只是将所有内容压缩起来。

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

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

(请注意,这个问题不是关于Main-Class在 jar 的 MANIFEST.MF 中设置 - 这很容易,但在调用时不受尊重java -m <modulename>。)

4

1 回答 1

3

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

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

Jar 命令语法部分取自本教程

这看起来很笨拙,但它有效,希望有一天该Jar任务将包括最后一部分。

于 2019-11-30T21:53:44.440 回答