Exception in thread “main” java.lang.NoSuchFieldError: SIGNING_REGION
近期在工作中,使用AWS提供的SDK包从S3桶下载文件时,遇到了如下的异常情况:
当时pom文件配置为:
<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>aws-java-sdk-s3</artifactId>
<version>1.11.760</version>
</dependency>
后通过上网查询,发现是因为几个AWS包的版本不一致的问题:
参考的资料:https://github.com/aws/aws-sdk-java/issues/1700
https://stackoverflow.com/questions/49085110/error-in-using-aws-java-sdk-s3
通过IDEA查看,确实发现几个包的版本不同。
后面通过在pom文件中,指定几个包的版本为一致后,发现可成功的调用。
问题本来到此结束,但是后面我发现,我在另外一个项目中,同样使用相同的pom文件,但是在另外的项目中,导入的包,默认就是同一版本:
因此,怀疑是原项目的pom文件其他地方同样也引入了AWS包的依赖。后面经过定位,发现是在dependencyManagement标签中,引入了SpringCloud的包:
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Edgware.SR6</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
而SpringCloud的包指定了特定的AWS依赖版本:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-aws-dependencies</artifactId>
<version>${spring-cloud-aws.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
而该版本,正好是之前出现的1.11.125的版本。
而dependencyManagement版本优先级高于传递依赖版本
,因此在前面虽然指定了aws-java-sdk-s3
包的版本,但是里面传递依赖的其他aws的包的版本被dependencyManagement
中指定的版本所覆盖,导致了实际导入包的版本与预期不符的情况。
dependencyManagement依赖版本优先级参考:https://blog.csdn.net/jiaobuchong/article/details/81842503