IntelliJ中基于Maven构建Spark-Scala WordCount程序时遭遇java.lang.NoSuchMethodError问题求助
这个NoSuchMethodError本质是Scala类库版本冲突导致的——Spark 3.0.1基于Scala 2.12构建,但你的Maven配置里有几个关键问题,导致运行时加载了不兼容的Scala类。下面是具体的排查和修复步骤:
问题根源分析
错误栈指向scala.util.matching.Regex的构造方法找不到,说明运行时类路径里的Scala库版本,和Spark编译时依赖的Scala版本不匹配。SBT能正常运行是因为它会自动管理Scala版本的一致性,而Maven需要手动配置插件和依赖来保证这一点。
具体修复方案
1. 替换过时的仓库
你配置的scala-tools.org仓库已经废弃多年,会导致依赖拉取异常,换成Maven中央仓库即可:
<repositories> <repository> <id>central</id> <url>https://repo1.maven.org/maven2/</url> </repository> <repository> <id>scala-staging</id> <url>https://oss.sonatype.org/content/repositories/staging/</url> </repository> </repositories> <pluginRepositories> <pluginRepository> <id>central</id> <url>https://repo1.maven.org/maven2/</url> </pluginRepository> </pluginRepositories>
2. 更新Maven Scala插件
旧的org.scala-tools:maven-scala-plugin不支持Scala 2.12和JDK 11,换成维护中的net.alchim31.maven:scala-maven-plugin:
<build> <sourceDirectory>src/main/scala</sourceDirectory> <testSourceDirectory>src/test/scala</testSourceDirectory> <plugins> <plugin> <groupId>net.alchim31.maven</groupId> <artifactId>scala-maven-plugin</artifactId> <version>4.8.1</version> <executions> <execution> <goals> <goal>compile</goal> <goal>testCompile</goal> </goals> <configuration> <scalaVersion>${scala.version}</scalaVersion> <args> <arg>-target:jvm-11</arg> </args> </configuration> </execution> </executions> </plugin> <!-- 可选:添加shade插件打包成可执行Jar,避免运行时依赖冲突 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>3.4.1</version> <executions> <execution> <phase>package</phase> <goals> <goal>shade</goal> </goals> <configuration> <transformers> <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> <mainClass>WordCount</mainClass> </transformer> </transformers> </configuration> </execution> </executions> </plugin> </plugins> </build>
3. 清理冗余依赖
你的pom里的org.specs:specs是非常老旧的测试库(适配Scala 2.8及更早),建议换成现代的测试库比如org.scalatest:scalatest,或者直接移除(如果不需要测试的话):
<!-- 替换成ScalaTest(可选) --> <dependency> <groupId>org.scalatest</groupId> <artifactId>scalatest_2.12</artifactId> <version>3.2.10</version> <scope>test</scope> </dependency>
4. 确保依赖版本一致性
确认所有Scala相关依赖的版本都和scala.version统一,并且Spark的artifactId后缀_2.12和你的Scala大版本匹配(Spark 3.0.1的spark-core_2.12确实对应Scala 2.12)。
验证步骤
- 清理Maven本地缓存:运行
mvn clean install -U,强制刷新依赖 - 如果是在IntelliJ中运行,先执行
File -> Invalidate Caches...,然后重启IDE - 可以用
mvn exec:java -Dexec.mainClass="WordCount"命令直接运行,或者打包后用java -jar target/Project-1.0-SNAPSHOT.jar运行
以上调整应该能解决版本冲突问题,让你的WordCount程序正常运行。
内容的提问来源于stack exchange,提问作者PixieDev

