Java SpringBoot 多环境配置
日常项目中经常会针对不同环境进行不同配置,比如数据库配置,在开发的时候,我们一般用测试数据库,而在生产环境的时候,我们是用正式的数据。或者像日志的配置等等,这时候,我们可以利用 profile 在不同的环境下配置不同的配置文件
而在 SpringBoot 中是允许约定按照一定的格式 (application-{profile}.yml) 来定义多个配置文件,然后通过在 application.yml 中通过指定 spring.profiles.active 来具体激活一个或者多个配置文件。
如果没有没有指定任何 profile 的配置文件的话,spring boot 默认会启动 application-default.yml
使用
现在大多流行 4 个环境配置,具体看项目的大小(较小的项目直接 dev+prod):
- dev: 开发环境,一般是供开发人员日常编写代码自测使用
- test(或者 sit): 测试环境,用于给测试人员验证功能时使用
- pre: 预发布环境,使用真实的数据进行上线前的功能流程验证用,基本上模拟了真实的生产环境
- prod: 生产环境,实际的生产环境
下面我就看下如何在 maven 下进行配置
yml 多环境配置
在 resources 中分别新建不同环境用的 yml(如果项目使用的是 properties 则修改 yml 后缀并改写配置为 properties 格式即可) 配置(演示方便只分别设置不同端口)
- application-dev.yml:
# 应用名称
server:
port: 8081
- application-test.yml:
server:
port: 8082
- application-prod.yml:
server:
port: 8083
pom 配置
这时需要在 pom.xml 中加入多环境配置(如果是多模块的项目则在最外层的 pom.xml 中配置即可,无需每个模块都配置)
<?xml version="1.0" encoding="UTF-8"?>
<project>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
<profiles>
<profile>
<id>dev</id>
<properties>
<profileActive>dev</profileActive>
</properties>
<activation>
<!--默认打包环境-->
<activeByDefault>true</activeByDefault>
</activation>
</profile>
<profile>
<id>test</id>
<properties>
<profileActive>test</profileActive>
</properties>
</profile>
<profile>
<id>prod</id>
<properties>
<profileActive>prod</profileActive>
</properties>
</profile>
</profiles>
</project>
再在原有 application.yml 加入(注意一定要配置 pom.xml,不然会报类似 @profileActive@找不到的错误):
spring:
profiles:
active: @profileActive@
如果不想定义多个 yml,也可以直接在 application.yml 中配置多个环境
通过—可以把一个 yml 文档分割为多个,并可以通过 spring.profiles.active 属性指定使用哪个配置文件
application.yml
spring:
profiles:
active: @profileActive@
---
# 应用名称
#spring:
# profiles: dev
spring:
config:
activate:
on-profile: dev
server:
port: 8081
---
# 应用名称
#spring:
# profiles: prod
spring:
config:
activate:
on-profile: dev
server:
port: 8082
springBoot 2.4 开始废弃了原有的 spring.profiles, 改为了 spring.config.activate.on-profile,故如果项目的 springBoot 版本是 2.4+的推荐用新的配置
切换环境
这个使用就默认使用 dev 环境进行运行,如果要开发中切换环境修改 pom.xml 中的默认打包环境即可(如切换为 test 环境):
<profile>
<id>test</id>
<properties>
<profiles.active>test</profiles.active>
</properties>
<activation>
<!--默认打包环境-->
<activeByDefault>true</activeByDefault>
</activation>
</profile>
或者使用 idea 的话,配置启动配置(推荐):
不过一般我们也很少会在开发中更改环境,更多是打包时指定环境,这个时候就要使用 mvn 命令了:
mvn clean package -Dmaven.test.skip=true -Ptest #测试环境
mvn clean package -Dmaven.test.skip=true -Pprod #生产环境
@Profile
在某些情况下除了静态配置,某些业务如发送邮件仅生产环境中才实际执行,而开发环境里则不发送以免向用户发送无意义的垃圾邮件。
可以借助 Spring 的注解 @Profile 实现这样的功能
public interface IEmailService {
void send(String content);
}
@Service
@Profile("prod")
public class EmailService implements IEmailService{
private final Logger logger = LoggerFactory.getLogger(getClass());
@Override
public void send(String content) {
//测试方便,仅仅打印日志
logger.info("发送邮件: {}", content);
}
}
@SpringBootTest
class EmailServiceTest {
private final Logger logger = LoggerFactory.getLogger(this.getClass());
@Autowired(required = false)
IEmailService emailService;
@Value("${spring.profiles.active}")
private String env;
@Test
void testSend() {
if(emailService == null) {
logger.error("当前环境:{} 不支持发送邮件",env);
} else {
emailService.send("这是一封测试邮件");
}
}
}
切换环境,可以发现只有设置为 prod 环境时才会打印发送邮件的日志
后记
网上还有一种配置的方式,就是不配置 pom.xml,通过 Java 名称进行环境指定:
java -jar xxx.jar --spring.profiles.active=test # 运行测试环境的配置
java -jar xxx.jar --spring.profiles.active=prod # 运行生产环境的配置
这种也是可以的
另外如果有些配置不方便放到源码管理中,可以指定加载外部配置的方式(当然如果使用了 springCloud 的话可以用 springConfig 或者 nacosConfig):
java -jar xxx.jar --spring.config.location=application-prod.yml
如果 jar(或者 war) 包会分发到客户机器中,由于 jar 可以直接当成 zip 解压,就会暴露不同环境的配置
这个时候就得根据不同环境过滤打包后的文件了,在 pom.xml 中加入过滤相关配置:
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
<finalName>${project.artifactId}</finalName>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.*</include>
</includes>
</resource>
<resource>
<directory>src/main/resources</directory>
<excludes>
<exclude>application-**.yml</exclude>
</excludes>
<filtering>false</filtering>
</resource>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>application.yml</include>
<include>application-${profileActive}.yml</include>
</includes>
<filtering>true</filtering>
</resource>
</resources>
</build>
再次打包,可以发现
最后同样附上 样例代码
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
上一篇: 在 docker 中运行 nginx
下一篇: 彻底找到 Tomcat 启动速度慢的元凶
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论