在跟着写尚硅谷的某个项目时,有个oss的导包问题,在站里搜了很久,基本都是错误答案。
aliyun-oss-spring-boot-starter
导入依赖报错unknown。
最后在官方aliyun-spring-boot
的issues
里找到了答案。
https://github.com/alibaba/aliyun-spring-boot/issues/40
<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依赖
按照上面的操作应该就万事大吉了,也不晓得后续还会不会有坑(此处严重怀疑程序猿没有测试过就把包发布到中央仓库。。。)
alibaba:
cloud:
access-key: your key
secret-key: your secret
oss:
endpoint: oss-cn-hangzhou.aliyuncs.com #地域节点
@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();
}
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>