引言: 在SpringBoot对程序开发做了大量的简化和约定,本文将基于Spring Boot来展示如何进行profile的切换以及部署中基于profile中进行配置信息的动态替换。
1. 基于环境
Spring Boot 1.4.1 Release, STS, JDK 1.8
2. 创建Spring Boot项目
打开STS 3.8.2, STS是Spring官方的开发工具。 打开File --> New--> Spring Starter Project,打开如下界面:
设定项目名称,目录位置,groupId,artifactId等信息,点击Next,
选取依赖包,这里主要是使用了Spring Boot项目提供的工具包;我这里选用devTool,然后点击Finish完成操作。
接下来,我们来查看一下Spring Boot的项目目录结构:
在STS中,基于Spring Boot的项目会在右上角新增一个S的标识,项目名称后面新增[boot]标识,这里使用了Spring Boot提供了devtool辅助工具,故【devtools]也被写入了项目的名称之中。
相对于maven的项目,新增了mvnw.sh和mvnw.cmd两个文件,这两个文件其实是maven wrapper文件,那有人就会问了,这两个文件有什么用呀?这里它的用处也是非常友好的,就是不再假设本地已经按照maven库; 当本地没有安装maven之时,就自动在后台进行下载,自动安装maven,然后执行后续的命令和操作,是不是很友好呀?
3. 新增配置信息
新增db.xml和test.properties两个配置文件信息, db.xml的信息如下:
<?xml version="1.0" encoding="UTF-8"?>
<info>@test.infos@</info>
test.properties的信息如下:
add.info=@test.infos@
相比于maven中的占位符,可以发现两者的占位符是不一样的,Spring boot使用@key_val@来表示,maven使用${key_val}来标识占位符。
我们来看一下项目的配置信息:
这里可以看到新增config目录,目录下有2个配置文件。 application.properties是系统默认提供的全局配置信息。
4. 更新pom.xml文件内容
在pom.xml中新增了resources的配置信息,在profile中新增了filter信息,具体如下:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.cuckoo.report</groupId>
<artifactId>brain</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>MavenDemo</name>
<description>Cuckoo Threat Analysis</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.4.1.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
</build>
<profiles>
<profile>
<id>test</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<test.infos>replacedKey</test.infos>
</properties>
<build>
<filters>
<filter>src/main/resources/config/db.xml</filter>
<filter>src/main/resources/config/test.properties</filter>
</filters>
</build>
</profile>
</profiles>
</project>
大家可以发现maven的插件都是通过spring-boot-maven-plugin来完成相关组件的引入的,无需在额外引入其他相关的plugins了,是不是很简单?‘
5. 执行部署或者打包
切换至项目根目录,在命令行可以执行2组命令,可以执行mvn相关命令,也可以执行mvnw相关的spring-boot命令,关于Spring boot的命令主要有以下几种:
- spring-boot:run runs your Spring Boot application. 主要的启动命令
- spring-boot:repackage repackages your jar/war to be executable.
- spring-boot:start and spring-boot:stop to manage the lifecycle of your Spring Boot application (i.e. for integration tests).
- spring-boot:build-info generates build information that can be used by the Actuator.
这里也可以使用mvnw spring-boot:run来启动应用,从而检查配置信息是否被动态的替换。
mvn的命令仍然与原有的命令一致,这里使用mvn package来打包测试配置信息的过滤:
D:\Dev\workspace\MavenDemo>mvn package -Dmaven.test.skip=true
[INFO] Scanning for projects...
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building MavenDemo 0.0.1-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ brain ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] Copying 3 resources
[INFO]
[INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ brain ---
[INFO] Changes detected - recompiling the module!
[INFO] Compiling 1 source file to D:\Dev\workspace\MavenDemo\target\classes
[INFO]
[INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ bra
[INFO] Not copying test resources
[INFO]
[INFO] --- maven-compiler-plugin:3.1:testCompile (default-testCompile) @ brain --
[INFO] Not compiling test sources
[INFO]
[INFO] --- maven-surefire-plugin:2.18.1:test (default-test) @ brain ---
[INFO] Tests are skipped.
[INFO]
[INFO] --- maven-jar-plugin:2.6:jar (default-jar) @ brain ---
[INFO] Building jar: D:\Dev\workspace\MavenDemo\target\brain-0.0.1-SNAPSHOT.jar
[INFO]
[INFO] --- spring-boot-maven-plugin:1.4.1.RELEASE:repackage (default) @ brain ---
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 4.448 s
[INFO] Finished at: 2016-10-17T15:26:19+08:00
[INFO] Final Memory: 25M/208M
[INFO] ------------------------------------------------------------------------
切换至项目根目录/targe/classes下查看配置信息,即可发现占位符已经被正确替换了。
然后一切操作完成了。
6. 扩展阅读
大家也可以阅读我的一篇blog,关于基于maven的profile配置信息替换文章: Maven中基于POM.xml的Profile来动态切换配置信息