Spring Boot创建SparkSession遇scala方法找不到错误求助
问题分析与解决方案
核心问题
你遇到的java.lang.NoSuchMethodError本质是Scala版本依赖冲突:
spark-core_2.12基于Scala 2.12编译spark-sql_2.13基于Scala 2.13编译- 手动引入的
scala-library是2.12.15
三个依赖的Scala版本不统一,导致运行时找不到正确的Scala类方法。
修复步骤
1. 统一Spark组件的Scala版本
把spark-sql的artifactId改成和spark-core一致的_2.12版本,同时保持Spark版本统一(建议用同一个版本,比如3.3.0或者3.3.2):
<!-- 修改spark-sql依赖 --> <dependency> <groupId>org.apache.spark</groupId> <artifactId>spark-sql_2.12</artifactId> <version>3.3.0</version> <!-- 和spark-core版本保持一致 --> <!-- 本地运行可去掉provided,集群运行再添加 --> </dependency>
2. 确保Scala库版本匹配
Spark 3.3.x对应Scala 2.12的推荐版本是2.12.15,你当前的scala-library版本是对的,但要确保没有其他依赖引入更高版本的Scala库。可以执行mvn dependency:tree检查依赖树,排除冲突的Scala依赖。
3. 移除不必要的手动依赖
Spring Boot的spring-boot-starter-web已经包含spring-core,不需要单独引入spring-core依赖,手动指定版本反而可能导致Spring版本冲突,建议删除这个单独的依赖:
<!-- 删除以下依赖 --> <!-- <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>6.0.5</version> </dependency> -->
4. 优化后的完整依赖示例
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>com.thoughtworks.paranamer</groupId> <artifactId>paranamer</artifactId> <version>2.8</version> </dependency> <dependency> <groupId>org.apache.spark</groupId> <artifactId>spark-core_2.12</artifactId> <version>3.3.0</version> <exclusions> <exclusion> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> </exclusion> <exclusion> <groupId>log4j</groupId> <artifactId>log4j</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.apache.spark</groupId> <artifactId>spark-sql_2.12</artifactId> <version>3.3.0</version> </dependency> <dependency> <groupId>org.scala-lang</groupId> <artifactId>scala-library</artifactId> <version>2.12.15</version> </dependency> </dependencies>
额外注意事项
- 本地运行Spark时,
spark-sql的scope不要设为provided,否则运行时会找不到类;如果是打包到Spark集群运行,再设置为provided。 - 每次修改依赖后,执行
mvn clean install清理旧的依赖缓存,避免残留冲突。
内容的提问来源于stack exchange,提问作者dev-rev
相关产品推荐
相关产品推荐

