一、SpringBoot的多环境启动
1. 在maven打包时使用 -P参数来指定环境,对应着 pom.xml中profiles->profile->id
<!-- 打包环境配置 -->
<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>product</id>
<properties>
<profileActive>product</profileActive>
</properties>
</profile>
spring.profiles.active = @profileActive@
而springBoot的配置文件application.properties中的spring.profiles.active就会被赋值为-P指定的环境,从而加载对应环境的配置文件application-{profileActive}.properties
clean install -pl service-gateway -am -e -U -Dfile.encoding=UTF-8 -DskipTests=true -P${env}
2. 没有使用-P打包,在运行时使用-D, -D表示Java System Properties (VM Arguments)
java -jar -Dspring.profiles.active=prod application.jar
3. 没有使用-P打包,在运行时使用--, --表示Program arguments
在命令行运行时,连续的两个减号--就是对application.properties中的属性值进行赋值的标识
java -jar application.jar --spring.profiles.active=prod
二、SpringBoot的多环境使用
如果遇到需要对不同环境执行不同的代码逻辑时,如何处理呢?
1. 使用@Value("${spring.profiles.active}")
@Value("${spring.profiles.active}")
private String profile;
2. 使用自定义常量类来获取
public static void main(String[] args) {
setProfilesActive(args);
SpringApplication.run(MyApplication.class, args);
}
// spring boot main启动的时候设置了启动参数,把启动参数里面的spring.profiles.active 设置到系统属性文件中
public static void setProfilesActive(String[] args) {
for (String arg : args) {
if (arg.contains(CapitalConstant.PROFILES_ACTIVE) && arg.startsWith("--")) {
String optionText = arg.substring(2, arg.length());
String optionName;
String optionValue;
if (optionText.contains("=")) {
optionName = optionText.substring(0, optionText.indexOf('='));
optionValue = optionText.substring(optionText.indexOf('=') + 1, optionText.length());
System.setProperty(optionName, optionValue);
}
}
}
}
package com.success.constants;
import org.springframework.beans.factory.config.YamlPropertiesFactoryBean;
import org.springframework.core.io.ClassPathResource;
import java.util.Objects;
import java.util.ResourceBundle;
public class EnvConstant {
private EnvConstant() {
}
public static final String PROFILES_ACTIVE = "spring.profiles.active";
public static final String CURRENT_ACTIVE;// spring boot 当前激活的环境
static {
String active = System.getProperty(PROFILES_ACTIVE);
if (Objects.nonNull(active)) {
CURRENT_ACTIVE = active;
} else {
try{
active = ResourceBundle.getBundle("application").getString(PROFILES_ACTIVE);
}catch (Exception e){
YamlPropertiesFactoryBean bean = new YamlPropertiesFactoryBean();
bean.setResources(new ClassPathResource("application.yml"));
active = bean.getObject().getProperty(PROFILES_ACTIVE);
}finally {
CURRENT_ACTIVE = active;
}
}
}
}
3. 使用@Proflie来标识同一个接口在不同环境下的不同实现
@Service
@Profile("prod") //生产环境.
public class ProdEmailServiceImpl2 implements EmailService{
@Override
publicvoid send() {
System.out.println("DevEmailServiceImpl.send().生产环境执行邮件的发送.");
//具体的邮件发送代码.
//mail.send();
}
}