热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

SpringBootProfile与MavenProfile集成实践

SpringBootProfile与MavenProfile集成实践 2017-07-04 SPRINGBOOT MAVEN文章目录1. 摘要2. 集成的意义3. MavenFil

Spring Boot Profile 与Maven Profile 集成实践

文章目录
  1. 1. 摘要
  2. 2. 集成的意义
  3. 3. Maven Filter
    1. 3.1. Filtering
    2. 3.2. Spring Boot Resource 插件的默认配置
  4. 4. Spring Boot Profile
    1. 4.1. Spring Maven 默认配置
  5. 5. 集成
    1. 5.1. 工程结构
      1. 5.1.1. 演示实例的默认工程结构为:
      2. 5.1.2. jdbc.properties
      3. 5.1.3. application.properties
      4. 5.1.4. application-${profile}.properties
    2. 5.2. pom 中定义Profile 参数
    3. 5.3. 覆盖默认Resource 插件配置
    4. 5.4. Filter 的使用
    5. 5.5. 采用Maven **Spring Profile
    6. 5.6. 打包部署
      1. 5.6.1. 运行Maven 指令打包
      2. 5.6.2. 结果查看
    7. 5.7. 源代码
    8. 5.8. 总结
  6. 6. 好书推荐
  7. 7. 参考

摘要

在现代的项目开发中多人协作、多环境部署已经是必不可少的软件开发方式,笔者目前正在开发的一个基于Spring Boot 项目环境就有四套之多,包括(本地、测试、演练、生产)。尤其是现代的大型项目开发,构建复杂、参与人数众多等因素,使得高效的构建工具必不可少。而Maven 正是这样的一款优秀的Java工程构建工具。
本文主要介绍Maven Profile 与Spring Boot Profile 集成使用的方式。一句话概括就是两种类型的Profile 能够实现的功能既有不同也有交叉,本文的目的就是要充分的使用各自的优势实现项目的合理构建。

集成的意义

Maven 作为构建工具,其侧重的粒度更大一些,偏重与项目的整体环境配置、项目的依赖管理以及各种环境下的配置文件管理。当然Maven 也能够实现属性的配置。
Spring Boot Profile 作为Spring 提供的功能,由Spring 最核心的IoC 功能可知,其更加侧重于Spring Beans 的多环境配置以及属性字段的配置。
因而,集成的意义就在采用Maven 来实现多环境下的配置文件管理,依赖管理等,而Spring Boot Profile 来实现属性,以及Spring Boot 自动装配的Bean 的属性的配置。

Maven Filter

Filtering

Maven Filter 是Maven Resource 插件提供的利用环境变量、pom文件定义的属性以及指定的*.properties配置文件里的属性来替换其他文件中的占位符,如${jdbc.driverClassName}。在本集成实例中就会分别读取不同Profile 下的数据库连接配置文件。替换application.properties 中的占位符。

Spring Boot Resource 插件的默认配置

在构建基于Spring Boot 项目时,就会继承自spring-boot-starter-parent,查看该文件会得到如下内容:

1
2
3
4
5
6
7
8
9
10
11
<plugin>
<groupId>org.apache.maven.pluginsgroupId>
<artifactId>maven-resources-pluginartifactId>
<version>2.6version>
<configuration>
<delimiters>
<delimiter>${resource.delimiter}delimiter>
delimiters>
<useDefaultDelimiters>falseuseDefaultDelimiters>
configuration>
plugin>

${resource.delimiter}的值在该文件的开始位置已经将默认的$ 修改为@,定义如下:

1
2
<resource.delimiter>@resource.delimiter>

Spring Boot Profile

Spring Maven 默认配置

同理,在spring-boot-starter-parent 文件中,Spring Boot 对Resource 进行了配置,包括需要被打包进jar&war 的application* 文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<build>
<resources>
<resource>
<directory>${basedir}/src/main/resourcesdirectory>
<filtering>truefiltering>
<includes>
<include>**/application*.ymlinclude>
<include>**/application*.yamlinclude>
<include>**/application*.propertiesinclude>
includes>
resource>
<resource>
<directory>${basedir}/src/main/resourcesdirectory>
<excludes>
<exclude>**/application*.ymlexclude>
<exclude>**/application*.yamlexclude>
<exclude>**/application*.propertiesexclude>
excludes>
resource>
resources>
build>

从配置文件中可以看到Spring Boot 对配置文件的默认打包设定。

集成

本次实现Spring Boot Profile 与Maven Profile 的集成主要有如下目的:

  • 实现不同环境下(profile)将不同目录下的jdbc.properties 文件打包到classpath 下
  • 采用jdbc.properties 文件中配置的数据库连接信息替换application.properties 文件中的通配符@*@
  • 实现根据选中的Maven Profile **Spring Boot Profile的属性spring.profiles.active

