aliyun-oss-spring-boot-starter引入失败解决方案

杨甫
2023-12-01

在跟着写尚硅谷的某个项目时,有个oss的导包问题,在站里搜了很久,基本都是错误答案。
aliyun-oss-spring-boot-starter导入依赖报错unknown。

最后在官方aliyun-spring-bootissues里找到了答案。

https://github.com/alibaba/aliyun-spring-boot/issues/40

  1. pom.xml
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>aliyun-oss-spring-boot-starter</artifactId>
    <version>1.0.0</version>
    <exclusions>
        <exclusion>
            <groupId>com.aliyun</groupId>
            <artifactId>aliyun-java-sdk-oss</artifactId>
        </exclusion>
    </exclusions>
</dependency>
<dependency>
    <groupId>com.aliyun</groupId>
    <artifactId>aliyun-java-sdk-core</artifactId>
    <version>4.5.7</version>
</dependency>

回答

这玩意有坑,而且坑贼大,导致问题的主要原因:

spring-cloud-alibaba的pom中没有声明指定的 aliyun-oss-spring-boot-starter 版本
指定了上述的版本之后,程序运行会报NoSuchMethodError (一看就想到了jar冲突的问题),找了一会才发现,starter中引入的alicloud-context与aliyun-java-sdk-core不兼容((lll¬ω¬),浪费了我1800s的生命)
解决方案,升级aliyun-java-sdk-core版本就好了,具体操作如下:

引入starter依赖的时候里边加上一个exclusions标签,把aliyun-java-sdk-core依赖排除掉
自己手动引入最新版本的aliyun-java-sdk-core依赖
按照上面的操作应该就万事大吉了,也不晓得后续还会不会有坑(此处严重怀疑程序猿没有测试过就把包发布到中央仓库。。。)

  1. application.yml
alibaba:
  cloud:
    access-key: your key
    secret-key: your secret
    oss:
      endpoint: oss-cn-hangzhou.aliyuncs.com  #地域节点
  1. 测试用例
@Resource
    private OSSClient ossClient;

    @Test
    public void testUpload() {
        // 创建PutObjectRequest对象。
        // 依次填写Bucket名称(例如examplebucket)、Object完整路径(例如exampledir/exampleobject.txt)和本地文件的完整路径。Object完整路径中不能包含Bucket名称。
        // 如果未指定本地路径,则默认从示例程序所属项目对应本地路径中上传文件。
        PutObjectRequest putObjectRequest = new PutObjectRequest("你的Bucket名称", "传上去的图片,例:1.jpg", new File("本地图片地址"));
        
        // 上传文件。
        ossClient.putObject(putObjectRequest);

        // 关闭OSSClient。
        ossClient.shutdown();
    }
  1. 版本(上面的使用要是不成功的话,下面的版本配置可以参考一下)

spring-boot版本

<parent>
   <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.5.4</version>
    <relativePath/> <!-- lookup parent from repository -->
</parent>

spring-cloud版本

<properties>
    <java.version>1.8</java.version>
    <spring-cloud.version>2020.0.3</spring-cloud.version>
</properties>

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>${spring-cloud.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

Spring Cloud Alibaba版本

<!--Spring Cloud Alibaba-->
<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-alibaba-dependencies</artifactId>
            <version>2.2.5.RELEASE</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>
 类似资料: