添加Apache Spark依赖后无法构建JavaFX应用的解决方法
问题描述
环境:Java SDK 11,JavaFX项目
添加的依赖:
- spark-sql_2.13 (3.5.0)
- spark-core_2.13 (3.5.0)
- univocity-parsers (2.9.1)
已执行操作:在module-info.java中声明依赖,修改MANIFEST文件添加Automatic-Module-Name属性
编译错误:出现大量包重复读取错误,核心是org.apache.spark.sql、org.apache.spark.sqlapi、org.apache.spark.commonutils三个模块包含相同的包(如org.apache.spark.sql、org.apache.spark.unused等),违反Java模块系统中「一个包只能被一个模块导出」的规则。
解决方案
1. 排查并移除冲突的传递依赖
Spark 3.5.0官方依赖中不存在org.apache.spark.sqlapi和org.apache.spark.commonutils模块,这类包大概率是依赖传递引入的第三方衍生包。
- 用依赖分析工具查看依赖树:
Maven执行:mvn dependency:tree
Gradle执行:gradle dependencies - 在构建文件中排除冲突模块,Maven示例:
<dependency> <groupId>org.apache.spark</groupId> <artifactId>spark-sql_2.13</artifactId> <version>3.5.0</version> <exclusions> <exclusion> <groupId>org.apache.spark</groupId> <artifactId>spark-sqlapi</artifactId> </exclusion> <exclusion> <groupId>org.apache.spark</groupId> <artifactId>spark-commonutils</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.apache.spark</groupId> <artifactId>spark-core_2.13</artifactId> <version>3.5.0</version> <exclusions> <exclusion> <groupId>org.apache.spark</groupId> <artifactId>spark-sqlapi</artifactId> </exclusion> <exclusion> <groupId>org.apache.spark</groupId> <artifactId>spark-commonutils</artifactId> </exclusion> </exclusions> </dependency>
2. 恢复MANIFEST文件的原始状态
Spark官方jar包已自带正确的Automatic-Module-Name配置,手动修改会导致模块命名混乱,引发冲突。撤销对Spark相关依赖MANIFEST文件的修改。
3. 调整module-info.java的模块声明
仅保留对官方Spark模块的引用,移除org.apache.spark.sqlapi和org.apache.spark.commonutils的声明,示例:
module your.module.name { requires javafx.controls; requires javafx.fxml; requires org.apache.spark.sql; requires org.apache.spark.core; requires com.univocity.parsers; // 根据业务需求导出自身包 exports your.package.name; }
4. 临时绕过检查(不推荐)
若因业务需求无法移除冲突包,可在编译和运行时添加JVM参数忽略重复包检查,但会破坏模块系统封装性:
--add-opens org.apache.spark.sql/org.apache.spark.sql=ALL-UNNAMED --add-opens org.apache.spark.sql/org.apache.spark.sql.util=ALL-UNNAMED // 其他冲突包需类似添加对应参数
5. 确认依赖版本兼容性
Spark 3.5.0官方支持Java 8、11、17,确保使用的是官方发布的Spark包,避免第三方修改版本。
内容的提问来源于stack exchange,提问作者Yevhenii Chykalov
相关产品推荐
相关产品推荐

