文章目录
- 一、依赖版本
- 二、整合步骤
- 2.1 视频 / 旧版本
- 2.2 官网 / 新版本
- 三、product测试
- 四、额外补充
- 4.1 renren-fast报错
- 4.2 解决方案
- 4.2.1 视频 / 旧版本
- 4.2.2 官网 / 新版本
最近在学习谷粒商城,一直卡在P62,SpringCloud Alibaba整合OSS报错,零零散散花了几天晚上 终于解决,特此记录下。
一、依赖版本
项目使用的版本为:
- SpringBoot版本:2.6.13
- SpringCloud版本:2021.0.5
- SpringCloud-Alibaba版本:2021.0.5.0
SpringBoot、SpringCloud、SpringCloud-Alibaba具体对应版本 可见官网, SpringBoot、SpringCloud、SpringCloudAlibaba版本对应关系。
二、整合步骤
视频中所添加的依赖与官网有所不同,主要区别在于:
1)引入的依赖不同
<!--视频/旧版本-->
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alicloud-oss</artifactId>
</dependency><!--官网/新版本-->
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>aliyun-oss-spring-boot-starter</artifactId>
</dependency>
2)application.yml文件配置不同
#视频/旧版本
spring:cloud:alicloud:access-key: yourkeysecret-key: yourkeyoss:endpoint: ....#官网/新版本
alibaba:cloud:access-key: yourkeysecret-key: yourkeyoss:endpoint: ....
下面分两种方式来介绍。
2.1 视频 / 旧版本
1)和视频引入的包相同,在common模块的pom.xml引入下面依赖
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alicloud-oss</artifactId><version>2.2.0.RELEASE</version>
</dependency>
注意要带上<version>,否则报错:
java.lang.NoClassDefFoundError: com/baomidou/mybatisplus/extension/service/IService
2)在gulimall-product模块的application.yml文件进行如下配置
spring:cloud:alicloud:access-key: L****psecret-key: L****doss:endpoint: oss-cn-beijing.aliyuncs.comutil:enabled: false
重点注意:需要配置spring.cloud.util:enabled为false,否则报错
java.lang.IllegalStateException: Failed to load ApplicationContext
Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name ‘nacosProperties’: Unsatisfied dependency expressed through field ‘inetIPv6Utils’; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name ‘inetIPv6Utils’ defined in class path resource [com/alibaba/cloud/nacos/util/UtilIPv6AutoConfiguration.class]: Unsatisfied dependency expressed through method ‘inetIPv6Utils’ parameter 0; nested exception is org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type ‘org.springframework.cloud.commons.util.InetUtilsProperties’ available: expected single matching bean but found 2: spring.cloud.inetutils-org.springframework.cloud.commons.util.InetUtilsProperties,inetUtilsProperties
2.2 官网 / 新版本
1)用aliyun-spring-boot官网示例的依赖,在common模块的pom.xml引入下面依赖
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>aliyun-oss-spring-boot-starter</artifactId><!-- 版本号不能少,否则报错 --><version>1.0.0</version>
</dependency>
<!-- 必须导入新的依赖,否则会报错 -->
<dependency><groupId>com.aliyun</groupId><artifactId>aliyun-java-sdk-core</artifactId><version>4.5.7</version>
</dependency>
注意:
A.aliyun-oss-spring-boot-starter带上版本号,否则报错
Caused by: java.lang.ClassNotFoundException: com.baomidou.mybatisplus.extension.service.IService
B.必须多引入 aliyun-java-sdk-oss,否则报错
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name ‘aliCloudEdasSdk’ defined in class path resource
C.必须多引入 aliyun-sdk-oss,否则报错
程序包com.aliyun.oss不存在
2)在gulimall-product模块的application.yml文件进行如下配置(注意:和视频的配置不同,注意区分)
# 阿里云OSS配置暂时先放在此处(后续会放在Nacos配置中心)
alibaba:cloud:access-key: L****psecret-key: L****doss:endpoint: oss-cn-beijing.aliyuncs.com
注意:如果还是报错Error creating bean with name ‘ossClient’,记得注释掉product模块 pom.xml文件中添加的aliyun-sdk-oss依赖,因为product模块自带的oss配置与common模块引入的oss依赖版本冲突。
三、product测试
@RunWith(SpringRunner.class)
@SpringBootTest
class JewelrymallProductApplicationTests {//用Autowired虽然会标红,但是可以运行起来。也可用@Resource@Autowiredprivate OSSClient ossClient;@Testpublic void testUpload() throws Exception {String filePath= "C:\\Users\\28687\\Desktop\\test0.png";try {InputStream inputStream = new FileInputStream(filePath);ossClient.putObject("jewelrymall-wj", "test-0.png", inputStream);System.out.println("上传完成...");}finally {if (ossClient != null) {ossClient.shutdown();}}}
}
如果还是报错Error creating bean with name ‘ossClient’,记得注释掉product模块 pom.xml文件中添加的aliyun-sdk-oss依赖,因为product模块自带的oss配置与common模块引入的oss依赖版本冲突。
四、额外补充
4.1 renren-fast报错
按照以上方式,product服务的 testUpload()
方法能正常运行,但renren-fast的RenrenApplication
会报错
因为版本冲突。renren-fast的pom.xml文件中本就自带有aliyun-sdk-oss
依赖(版本为2.8.3),而common pom.xml文件中的spring-cloud-starter-alicloud-oss
/ aliyun-oss-spring-boot-starter
也包含aliyun-sdk-oss
依赖(版本为3.1.0),有冲突。
如果注释掉renren-fast pom.xml文件中的aliyun-sdk-oss
,使用common pom.xml文件中的spring-cloud-starter-alicloud-oss
/ aliyun-oss-spring-boot-starter
,会报错。
大概是renren-fast的SpringBoot版本为2.6.6,与3.1.0版本的aliyun-sdk-oss
不兼容导致的(上述2.1、2.2引入 的aliyun-sdk-oss
版本为3.1.0),因此renren-fast 还是得与原来2.8.3版本的aliyun-sdk-oss配合使用。
此时需要引入dependencyManagement
将冲突的jar包管理起来,其他product等模块继承common模块oss的版本,renren-fast使用自己携带的版本。
4.2 解决方案
和上文第二部分类似,我们分别介绍两种整合方式对应的解决方案。
4.2.1 视频 / 旧版本
1)和视频引入的包相同,在common模块的pom.xml引入下面依赖
<dependencyManagement><dependencies><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alicloud-oss</artifactId><version>2.2.0.RELEASE</version></dependency></dependencies>
</dependencyManagement>
renren-fast pom.xml中aliyun-sdk-oss
保留
<properties><aliyun.oss.version>2.8.3</aliyun.oss.version>
</properties><dependency><groupId>com.aliyun.oss</groupId><artifactId>aliyun-sdk-oss</artifactId><version>${aliyun.oss.version}</version>
</dependency>
guilmall-product模块的pom.xml文件引入spring-cloud-starter-alicloud-oss
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alicloud-oss</artifactId><version>2.2.0.RELEASE</version>
</dependency>
2)在gulimall-product模块的application.yml文件进行如下配置
spring:cloud:alicloud:access-key: L****psecret-key: L****doss:endpoint: oss-cn-beijing.aliyuncs.comutil:enabled: false
使用mvn clean install -U
,使用所有依赖的最新版本【清除旧的构建产物;构建项目并将打包的项目安装到本地参考,供其他项目作为依赖;检查并更新所有依赖的最新版本(包括 SNAPSHOT 版本)】。
重新运行,发现 renren-fast的RenrenApplication
、product服务的 testUpload()
方法都能正常运行
4.2.2 官网 / 新版本
1)用aliyun-spring-boot官网示例的依赖,在common模块的pom.xml引入下面依赖
<dependencyManagement><dependencies><dependency><groupId>com.alibaba.cloud</groupId><artifactId>aliyun-oss-spring-boot-starter</artifactId><!-- 版本号不能少,否则报错 --><version>1.0.0</version></dependency><!-- 必须导入新的依赖,否则会报错 --><dependency><groupId>com.aliyun</groupId><artifactId>aliyun-java-sdk-core</artifactId><version>4.5.7</version></dependency></dependencies>
</dependencyManagement>
renren-fast pom.xml中aliyun-sdk-oss
保留
<dependency><groupId>com.aliyun.oss</groupId><artifactId>aliyun-sdk-oss</artifactId><version>${aliyun.oss.version}</version>
</dependency>
guilmall-product模块的pom.xml文件引入
<dependencies><!-- 其他依赖 --><dependency><groupId>com.alibaba.cloud</groupId><artifactId>aliyun-oss-spring-boot-starter</artifactId><version>1.0.0</version></dependency><dependency><groupId>com.aliyun</groupId><artifactId>aliyun-java-sdk-core</artifactId><version>4.5.7</version></dependency>
</dependencies>
2)在gulimall-product模块的application.yml文件进行如下配置(注意:和视频的配置不同,注意区分)
# 阿里云OSS配置暂时先放在此处(后续会放在Nacos配置中心)
alibaba:cloud:access-key: L****psecret-key: L****doss:endpoint: oss-cn-beijing.aliyuncs.com
参考 谷粒商城 P62 OSS 整合问题