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