Java SpringBoot 多环境配置

发布于 2024-09-04 12:06:15 字数 7644 浏览 12 评论 0

日常项目中经常会针对不同环境进行不同配置,比如数据库配置,在开发的时候,我们一般用测试数据库,而在生产环境的时候,我们是用正式的数据。或者像日志的配置等等,这时候,我们可以利用 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 的话,配置启动配置(推荐):

idea-config

不过一般我们也很少会在开发中更改环境,更多是打包时指定环境,这个时候就要使用 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 解压,就会暴露不同环境的配置

jar-未过滤版本

这个时候就得根据不同环境过滤打包后的文件了,在 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>

再次打包,可以发现

jar-已过滤版本

最后同样附上 样例代码

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

独闯女儿国

暂无简介

0 文章
0 评论
23 人气
更多

推荐作者

我们的影子

文章 0 评论 0

素年丶

文章 0 评论 0

南笙

文章 0 评论 0

18215568913

文章 0 评论 0

qq_xk7Ean

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文