工程结构

演示实例的默认工程结构为:

Spring Boot Profile 与Maven Profile 集成实践Spring Boot Maven Profile 集成项目结构

jdbc.properties

1
2
3
4
jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mybatis?useUnicode=true&characterEncoding=UTF-8
jdbc.username=root
jdbc.password=release

application.properties

application.properties 文件中需要被替换通配符的数据库连接信息:

1
2
3
4
5
# config datasource
[email protected]@
[email protected]@
[email protected]@
[email protected]@

application-${profile}.properties

每一个application-${profile}.properties 文件中都定义了一个属性:

1
2
3
4
5
6
7
8
# config dev properties
self.hello=hello world dev
# config release properties
self.hello=hello world release
# config test properties
self.hello=hello world test

该属性将会被在HomeController.java 中读取,并作为返回参数,对打包结果进行测试:

1
2
3
4
5
6
7
8
9
10
11
12
13
@RestController
public class HomeController {
private final static Logger LOG = LoggerFactory.getLogger(HomeController.class);
@Value("${self.hello}")
private String hello;
@GetMapping(value = "/")
public String home() {
LOG.info("hi, {}.", hello);
return hello;
}
}

pom 中定义Profile 参数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<profiles>
<profile>
<id>testid>
<properties>
<activatedProperties>testactivatedProperties>
properties>
<activation>
<activeByDefault>trueactiveByDefault>
activation>
profile>
<profile>
<id>prodid>
<properties>
<activatedProperties>prodactivatedProperties>
properties>
profile>
<profile>
<id>releaseid>
<properties>
<activatedProperties>releaseactivatedProperties>
properties>
profile>
profiles>

本实例中我们在pom.xml 定义了testprodrelease 三个Profile, test为默认**。

覆盖默认Resource 插件配置

