我正在使用 Gradle (6.0.1)模块插件 https://github.com/java9-modularity/gradle-modules-plugin构建一个应用程序JPMS模块 http://openjdk.java.net/projects/jigsaw/spec/使用 JDK 13。
然而,即使有the application plugin https://docs.gradle.org/current/userguide/application_plugin.html应用及其mainClassName
设置它 不设置ModuleMainClass
属性在module-info.class
,所以当我将它连接到一个独立的 JVM 并运行时java -m mymodule
我收到这条消息:
module mymodule does not have a ModuleMainClass attribute, use -m <module>/<main-class>
深入挖掘后发现 moduleplugin 根本没有改变 jar 任务,而且开箱即用的 gradle jar 任务实际上并没有使用JDK 的jar command https://docs.oracle.com/en/java/javase/13/docs/specs/man/jar.html,它只是把所有东西都拉上拉链。
据我所知,设置的唯一方法ModuleMainClass
属性在module-info.class
就是使用JDK的jar命令,如下所示:jar --main-class=CLASSNAME -C <classes dir>
.
除了编写我自己的 gradle 任务之外,有没有办法做到这一点?如果没有,有没有人有一个用调用 JDK 命令的任务替换 gradle jar 任务的示例?
(请注意这个问题是not关于设置Main-Class
在 jar 的 MANIFEST.MF 中 - 这很简单,但在调用时不受尊重java -m <modulename>
.)
它看起来像jar
gradle 中的任务没有正确构建 jar 来包含module-main-class
in the module-info.class
。事实上它看起来并不像它调用jar
命令根本有点误导。所以这是一个更新版本,可以做到这一点:
jar {
doLast {
project.exec {
workingDir destinationDirectory.get()
executable 'jar'
args '--update'
args '--file', archiveFileName.get()
args '--main-class', mainClassName
args '.'
}
}
}
Jar 命令语法部分取自此tutorial https://blog.codefx.org/java/java-module-system-tutorial/#Hello-Modular-World.
这看起来很糟糕,但它确实有效,希望有一天Jar
任务将包括最后一部分。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)