#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"
}