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

添加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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 18:37:03