Следующее возможное решение основано только на вашем файле сборки, без знания вашей информации о модуле или кода проекта, поэтому оно может не работать.
Это также основано на этой проблеме в хранилище плагина jlink.
Сначала позвольте мне объяснить, как работает этот плагин: поскольку инструмент (JDK) jlink
не допускает немодулярных зависимостей, плагин попытается собрать их все и создать на лету модуль, который может быть добавленным в путь к модулю. Этот модуль называется $yourModuleName.mergedModule
.
Теперь я добавляю ваши зависимости в простой проект JavaFX. Когда я запускаю ./gradlew jlink
, я получаю те же ошибки, что и вы. Если вы проверите ошибки:
myapp \ build \ jlinkbase \ tmpjars \ myapp.merged.module \ module-info.java: 394: ошибка
Это показывает, что созданный модуль имеет имя myapp.merged.module
и имеет дескриптор module-info
. Если вы откроете его, вы увидите все exports
(модуль будет экспортировать каждый пакет зависимостей по умолчанию), requires
и provides
:
open module myapp.merged.module {
exports com.fasterxml.jackson.annotation;
exports com.fasterxml.jackson.core;
exports com.fasterxml.jackson.core.async;
...
exports schemaorg_apache_xmlbeans.system.sXMLTOOLS;
requires java.xml.crypto;
requires java.logging;
requires java.sql;
requires java.xml;
requires java.desktop;
requires java.security.jgss;
requires jdk.javadoc;
uses java.nio.file.spi.FileSystemProvider;
provides com.fasterxml.jackson.core.JsonFactory with com.fasterxml.jackson.core.JsonFactory;
provides com.fasterxml.jackson.core.ObjectCodec with com.fasterxml.jackson.databind.ObjectMapper;
provides org.apache.xmlbeans.impl.store.QueryDelegate.QueryInterface with org.apache.xmlbeans.impl.xquery.saxon.XBeansXQuery;
provides org.apache.xmlbeans.impl.store.PathDelegate.SelectPathInterface with org.apache.xmlbeans.impl.xpath.saxon.XBeansXPath;
}
Итак, теперь возникает вопрос: стоит ли добавить дополнительные требования к вашему собственному модулю? Ответ объясняется здесь : это излишне увеличит размер вашего проекта. Лучше использовать блок сценариев mergedModule
:
Блок mergedModule позволяет настроить дескриптор модуля объединенного модуля
И
дескриптор модуля создается с использованием алгоритма, реализованного задачей suggestMergedModuleInfo
.
Если вы запустите ./gradlew suggestMergedModuleInfo
, вы в основном получите то же содержимое для дескриптора объединенного модуля, что и выше.
Возможное решение - начать просто добавлять некоторые требования в дескриптор объединенного модуля и повторить попытку.
Я начал с:
jlink {
mergedModule {
requires "java.xml"
}
options = ['--strip-debug', '--compress', '2', '--no-header-files', '--no-man-pages']
launcher {
name = 'myapp'
}
}
и я могу успешно запустить ./gradlew jlink
.
Если вы сейчас проверите дескриптор объединенного модуля, он будет выглядеть так:
open module myapp.merged.module {
requires java.xml;
exports com.fasterxml.jackson.annotation;
exports com.fasterxml.jackson.core;
exports com.fasterxml.jackson.core.async;
...
exports schemaorg_apache_xmlbeans.system.sXMLTOOLS;
}
содержит только явный requires
, все экспорты, но без provides
, поэтому ошибки исчезнут.
Поскольку у меня нет вашего кода, я не могу сказать, сработает ли это для вас, но у меня с теми же зависимостями.