Maven管理SpringBoot Profile详解
1. spring profile
spring可使用profile绝对程序在不同环境下执行情况,包含配置、加载bean、依赖等。
spring的profile一般项目包含:dev(开发), test(单元测试), qa(集成测试), prod(生产环境)。由spring.profiles.active属性绝定启用的profile。
springboot的配置文件默认为 application.properties(或yaml,此外仅心properties配置为说明)。不同profile下的配置文件由application-{profile}.properties管理,同时独立的 profile配置文件会覆盖默认文件下的属性。
2. maven profile
maven同样也有profile设置,可在构建过程中针对不同的profile环境执行不同的操作,包含配置、依赖、行为等。
maven的profile由 pom.xml 的<profiles>标签管理。每个profile中可设置:id(唯一标识), properties(配置属性), activation(自动触发的逻辑条件), dependencies(依赖)等。
此文章不对spring和maven的profile作过多说明,详细情况请自行查阅。
3. maven 管理 spring profile
由于构建是基于maven(或gradle,此处仅以maven说明)。所以使用maven管理spring构建时的profile是非常方便的。
maven管理spring profile分五步,以下详细介绍。
3.1 去掉默认的 tomcat依赖
在springboot mvc项目中,默认以内嵌tomcat运行,如果需要特殊的设置或者使用undertow,需要去掉默认的tomcat依赖:
<dependency> <groupid>org.springframework.boot</groupid> <artifactid>spring-boot-starter-web</artifactid> <exclusions> <exclusion> <groupid>org.springframework.boot</groupid> <artifactid>spring-boot-starter-tomcat</artifactid> </exclusion> </exclusions> </dependency>
如果你同时使用了 mybatis,需要去掉tomcat-jdbc依赖:
<dependency> <groupid>org.mybatis.spring.boot</groupid> <artifactid>mybatis-spring-boot-starter</artifactid> <exclusions> <exclusion> <groupid>org.apache.tomcat</groupid> <artifactid>tomcat-jdbc</artifactid> </exclusion> </exclusions> </dependency>
3.2 maven profile设置
在项目(如果有模块为具体模块)的pom.xml下设置:
<!-- maven控制spring profile --> <profiles> <profile> <id>dev</id> <activation> <activebydefault>true</activebydefault> </activation> <properties> <profileactive>dev</profileactive> </properties> <dependencies> <dependency> <groupid>org.springframework.boot</groupid> <artifactid>spring-boot-starter-tomcat</artifactid> </dependency> <dependency> <groupid>org.apache.tomcat</groupid> <artifactid>tomcat-jdbc</artifactid> </dependency> </dependencies> </profile> <profile> <id>prod</id> <properties> <profileactive>prod</profileactive> </properties> </profile> </profiles>
从上面的配置可以看出,maven的profile配置了两个:dev和prod,并且在dev中使用了内嵌tomcat,而 prod 中没有,所以这两个profile打包的文件dev可以直接运行(plugin使用了springboot plugin),而prod并不能直接运行(或部署在外部tomcat下,并不推荐这样,后面会说明)。
properties中的profileactive是我们申明的属性,此处对应spring的profile值。
3.3 maven资源过滤
springboot的 profile选择需要在 application.properties中配置,如果定死在文件,那么每次打包都需要手动修改,很麻烦,而且容易出错。
maven的资源过滤功能可以实现在构建时修改以“@xxx@”表示的属性。资源过滤需要在pom.xml的<build>标签下配置 resources:
<!-- profile对资源的操作 --> <resources> <resource> <directory>src/main/resources</directory> <excludes> <exclude>application*.properties</exclude> </excludes> </resource> <resource> <directory>src/main/resources</directory> <!-- 是否替换@xx@表示的maven properties属性值 --> <filtering>true</filtering> <includes> <include>application.properties</include> <include>application-${profileactive}.properties</include> </includes> </resource> </resources>
上面的第一个resource去掉了src/main/resources下的所有application.properties文件,“”是通配符,表示此处有任何内容(没有也可以)都匹配。
第二个resource添加了application.properties默认配置文件和由profileactive属性决定的相应profile配置文件。并且filtering为true表示,会将文件内容的“@xx@”替换为相应的变量(如文件中的@profileactive@会替换为profileactive属性值)。
3.4 spring配置profile
在application.properties默认配置文件中配置:
spring.profiles.active = @profileactive@
@profileactive@表示该属性值会在maven构建时被替换掉。
3.5 构建
构建命令:
mvn clean package -pdev
上面的命令会根据maven profile的 dev构建环境包,如果需要prod包,则把-p的参数替换成prod即可。
为了方便我会在每个项目下生成一个build.sh文件,内容如下:
#!/bin/bash profileactive=prod if [ -n "$1" ]; then profileactive=$1 fi mvn clean package -dmaven.test.skip=true -p$profileactive
该脚本接收一个参数,即打包对应的profile。默认情况下如果不带参数,会打包prod环境包。
需要注意的是,该命令跳过了测试。
4. 总结
完成了上面的五步,即可使项目根据你的构建参数的不同,打包出不同环境下运行的包。
第1步去掉了springboot内嵌的tomcat和tomcat-jdbc。使得我们可以决定在什么情况下使用何种容器运行我们的项目。
第2步配置了maven构建porfile,使得构建可根据我们的指令分发不同的包。
第3步配置了maven资源过滤,不仅使得不同profile下的资源文件互不可见,且替换了资源文件中以“@xx@”表示的属性值。
第4步使spring的profile由maven决策,这样,我们就不用每次打包都修改spring的profile配置了。
第5步展示了如何执行不同profile下的构建命令,并且使用了一个shell脚本方便我们执行构建和跳过测试(多数时候我们在构建项目时先测试,并不需要在构建时测试,测试和构建的解耦使得我们更专注。但同时,如果你忘记了前置测试,也可能会引发未察觉的测试问题)。
以上就是本文关于maven管理springboot profile详解的全部内容,希望对大家有所帮助。欢迎参阅:、使用maven运行java main的三种方法解析等,有什么问题可以留言,欢迎大家交流讨论。
上一篇: 简单谈谈Python中的闭包