JavaFX集成EclipseLink、jakarta.persistence、mysql-connector包冲突报错求解
报错原因
这个错误是Java 9+引入的JPMS模块化系统的限制导致的:同一个包不能被两个不同的模块同时导出给第三方模块。你引入的jakarta.persistence(模块名java.persistence)和eclipselink两个模块都包含并导出了javax.persistence.criteria包,同时mysql-connector-java模块又同时依赖这两个模块,就触发了包冲突。
解决方案
以下两个方案二选一即可:
方案一:最简单快速,关闭模块化
JavaFX支持非模块化运行,直接删除module-info.java文件即可绕过模块化的包冲突限制,操作步骤:
- 删除项目根目录下的
module-info.java文件 - 修改pom.xml中javafx-maven-plugin的mainClass配置,去掉模块名前缀:
<mainClass>das.sad.HelloApplication</mainClass> - 重新刷新Maven依赖后运行即可。
方案二:保留模块化,调整依赖和配置
- 先将三个依赖正确添加到pom.xml的
节点下,同时排除EclipseLink内置的重复JPA API包: <!-- MySQL驱动 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.20</version> </dependency> <!-- EclipseLink --> <dependency> <groupId>org.eclipse.persistence</groupId> <artifactId>eclipselink</artifactId> <version>2.7.8</version> <exclusions> <exclusion> <groupId>org.eclipse.persistence</groupId> <artifactId>javax.persistence</artifactId> </exclusion> </exclusions> </dependency> <!-- JPA 2.2 API --> <dependency> <groupId>jakarta.persistence</groupId> <artifactId>jakarta.persistence-api</artifactId> <version>2.2.3</version> </dependency> - 修改
module-info.java,给EclipseLink开放实体类的反射权限:module das.sad { requires javafx.controls; requires javafx.fxml; requires org.controlsfx.controls; requires com.dlsc.formsfx; requires org.kordamp.bootstrapfx.core; requires java.persistence; requires mysql.connector.java; requires eclipselink; // 给eclipselink开放反射权限,否则JPA无法读取实体类 opens das.sad to javafx.fxml, eclipselink; exports das.sad; } - 刷新Maven依赖后重新运行即可。
内容的提问来源于stack exchange,提问作者Bastimon
相关产品推荐
相关产品推荐

