Как установить mainClassName в Gradle 6.6 с модульной Java

#java #gradle #build.gradle #module-info

#java #gradle #build.gradle #модуль-информация

Вопрос:

В Gradle 6.3 в build.gradle 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. Как это должно быть сделано?

Ответ №1:

Gradle 6.3 не поддерживает JPMS, но 6.4 поддерживает. Итак, я предполагаю, что вы используете сторонний gradle-modules-plugin. Для этого плагина вам необходимо использовать версию 1.7.0 или более позднюю для поддержки более новых версий Gradle.

В качестве альтернативы, удалите плагин и используйте встроенную поддержку в Gradle. Прямо сейчас похоже, что вы являетесь сочетанием двух одновременно.

Комментарии:

1. Плагины, которые я использую application , javaFX 0.0.8 , и jlink 2.22.0 . Я подозреваю, что плагин JavaFX обеспечивает поддержку JPMS. Доступна более новая версия 0.0.9, но использование этой новой версии приводит к следующему: org.joor.ReflectException: java.lang.NoSuchFieldException: javaExecHandleBuilder . Исходя из вашего ответа, это, вероятно, проблема, вызванная плагином JavaFX?

2. На самом деле плагин JavaFX автоматически применяет модульный плагин, на который я ссылался. Но в JavaFX также есть открытая проблема, связанная с Gradle 6.6 (см. Здесь ), связанная с упомянутым вами ReflectException. Поэтому вам, возможно, придется подождать, пока они это исправят, или тем временем перейти на Gradle 6.5.

Ответ №2:

работа в 6.3 mainClassName = "$moduleName/app.Main"

работа в 6.4

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