在JavaFX应用中引入Jython遇模块包冲突问题求助
JavaFX + Jython + Maven 模块包冲突问题解决
问题场景
在IntelliJ IDE中通过Maven搭建JavaFX应用,引入Jython以添加Python脚本能力,当前相关配置如下:
Maven依赖(核心部分)
<dependency> <groupId>org.openjfx</groupId> <artifactId>javafx-fxml</artifactId> <version>19.0.2.1</version> </dependency> <!-- 已引入的Jython依赖 --> <dependency> <groupId>org.python</groupId> <artifactId>jython</artifactId> <version>2.7.3</version> </dependency>
module-info.java配置
module com.example.application { requires javafx.controls; requires javafx.fxml; requires java.sql; requires java.desktop; requires jython; opens Example.application.main to javafx.fxml; exports Example.application.main; }
运行错误信息
java: java.lang.reflect.InvocationTargetException Module jython contains package org.w3c.dom.html, module jdk.xml.dom exports package org.w3c.dom.html to jython
问题原因
Jython的jar包内置了org.w3c.dom.html包,而JDK自带的jdk.xml.dom模块也导出了同名包,Java模块系统不允许两个模块(自动模块Jython与JDK官方模块)存在重复包,因此触发冲突。
解决方法
方法1:将Jython作为类路径依赖(最常用)
- 修改
module-info.java,删除requires jython;这一行,不再将Jython视为模块依赖。 - 保持Maven中Jython依赖的默认配置,让它被加载到类路径而非模块路径。
- 在IntelliJ的运行配置中添加VM参数,让JDK将冲突包导出给未命名模块(类路径依赖都归属于未命名模块):
--add-exports jdk.xml.dom/org.w3c.dom.html=ALL-UNNAMED
方法2:保留模块依赖并调整导出规则
如果必须将Jython作为模块依赖使用,直接在运行VM参数中添加以下指令,让JDK明确将冲突包导出给Jython模块:
--add-exports jdk.xml.dom/org.w3c.dom.html=jython
注意事项
不要尝试通过Maven排除Jython中的org.w3c.dom.html包——该包是Jython自身jar的组成部分,Maven的依赖排除功能仅能处理传递依赖,无法修改Jython自身的jar内容。
内容的提问来源于stack exchange,提问作者Andowin
相关产品推荐
相关产品推荐

