从Java读取AWS S3配置时遇java.lang.IllegalAccessError错误求助
解决Java读取AWS S3配置时的IllegalAccessError错误
这个错误我之前帮同事排查过好几次,本质是Hadoop相关依赖版本不兼容导致的访问权限问题——org.apache.hadoop.metrics2.lib.MutableCounterLong的构造方法在不同Hadoop版本里的访问权限或者方法签名有变化,而你的hadoop-aws(S3A相关)和hadoop-common/metrics2依赖版本不匹配,导致代码尝试调用一个它无权访问的方法。
下面是具体的解决步骤:
- 统一Hadoop核心依赖版本:确保
hadoop-aws、hadoop-common、hadoop-client这些核心组件的版本完全一致,绝对不要混合2.x和3.x的大版本(比如同时用2.8和3.3的依赖)。举个Maven依赖的例子:
<dependencies> <!-- 统一用3.3.4版本,可根据实际需求调整 --> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-aws</artifactId> <version>3.3.4</version> </dependency> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-common</artifactId> <version>3.3.4</version> </dependency> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-client</artifactId> <version>3.3.4</version> </dependency> </dependencies>
- 排查并解决依赖冲突:用依赖分析工具找出重复引入的不同版本Hadoop依赖。比如Maven可以执行
mvn dependency:tree命令,Gradle用./gradlew dependencies,如果发现有其他第三方依赖偷偷引入了旧版本的hadoop-common或hadoop-metrics2,直接排除掉冲突的依赖:
<dependency> <groupId>第三方依赖组ID</groupId> <artifactId>第三方依赖 artifactID</artifactId> <exclusions> <exclusion> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-common</artifactId> </exclusion> </exclusions> </dependency>
验证JDK版本兼容性:Hadoop 3.x要求JDK 8及以上,2.x也推荐用JDK 8。如果你的JDK版本过高(比如JDK 17)或者过低,可能会间接触发这类访问权限问题,确保JDK版本和你使用的Hadoop版本匹配。
最后检查S3配置:虽然这个错误是依赖问题,但解决依赖后如果还有问题,确认你的S3配置项是否正确,比如
fs.s3a.access.key、fs.s3a.secret.key是否配置到位,私有S3存储还要加上fs.s3a.endpoint配置。
我之前遇到的场景是项目里同时引入了Hadoop 2.8和3.2的依赖,导致S3A的Instrumentation类调用了旧版本metrics2里的包私有构造方法,统一所有Hadoop依赖版本后就彻底解决了这个问题。
内容的提问来源于stack exchange,提问作者Pranav
相关产品推荐
相关产品推荐

