一、遇到的问题
在进行SpringBoot多环境配置时,想在不同环境下配置不同的tomcat端口,出现了:No active profile set, falling back to 1 default profile: "default"错误,连Tomcat端口号都无了
解决方案 :发现是建立项目时,没有导入spring-boot-starter-web的jar包,导入相关依赖问题即可解决
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>
二、多环境端口配置
一般来说,一个项目从开始到正式上线运营,大致可以分为四种环境:
1、测试环境:test,外部用户无法访问,提供给测试人员使用
2、生产环境:pro,面向外部用户的环境,连接上互联网即可访问该环境
3、开发环境:dev,外部用户无法访问,供开发人员使用
4、灰度环境:pre,外部用户可以访问,但是服务器配置相对较低,其他和生产环境一样
面对四种环境,想配置不同的端口号怎么办,在配置好相应的端口号后,发现系统还是走默认的8080端口。在yaml配置文件中系统会通过"-"的形式来取出对应的环境,.properties文件可以通过spring.profiles.active=xx来激活指定的端口号,.yaml文件可以通过spring:profiles:active:xx来激活,其中“xx”代表“-”之后的(test、dev、pro之类的)。
比如我们想指定测试环境下的端口为8083,这里需要注意的是:.yaml文件一定要特别注意空格问题
当然,我们还可以把不同环境下的配置放入同一个yaml文件中,在yml配置文件中可以通过"---"的形式来划分文档块,但从横杠来看,系统貌似不推荐我们把不同环境下的配置放在一起
结果:指定8083端口成功
三、简单实战
比如现在公司有一个需求:用Swagger来写一个接口文档,只在开发中使用,在生产环境下不能使用
application-pro.properties: server.port=8082 ------------------------------------ application-dev.properties server.port=8081 ------------------------------------ application.properties spring.profiles.active=dev
SwaggerConfig:
package com.study.config; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.core.env.Environment; import org.springframework.core.env.Profiles; import springfox.documentation.builders.PathSelectors; import springfox.documentation.builders.RequestHandlerSelectors; import springfox.documentation.oas.annotations.EnableOpenApi; import springfox.documentation.service.ApiInfo; import springfox.documentation.service.Contact; import springfox.documentation.spi.DocumentationType; import springfox.documentation.spring.web.plugins.Docket; import java.util.ArrayList; @Configuration @EnableOpenApi public class SwaggerConfig { @Bean //配置了swagger的Docket的bean实例 public Docket docket(Environment environment) { //设置要显示的Swagger环境 Profiles profiles=Profiles.of("dev"); //判断是否处在自己设定的环境当中 boolean flag = environment.acceptsProfiles(profiles); //获取项目的环境 return new Docket(DocumentationType.SWAGGER_2).apiInfo(apiInfo()) .enable(flag) .select() .apis(RequestHandlerSelectors.basePackage("com.study.contoller") .build(); } //配置swagger信息:通过覆盖默认的apiInfo private ApiInfo apiInfo() { //配置作者的信息 Contact contact = new Contact("全村第二帅", "https://blog.csdn.net/qq_53860947?type=blog", "279618364@qq.com"); return new ApiInfo("自定义api文档", "码道万古如长夜", "v3.0", "https://blog.csdn.net/qq_53860947?type=blog", contact, "Apache 2.0", "http://www.apache.org/licenses/LICENSE-2.0", new ArrayList()); } }
结果:
在开发环境中,即定义的8081端口,实现了用Swagger来写一个接口文档