You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Moditect为ArcGIS依赖加模块信息时遇重复javafx.base问题

解决Moditect构建运行时镜像的重复JavaFX依赖问题

看来你已经精准定位到问题根源了——ArcGIS的arcgis-java包确实自带了全平台的OpenJFX依赖,和你单独引入的JavaFX版本撞车,导致模块路径里出现重复的javafx.base,触发了这个错误。我给你几个实用的解决思路,你可以根据自己的项目情况选择:

思路1:直接排除ArcGIS自带的JavaFX依赖

最简单的办法就是在Maven依赖声明里,把ArcGIS带的所有OpenJFX依赖都排除掉,这样项目里就只保留你自己引入的单平台JavaFX版本。修改你的arcgis-java依赖配置:

<dependency>
    <groupId>com.esri.arcgisruntime</groupId>
    <artifactId>arcgis-java</artifactId>
    <version>${arcgis.version}</version>
    <exclusions>
        <!-- 排除所有OpenJFX相关依赖 -->
        <exclusion>
            <groupId>org.openjfx</groupId>
            <artifactId>*</artifactId>
        </exclusion>
    </exclusions>
</dependency>

这样Maven就只会下载ArcGIS核心代码,不会把它带的win/mac/linux全平台JavaFX包拉进来,自然就不会和你自己的依赖冲突了。

思路2:在Moditect配置中过滤重复模块

如果不想修改依赖排除规则,也可以让Moditect在处理ArcGIS依赖时,自动跳过JavaFX相关的JAR包,只给ArcGIS本身添加模块信息。修改你现有的Moditect插件配置:

<modules>
    <module>
        <artifact>
            <groupId>com.esri.arcgisruntime</groupId>
            <artifactId>arcgis-java</artifactId>
            <version>${arcgis.version}</version>
        </artifact>
        <moduleInfo>
            <name>com.esri.arcgisruntime</name>
            <!-- 明确声明ArcGIS依赖的JavaFX模块,避免自动扫描时引入重复 -->
            <requires>javafx.base</requires>
            <requires>javafx.graphics</requires>
            <!-- 根据你的项目需求添加其他必要的JavaFX模块 -->
        </moduleInfo>
        <!-- 添加过滤规则,排除所有OpenJFX的JAR -->
        <filters>
            <filter>
                <artifactPattern>org.openjfx:*</artifactPattern>
                <action>EXCLUDE</action>
            </filter>
        </filters>
    </module>
</modules>

这个配置会让Moditect只处理ArcGIS自身的代码,自动忽略掉它带的JavaFX依赖包。

思路3:用Maven依赖管理统一控制JavaFX版本

如果你的项目依赖比较复杂,可以在<dependencyManagement>里统一声明JavaFX的版本和平台,确保整个项目只有一套JavaFX依赖:

<dependencyManagement>
    <dependencies>
        <!-- 统一指定JavaFX的版本和平台 -->
        <dependency>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx-base</artifactId>
            <version>${javafx.version}</version>
            <classifier>${javafx.platform}</classifier>
        </dependency>
        <dependency>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx-graphics</artifactId>
            <version>${javafx.version}</version>
            <classifier>${javafx.platform}</classifier>
        </dependency>
        <!-- 其他JavaFX模块按需添加 -->
        
        <!-- 配置ArcGIS依赖,同时排除自带的OpenJFX -->
        <dependency>
            <groupId>com.esri.arcgisruntime</groupId>
            <artifactId>arcgis-java</artifactId>
            <version>${arcgis.version}</version>
            <exclusions>
                <exclusion>
                    <groupId>org.openjfx</groupId>
                    <artifactId>*</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>
</dependencyManagement>

之后在<dependencies>里只引入ArcGIS和需要的JavaFX模块,Maven会严格按照依赖管理里的配置拉取依赖,从根源上避免重复。

额外小提示

如果需要构建跨平台的运行时镜像,可以用Maven Profile来切换javafx.platform参数(比如win、mac、linux),确保每次构建只对应一个平台的JavaFX依赖,避免多平台包混在一起。另外,在执行jlink生成镜像时,也要检查模块路径,确保只有一套JavaFX模块存在。

内容的提问来源于stack exchange,提问作者Verdy Noorghifari

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 20:32:37