通过maven resource 插件实现对不同Profile 下的文件的拷贝:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<resources>
<resource>
<directory>${basedir}/src/main/resources/${activatedProperties}-confdirectory>
resource>
<resource>
<directory>${basedir}/src/main/resourcesdirectory>
<filtering>truefiltering>
<includes>
<include>**/application.ymlinclude>
<include>**/application.yamlinclude>
<include>**/application.propertiesinclude>
includes>
resource>
<resource>
<directory>${basedir}/src/main/resourcesdirectory>
<filtering>truefiltering>
<includes>
<include>**/application-${activatedProperties}.ymlinclude>
<include>**/application-${activatedProperties}.yamlinclude>
<include>**/application-${activatedProperties}.propertiesinclude>
includes>
resource>
<resource>
<directory>src/main/resourcesdirectory>
<filtering>truefiltering>
<excludes>
<exclude>**/*.propertiesexclude>
excludes>
resource>
resources>

Filter 的使用

使用Filter 替换掉通配符:

1
2
3
4
<filters>
<filter>src/main/resources/application-${activatedProperties}.propertiesfilter>
<filter>${basedir}/src/main/resources/${activatedProperties}-conf/jdbc.propertiesfilter>
filters>

采用Maven **Spring Profile

在上文中我们为Maven 定义了三种不同的activatedProperties,在application.properties 中如下配置:

1
2
# use maven profile properties to config spring boot profile
[email protected]@

打包部署

运行Maven 指令打包

1
mvn clean package -Dmaven.test.skip=true -P${activatedProperties}

此处指定Profile 为release

1
mvn package -Dmaven.test.skip=true -Prelease

结果查看

  • 打包后的jar 中的application.properties
    Spring Boot Profile 与Maven Profile 集成实践打包后的`jar` 中的`application.properties`

  • 浏览器查看
    Spring Boot Profile 与Maven Profile 集成实践浏览器查看

  • Java 代码查看

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    @SpringBootApplication
    public class BootMvnProfilesApplication {
    private final static Logger LOG = LoggerFactory.getLogger(BootMvnProfilesApplication.class);
    public static void main(String[] args) {
    ConfigurableApplicationContext applicatiOnContext=
    SpringApplication.run(BootMvnProfilesApplication.class, args);
    String[] profiles = applicationContext.getEnvironment().getActiveProfiles();
    LOG.info("active profiles are {}.", Arrays.toString(profiles));
    }
    }

源代码

本工程源代码可以从github 获取。源代码

总结

本文详细地介绍了Maven Profile 与Spring Boot Profile 进行集成的步骤。同时,对集成的原理进行了深入的介绍,包括Spring Boot 各个插件的默认配置等信息。相信通过阅读本文,并结合源代码,读者一定可以对其熟练的掌握。希望本文可以对读者在工程构件上有所裨益。

好书推荐

  • 《Maven实战》 京东
  • 《Java编程思想(第4版)》 京东
  • 《Java核心技术 卷I:基础知识(原书第10版)》京东
  • 《Spring实战(第4版)》京东
  • 《Spring Boot实战》京东

参考

  1. Spring Boot Maven Plugin
  2. Spring Boot Doc Maven Plugin
  3. How to set spring boot active profiles with maven profiles
  4. maven profile
  5. 使用 Maven Profile 和 Filtering

本文章采用知识共享署名 2.5 ***许可协议进行许可。
欢迎转载,但转载请注明来自张兆玉,并保持转载后文章内容的完整。本人保留所有版权相关权利。
本文链接:tramp.cincout.cn/2017/07/04/tool-2017-07-05-integrate-maven-profile-with-spring-boot-profile/

原文链接:http://tramp.cincout.cn/2017/07/04/tool-2017-07-05-integrate-maven-profile-with-spring-boot-profile/


推荐阅读
  • CentOS 6.5安装VMware Tools及共享文件夹显示问题解决方法
    本文介绍了在CentOS 6.5上安装VMware Tools及解决共享文件夹显示问题的方法。包括清空CD/DVD使用的ISO镜像文件、创建挂载目录、改变光驱设备的读写权限等步骤。最后给出了拷贝解压VMware Tools的操作。 ... [详细]
  • eclipse学习(第三章:ssh中的Hibernate)——11.Hibernate的缓存(2级缓存,get和load)
    本文介绍了eclipse学习中的第三章内容,主要讲解了ssh中的Hibernate的缓存,包括2级缓存和get方法、load方法的区别。文章还涉及了项目实践和相关知识点的讲解。 ... [详细]
  • 如何实现织梦DedeCms全站伪静态
    本文介绍了如何通过修改织梦DedeCms源代码来实现全站伪静态,以提高管理和SEO效果。全站伪静态可以避免重复URL的问题,同时通过使用mod_rewrite伪静态模块和.htaccess正则表达式,可以更好地适应搜索引擎的需求。文章还提到了一些相关的技术和工具,如Ubuntu、qt编程、tomcat端口、爬虫、php request根目录等。 ... [详细]
  • 本文详细介绍了SQL日志收缩的方法,包括截断日志和删除不需要的旧日志记录。通过备份日志和使用DBCC SHRINKFILE命令可以实现日志的收缩。同时,还介绍了截断日志的原理和注意事项,包括不能截断事务日志的活动部分和MinLSN的确定方法。通过本文的方法,可以有效减小逻辑日志的大小,提高数据库的性能。 ... [详细]
  • 本文介绍了在Python3中如何使用选择文件对话框的格式打开和保存图片的方法。通过使用tkinter库中的filedialog模块的asksaveasfilename和askopenfilename函数,可以方便地选择要打开或保存的图片文件,并进行相关操作。具体的代码示例和操作步骤也被提供。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • PHP设置MySQL字符集的方法及使用mysqli_set_charset函数
    本文介绍了PHP设置MySQL字符集的方法,详细介绍了使用mysqli_set_charset函数来规定与数据库服务器进行数据传送时要使用的字符集。通过示例代码演示了如何设置默认客户端字符集。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • 本文介绍了在SpringBoot中集成thymeleaf前端模版的配置步骤,包括在application.properties配置文件中添加thymeleaf的配置信息,引入thymeleaf的jar包,以及创建PageController并添加index方法。 ... [详细]
  • 使用Ubuntu中的Python获取浏览器历史记录原文: ... [详细]
  • 本文介绍了在Mac上搭建php环境后无法使用localhost连接mysql的问题,并通过将localhost替换为127.0.0.1或本机IP解决了该问题。文章解释了localhost和127.0.0.1的区别,指出了使用socket方式连接导致连接失败的原因。此外,还提供了相关链接供读者深入了解。 ... [详细]
  • 《数据结构》学习笔记3——串匹配算法性能评估
    本文主要讨论串匹配算法的性能评估,包括模式匹配、字符种类数量、算法复杂度等内容。通过借助C++中的头文件和库,可以实现对串的匹配操作。其中蛮力算法的复杂度为O(m*n),通过随机取出长度为m的子串作为模式P,在文本T中进行匹配,统计平均复杂度。对于成功和失败的匹配分别进行测试,分析其平均复杂度。详情请参考相关学习资源。 ... [详细]
  • 高质量SQL书写的30条建议
    本文提供了30条关于优化SQL的建议,包括避免使用select *,使用具体字段,以及使用limit 1等。这些建议是基于实际开发经验总结出来的,旨在帮助读者优化SQL查询。 ... [详细]
author-avatar
中国传媒大学一零播本更_822
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有