Использование moditect для добавления информации о модуле в зависимость без загрузки зависимости

Я пытаюсь использовать moditect, чтобы разрешить создание образа во время выполнения при использовании автоматических именованных модулей (ArcGIS). Для модуля ArcGIS требуется openjfx 11 (который я также добавил в качестве зависимости, поскольку это проект JavaFX). Однако, когда я пытаюсь создать образ среды выполнения, я получаю следующую ошибку.

java.lang.IllegalArgumentException: duplicate element: javafx.base

Я думаю, это потому, что maven также добавляет в проект зависимость ArcGIS openjfx (включая 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>

person Verdy Noorghifari    schedule 19.08.2020    source источник


Ответы (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), чтобы указать, что модуль зависит от него, но должен загружать его из другого места.

person Daniel Widdis    schedule 19.08.2020
comment
Я продолжаю получать сообщение об ошибке Execution default-cli of goal org.moditect:moditect-maven-plugin:1.0.0.RC1:generate-module-info failed., когда пытаюсь использовать цель generate-module-info. У вас есть идеи, почему? - person Verdy Noorghifari; 21.08.2020
comment
Я думаю, вам нужно настроить цель generate-module-info в вашем pom.xml . В отличие от настоящего module-info здесь вы можете использовать подстановочные знаки, которые заполнят все остальное за вас, но позволят вам выполнить некоторые настройки. - person Daniel Widdis; 21.08.2020
comment
И на самом деле похоже, что вы можете добавить <exports> и т. д. к существующей конфигурации тега <moduleInfo>, чтобы выполнить эту настройку, без всего этого промежуточного шага. Я выбрал максимальную конфигурируемость. Как только вы заставите его работать, вы, вероятно, сможете его улучшить. - person Daniel Widdis; 21.08.2020