springboot 不同环境的配置问题
基于springboot的项目开发中常用的配置文件常常会因为环境的不同而变动,常见的环境就有本地环境,开发环境,测试环境,预生产以及生产环境。
为了方便对不同环境的配置管理和启用,spring提供了profile机制来实现不同环境的配置切换。
一、文件组成
在springboot项目中,默认的主配置文件一般放在项目的src\main\resources\目录下,默认启用的文件名为application.properties(或application.yml)。
随springboot的灵活配置特性,配置文件一般可以指定启动端口,启动项目名,数据源以及其他自定义的内容。如:
application.properties
#设定启动端口 server.port=8888 #定义项目名(springboot2.0及以上语法) server.servlet.context-path:/spring-test #设定日志配置路径 logging.config=classpath:logback.xml
而采用profile机制,则可以多追加以application-{profile}.properties的格式文件来表现不同环境的不同配置内容。如:
application-local.properties #本地环境
application-dev.properties #开发环境
application-test.properties #测试环境
application-prod.properties #生产环境
如图示:

各文件根据具体文件编写不同的配置项,如不同环境启用不同的端口,指定不同格式的logback文件等等。
基于以上情况,项目在正常运行时就要指定其加载何种配置文件,接下来就是激活profile的事情。
二、激活profile
真正需要的配置文件现在为applicaiton-{profile}.properties。
激活的方式有多种,网上其他内容有4至5种不同的profile激活方式,本文只罗列习惯的几种。
1.application.properties配置方式 (开发调试阶段常用)
使用此方式只需要在主配置文件application.properties追加spring.profiles.active内容即可。spring项目启动时读到此行会加载相应内容覆盖,代码如下:
application.properties
#激活指定配置文件
spring.profiles.active=dev
2.命令行 (启动项目时设定)
由于第一种方式一般只是在项目开发时使用,实际打包时若要更改环境配置还需要手动修改spring.profiles.active的值。
因此可以尝试使用命令行的方式运行项目,编写启动命令时增加命令行选项来指定需要激活的配置。
1)将项目install之后,会在target目录中生成.jar文件(本文springboot项目打包成jar包)。
2)然后在jar包所在磁盘地址栏cmd,输入如下命令启动项目使项目按照指定active值运行:
java -jar spring-test-0.0.1-SNAPSHOT.jar --spring.profiles.active=prod
3.使用Maven命令指定相应环境打包 (项目打包时设定)
为实现此方式的前提,项目的pom文件需要有如下配置:
<groupId>com.myDemo</groupId> <artifactId>spring-test</artifactId> <packaging>jar</packaging> <version>0.0.1-SNAPSHOT</version> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build>
使用mvn命令打包代码。mvn命令介绍:
(PS:打包项目一般要跳过测试代码,设置命令选项 -D maven.test.skip=true即可)
mvn -U clean package
使用package方式打包,该方式会执行clean、resources、compile、testResources、testCompile、test、jar等7个阶段。完成项目清理,文件加载,编译,测试和打包功能。但不会把打好的jar包部署到本地maven仓库和远程maven私服仓库。
mvn -U claen install
使用install命令打包,该方式会在上述7个阶段中增加intall阶段。即:clean、resources、compile、testResources、testCompile、test、jar、install。新增的阶段会将打好的jar包部署到本地maven仓库,但不会部署到远程maven私服仓库。
若打包成功,项目target目录会生成jar包,同时本地的Repository目录下(具体见maven安装目录下的config/settings.xml中的localRepository节点路径)也会生成相应jar包。
mvn clean deploy
该命令使用deploy,又会在上述8个阶段中增加deploy阶段,即实现远程maven私服仓库的部署。
熟悉以上情况后,可以尝试进行命令行打包了。windows系统下打开cmd命令行切换到项目根目录下,执行如下命令:
mvn -D maven.test.skip=true -U clean package
打包成功后会出现[INFO] BUILD SUCCESS等释文,此时项目的target目录下则会出现响应jar包。此jar包可以通过java -jar xxx.jar方式运行。
若需要部署到本地maven仓库,则执行命令:
mvn -D maven.test.skip=true -U clean install
此时,项目目录target目录以及本地mavan仓库repo目录都会出现相应jar包。
介绍了这么多,接下来步入正题,由于我们需要针对目标环境进行打包,所以我们可以在mvn命令中再追加一个命令选项
-P, --activate-profiles<arg> Comma-delimited list of profiles to activate.
这样就可以激活指定的profile文件。示例:
mvn -D maven.test.skip=true -U clean package -P test
其中-P test指的就是项目中的application-test.properties文件。
========20200225更新========
在上文中提到,用-P命令项来指定环境打包,但是纯粹依赖上文是不行的。依据profile特性,还需要调整pom.xml中的内容来达到目的。具体如下
1.pom中增加profile节点
在pom.xml中追加profiles节点,并为每个环境配置自己的profile节点,举例如下:
<project> ... <!-- 使用profile机制针对不同环境打包。命令行采用mvn -P 环境名 来执行打包 --> <profiles> <profile> <id>dev</id> <properties> <package.env>windows</package.env> </properties> <activation> <activeByDefault>true</activeByDefault> </activation> </profile> <profile> <id>test</id> <properties> <package.env>test</package.env> </properties> </profile> <profile> <id>prod</id> <properties> <package.env>prod</package.env> </properties> </profile> </profiles> </project>
注意,上述profile节点中定义了properties的属性,属性名自定义为package.env,这个属性需要在application.properties中被引用。
2.applicatoin.properties中更改配置为属性名引用
#激活一个环境的配置文件 #spring.profiles.active=dev #由pom.xml中指定resource和profiles来选择配置环境文件,这里改为profile中定义的property参数 spring.profiles.active=@package.env@
3.pom中的build节点增加resource节点来指定打包指定环境时需要加载的配置文件
在上两步完成之后,可以在原build节点中在增加resources节点,配置resource,指定需要加载的配置文件,示例如下:
<build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> <!-- 因增加了profiles节点指定环境配置,故build节点中要增加resource来指定文件所在 --> <resources> <resource> <directory>src/main/resources</directory> <!-- 过滤属性需要设置为true才会用指定文件覆盖原来的配置 --> <filtering>true</filtering> <includes> <!-- 定义要纳入的文件,这里*代表所有properties,xml后缀的配置文件 --> <!-- 注意:一旦这里include,那么只会加载include中的文件,没有指定的文件在打包的时候不会被加载,所以这里要么针对性的明确加载哪些文件,要么全部加载 --> <include>**/*.properties</include> <include>**/*.xml</include> </includes> </resource> </resources> </build>
以上步骤完成后,mvn -P 指令才会生效,此时在执行如下命令就可以正确打包。
mvn -D maven.test.skip=true -U clean package -P test
莫道山前无路,迟早柳暗花开。把秤皆有天地在,自是公平买卖
浙公网安备 33010602011771号