如何使用模块化 Java 在 Gradle 6.6 中设置 mainClassName

How to set mainClassName in Gradle 6.6 with modular Java

在 Gradle 6.3 中 build.gradle,mainClassName 可以这样设置,没有任何抱怨:

mainClassName = 'mod/app.Main'

在 Gradle 6.61 中,上面一行的结果是:

java.lang.module.InvalidModuleDescriptorException: Package mod.app not found in module

这可以通过删除 mainClassName 的模块部分来解决:

mainClassName = 'app.Main'

虽然异常已解决,Gradle 仍然指出:

No module was provided for main class, assuming the current module. Prefer providing 'mainClassName' in the following format: '$moduleName/a.b.Main'

我已经尝试过这种变体:

ext.moduleName = 'mod'
mainClassName = '${ext.moduleName}/app.Main'

到目前为止,我无法让其中任何一个工作。我可以将设置设置为 'app.Main',但我更愿意使用 Gradle 更喜欢的变体。应该怎么做?

Gradle 6.3 不支持 JPMS,但 6.4+ 支持。所以我假设您正在使用第 3 方 gradle-modules-plugin. For this plugin, you need to use version 1.7.0 或更高版本来支持 Gradle.

的更新版本

或者,删除插件并使用 Gradle 中的 native support。现在看来你是两者兼而有之。

在 6.3 中工作mainClassName = "$moduleName/app.Main"

在 6.4+ 中工作


run {
    main = "$moduleName/app.Main"
}