Spark 3.5.0升级遇java.lang.NoSuchFieldError: JAVA_11问题求助
解决Spark 3.5.0升级测试报错:NoSuchFieldError: JAVA_11
问题本质
这个错误是因为Spark 3.5.0依赖的org.apache.commons.lang3.JavaVersion类需要包含JAVA_11枚举值,但你的项目中加载了低版本的commons-lang3(低于3.12.0),旧版本里没有这个字段,导致类初始化失败。
调试与修复步骤
1. 排查依赖冲突
执行Maven命令查看commons-lang3的依赖树,定位引入旧版本的来源:
mvn dependency:tree -Dincludes=org.apache.commons:commons-lang3
输出中会显示所有commons-lang3的版本,以及引入它们的上层依赖。
2. 强制统一commons-lang3版本
在项目的pom.xml中,通过dependencyManagement强制指定Spark要求的版本(3.12.0),覆盖所有依赖的引入:
<dependencyManagement> <dependencies> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> <version>3.12.0</version> </dependency> </dependencies> </dependencyManagement>
如果某些依赖明确引入了旧版本,直接在该依赖下排除commons-lang3:
<dependency> <groupId>[冲突依赖的groupId]</groupId> <artifactId>[冲突依赖的artifactId]</artifactId> <exclusions> <exclusion> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> </exclusion> </exclusions> </dependency>
3. 确认Java版本配置一致性
Spark 3.5.0支持Java 8和11,但需保证编译、测试环境统一:
- 使用Java 8:确保Maven编译插件、IDE的项目/模块SDK、测试运行JDK均为1.8
- 使用Java 11:更新Maven插件配置,指定source/target为11,并添加必要的JVM参数:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.11.0</version> <configuration> <source>11</source> <target>11</target> <encoding>UTF-8</encoding> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>3.2.2</version> <configuration> <jvmArgs>--add-opens java.base/java.lang=ALL-UNNAMED</jvmArgs> </configuration> </plugin>
4. 清理缓存并重新构建
执行命令清理本地缓存,强制更新依赖后重新构建:
mvn clean install -U
5. 深度调试类加载问题(若以上无效)
添加JVM参数打印类加载详情,找到加载JavaVersion类的JAR文件:
mvn test -Dtest=ABCTest -DargLine="-verbose:class"
在输出中查找org.apache.commons.lang3.JavaVersion的加载路径,确认是否为旧版本JAR,再针对性处理该依赖。
内容的提问来源于stack exchange,提问作者Atul Kekan
相关产品推荐
相关产品推荐

