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

问题描述

在build.gradle的Gradle 6.3中,可以这样设置mainClassName,而不会产生任何抱怨:

mainClassName = 'mod/app.Main'

在Gradle 6.61中,上一行结果如下:

java.lang.module.InvalidModuleDescriptorException:包mod.app不是 在模块中找到

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

mainClassName = 'app.Main'

解决异常后,Gradle仍会声明:

假定当前模块为主要类,则未提供任何模块。 最好以以下格式提供“ mainClassName”: '$ moduleName / a.b.Main'

我已经尝试过这种变化:

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

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

解决方法

6.3版不支持JPMS,但6.4版以上不支持。因此,我假设您正在使用第三方gradle-modules-plugin。对于此插件,您需要使用1.7.0版或更高版本来支持Gradle的较新版本。

或者,删除插件并在Gradle中使用native support。现在看来,您同时是两者的混合体。

,

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

在6.4+版本中工作


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