Spark从1.6升级至3.5.1时遭遇SLF4J与Java 11错误求助
解决方案:Spark 3.5.1升级后的SLF4J与ASM依赖冲突问题
错误原因解析
- SLF4J加载失败:Spark 3.x内部依赖SLF4J作为日志门面,即使你的代码未直接使用,Spark运行时也会尝试加载SLF4J的实现绑定。缺少绑定包会导致默认使用无操作日志实现,同时抛出加载错误。
NoSuchFieldError: JAVA_11:该错误源于ASM库版本冲突——Spark 3.5.1依赖高版本ASM(包含JAVA_11字段),而你的项目中可能引入了旧版本ASM,导致运行时找不到该字段。
具体修复步骤
1. 调整Maven依赖,统一SLF4J与Log4j绑定
在pom.xml中,对Spark核心依赖排除冲突的日志和ASM依赖,然后引入统一版本的SLF4J、Log4j1.2及绑定包:
<!-- Spark Core 依赖,排除冲突组件 --> <dependency> <groupId>org.apache.spark</groupId> <artifactId>spark-core_2.12</artifactId> <version>3.5.1</version> <exclusions> <!-- 排除Spark自带的SLF4J和Log4j --> <exclusion> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> </exclusion> <exclusion> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> </exclusion> <exclusion> <groupId>log4j</groupId> <artifactId>log4j</artifactId> </exclusion> <!-- 排除旧版本ASM --> <exclusion> <groupId>org.ow2.asm</groupId> <artifactId>asm</artifactId> </exclusion> <exclusion> <groupId>org.ow2.asm</groupId> <artifactId>asm-commons</artifactId> </exclusion> </exclusions> </dependency> <!-- 统一SLF4J版本(与Spark 3.5.1兼容) --> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.7.36</version> </dependency> <!-- SLF4J 转 Log4j1.2 的绑定包 --> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>1.7.36</version> <scope>runtime</scope> </dependency> <!-- 你的Log4j1.2依赖 --> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency>
2. 强制使用兼容的ASM版本
添加ASM依赖,强制使用Spark 3.5.1适配的版本(9.5),覆盖项目中旧的ASM依赖:
<dependency> <groupId>org.ow2.asm</groupId> <artifactId>asm</artifactId> <version>9.5</version> </dependency> <dependency> <groupId>org.ow2.asm</groupId> <artifactId>asm-commons</artifactId> <version>9.5</version> </dependency>
3. 确保Maven编译使用Java 8
在pom.xml中添加编译配置,匹配你的本地Java环境:
<properties> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> </properties>
内容的提问来源于stack exchange,提问作者Anonymous
相关产品推荐
相关产品推荐

