参考:
在开发过程中,我们的软件会面对不同的运行环境,比如开发环境、测试环境、生产环境,而我们的软件在不同的环境中,有的配置可能会不一样,比如数据源配置、日志文件配置、以及一些软件运行过程中的基本配置,那每次我们将软件部署到不同的环境时,都需要修改相应的配置文件,这样来回修改,很容易出错,而且浪费劳动力。 maven提供了一种方便的解决这种问题的方案,就是profile功能。
请看如下代码:
<profiles>
<profile>
<id>devid>
<properties>
<activation>
<activeByDefault>trueactiveByDefault>
activation>
profile>
<profile>
<id>testid>
<properties>
<activeProfile>testactiveProfile>
properties>
profile>
<profile>
<id>prodid>
<properties>
<activeProfile>prodactiveProfile>
properties>
profile>
profiles>
在上面我们定义了三个环境分别是dev, test, prod, 其中dev环境默认激活, 并且每个环境都有一个属性activeProfile, 当dev激活时activeProfile=dev, 当test激活时activeProfile=test
其实使用activeProfile的作用就是一个标识, 标识当前是哪一个环境激活了, 我们可以应用该字段到许多地方, 及其灵活
在上述内容中我们使用及其子标签分别定义了不同环境中activeProfile的值, 请看如下代码中的使用:
目录结构
├── _pom.xml
├── _src
| ├──_main
| |--_java
| |--_resources
| |--application.yml
| |--application-dev.yml
| |--application-prod.yml
| |--application-test.yml
| └── test
pom.xml
<profiles>
profiles>
<build>
<resources>
<resource>
<directory>src/main/resources/directory>
<excludes>
<exclude>application-*.ymlexclude>
excludes>
resource>
<resource>
<directory>src/main/resourcesdirectory>
<includes>
<include>application-${activeProfile}.ymlinclude>
includes>
resource>
resources>
build>
上述代码就是在dev环境激活的时候, 将src/main/resources文件中application-开头的yml文件不打包, 除了application-dev.yml
使用maven打包时通过-P参数,-P后跟上profile的唯一id,如下命令打包
mvn clean package -Pprod
pom.xml
<profiles>
profiles>
<build>
<resources>
<resource>
<directory>src/main/resources/directory>
<excludes>
<exclude>application.ymlexclude>
<exclude>application-*.ymlexclude>
excludes>
resource>
<resource>
<directory>src/main/resourcesdirectory>
<filtering>truefiltering>
<includes>
<include>application.ymlinclude>
<include>application-${activeProfile}.ymlinclude>
includes>
resource>
resources>
<plugins>
<plugin>
<groupId>org.apache.maven.pluginsgroupId>
<artifactId>maven-resources-pluginartifactId>
plugin>
plugins>
build>
上述代码使用maven-resources-plugin插件将application.yml和application-${activeProfile}.yml中引用的mavne属性进行解析, 注意一定要开启filtering
不熟悉的话可以百度 [maven filtering]和[在yml中引入maven属性] 熟悉或者获取更多使用技巧
application.yml
spring:
profiles:
# 引入我们定义的自定义变量
active: '@activeProfile@'
application:
# 引用标签中的值
name: '@project.name@'
这样当我们激活dev环境的时候, maven将会打包application.yml和application-dev.yml, 并且将spring.profiles.active和spring.application.name进行解析
这段只是引用别人博客中内容, 未实际验证
在application.xml文件中不能出现@关键字,就算你注释了也不行。当出现@了,之后的所有环境变量将不会被注入
如:
在springboot中, 定义三个配置文件, application.yml, application-dev.yml, application-test.yml, application-prod.yml
在application.yml中配置通用的配置, application-dev.yml配置开发环境下的配置
在pom.xml中
<profiles>
profiles>
<build>
<resources>
<resource>
<directory>src/main/resources/directory>
<excludes>
<exclude>application.ymlexclude>
<exclude>application-*.ymlexclude>
excludes>
resource>
<resource>
<directory>src/main/resourcesdirectory>
<filtering>truefiltering>
<includes>
<include>application.ymlinclude>
<include>application-${activeProfile}.ymlinclude>
includes>
resource>
resources>
<plugins>
<plugin>
<groupId>org.apache.maven.pluginsgroupId>
<artifactId>maven-resources-pluginartifactId>
plugin>
plugins>
build>
并且在application.yml中
spring:
profiles:
active: '@activeProfile@'
这样当pom.xml中定义的dev环境激活时, active被修改成dev(详细参考第2部分), spring读取application.yml后将会读取application-dev.yml中的配置, 如果两个配置重复, 以application-dev.yml中的为准
同时, 我们还可以使用@Profile来配置不同环境下的Bean
比方说我们在dev, test环境下需要使用Swagger, 但是在prod环境下不使用Swagger
@Configuration
@Profile({"dev", "test"})
@EnableSwagger2
public class Swagger2Config {
}
@Profile将会匹配spring.profiles.active参数, 上面代码的意思是只用在dev或者test环境被激活的时候才配置Swagger2Config
@Configuration
@Profile("!prod")
@EnableSwagger2
public class Swagger2Config {
}
// 上面代码意思是在非prod环境下配置Swagger2Config, 即该bean在dev和prod环境中都会生效
在application.yml中
spring:
profiles:
include: database
意味着不管是在什么环境中, 都会去加载application-database.yml中的独有的配置, 非独有配置将不会生效