Использование moditect для добавления информации о модуле в зависимость без загрузки зависимости
Я пытаюсь использовать moditect, чтобы разрешить создание образа во время выполнения при использовании автоматизированных именованных модулей (ArcGIS). Для модуля ArcGIS требуется openjfx 11 (который я также добавил в качестве зависимости, поскольку это проект JavaFX). Однако когда я пытаюсь создать образ среды выполнения, я получаю следующую ошибку
java.lang.IllegalArgumentException: duplicate element: javafx.base
Я думаю, это потому, что maven также добавляет в проект зависимость openjfx от ArcGIS (это включает openjfx для каждой платформы (win, mac, linux), что приводит к дублированию javafxs.
Как мне добавить информацию о модуле без добавления зависимостей openjfx?
Здесь часть pom.xml
с плагином moditect, если это помогает
<plugin>
<groupId>org.moditect</groupId>
<artifactId>moditect-maven-plugin</artifactId>
<executions>
<execution>
<id>add-module-info-to-dependencies</id>
<phase>package</phase>
<configuration>
<overwriteExistingFiles>true</overwriteExistingFiles>
<outputDirectory>${project.build.directory}/modules</outputDirectory>
<modules>
...
<module>
<artifact>
<groupId>com.esri.arcgisruntime</groupId>
<artifactId>arcgis-java</artifactId>
<version>${arcgis.version}</version>
</artifact>
<moduleInfo>
<name>com.esri.arcgisruntime</name>
</moduleInfo>
</module>
</modules>
</configuration>
<goals>
<goal>add-module-info</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
1 ответ
В добавок к <artifact>
вместо этого <moduleInfo>
теги, вам нужно будет переопределить источник moduleinfo.java
с помощью moduleInfoSource
:
<module>
<artifact>...</artifact>
<moduleInfoSource>
module com.esri.arcgisruntime {
requires ...;
exports ...;
provides ...
with ...;
}
</moduleInfoSource>
</module>
Вам нужно будет пройти через структуру зависимостей com.esri.arcgisruntime
для этого, но moditect предоставляет generate-module-info
цель, которая автоматически сгенерирует это для вас.
Тогда вы обновите requires javafx.base
к requires transitive javafx.base
(и потенциально другие javafx
Записи), чтобы указать, что модуль зависит от него, но должен загружать его откуда-то еще.