使用Moditect为ArcGIS依赖加模块信息时遇重复javafx.base问题
看来你已经精准定位到问题根源了——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

