【问题标题】:Using moditect to add module info to dependency without downloading the dependency使用 moditect 将模块信息添加到依赖项而不下载依赖项
【发布时间】:2020-12-08 22:45:34
【问题描述】:

我正在尝试使用 moditect 以允许在使用自动命名模块 (ArcGIS) 时创建运行时映像。 ArcGIS 模块需要 openjfx 11(我也将其添加为依赖项,因为它是一个 JavaFX 项目)。但是,当我尝试构建运行时映像时,出现以下错误

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

我认为这是因为 maven 还在项目中添加了 ArcGIS openjfx 依赖项(这包括每个平台(win、mac、linux)的 openjfx,这导致它具有重复的 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>

【问题讨论】:

    标签: java maven javafx jlink moditect


    【解决方案1】:

    除了&lt;artifact&gt;,而不是&lt;moduleInfo&gt; 标签,您还需要使用moduleInfoSource 覆盖moduleinfo.java 的来源:

    <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 条目)以指示模块依赖于它,但应该从其他地方加载它。

    【讨论】:

    • 当我尝试使用 generate-module-info 目标时,我不断收到错误 Execution default-cli of goal org.moditect:moditect-maven-plugin:1.0.0.RC1:generate-module-info failed.。你知道为什么吗?
    • 我认为你需要配置generate-module-info目标in your pom.xml。与真正的 module-info 不同,您可以在此处使用通配符,它​​会为您填写其他所有内容,但允许您进行一些自定义。
    • 而且看起来你可以将&lt;exports&gt; 等添加到现有的&lt;moduleInfo&gt; 标签配置中来进行自定义,而无需整个中间步骤。我追求最大的可配置性。一旦你得到它的工作,你可能会改进它。
    最近更新 更多