向Amazon S3上传文件时出现java.lang.NoSuchFieldError:INSTANCE错误求助
NoSuchFieldError: INSTANCE错误 这个问题我之前帮团队排查过,典型的依赖版本冲突坑,核心原因是Apache HttpClient的版本不兼容导致的。
问题根源
你用的Hadoop 2.7.1自带的是Apache HttpClient 4.2.x版本(具体是4.2.5),而aws-java-sdk 1.11.80依赖的是HttpClient 4.5.x版本。这两个版本里org.apache.http.conn.ssl.SSLConnectionSocketFactory类的定义不一样——旧版本没有INSTANCE这个静态字段,当项目运行时,类加载器先加载了Hadoop带的旧类,AWS SDK调用时找不到这个字段就抛出了错误。
解决方案
下面是几个验证过的有效解决步骤:
排除Hadoop依赖中的旧版HttpClient
在你的项目构建文件里,把Hadoop相关依赖(比如hadoop-common、hadoop-hdfs)里的httpclient和httpcore排除掉,让项目使用AWS SDK依赖的新版本。
Maven示例(pom.xml):<dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-common</artifactId> <version>2.7.1</version> <exclusions> <exclusion> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId> </exclusion> <exclusion> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpcore</artifactId> </exclusion> </exclusions> </dependency> <!-- 其他Hadoop依赖(如hadoop-hdfs)也需要同样排除 -->Gradle示例(build.gradle):
implementation('org.apache.hadoop:hadoop-common:2.7.1') { exclude group: 'org.apache.httpcomponents', module: 'httpclient' exclude group: 'org.apache.httpcomponents', module: 'httpcore' }显式指定兼容的HttpClient版本
如果排除旧依赖后还有问题,可以直接在构建文件里声明AWS SDK对应的HttpClient版本(aws-java-sdk 1.11.80适配的是HttpClient 4.5.2),强制整个项目统一使用这个版本:<!-- Maven --> <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId> <version>4.5.2</version> </dependency> <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpcore</artifactId> <version>4.4.4</version> </dependency>验证依赖树确认冲突已解决
用构建工具的依赖树命令检查是否还有多版本HttpClient存在:- Maven:
mvn dependency:tree | grep httpclient - Gradle:
gradle dependencies | grep httpclient
确保输出里只有你指定的版本,没有旧版本残留。
- Maven:
额外说明
亲测Hadoop 2.7.1和HttpClient 4.5.x版本完全兼容,排除旧依赖后不会影响Hadoop的正常功能,放心用就行。
内容的提问来源于stack exchange,提问作者Supriya Jadhav

