热门标签 | 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/


推荐阅读
  • 在Java Web服务开发中,Apache CXF 和 Axis2 是两个广泛使用的框架。CXF 由于其与 Spring 框架的无缝集成能力,以及更简便的部署方式,成为了许多开发者的首选。本文将详细介绍如何使用 CXF 框架进行 Web 服务的开发,包括环境搭建、服务发布和客户端调用等关键步骤,为开发者提供一个全面的实践指南。 ... [详细]
  • Hadoop的文件操作位于包org.apache.hadoop.fs里面,能够进行新建、删除、修改等操作。比较重要的几个类:(1)Configurati ... [详细]
  • com.sun.javadoc.PackageDoc.exceptions()方法的使用及代码示例 ... [详细]
  • 解决Only fullscreen opaque activities can request orientation错误的方法
    本文介绍了在使用PictureSelectorLight第三方框架时遇到的Only fullscreen opaque activities can request orientation错误,并提供了一种有效的解决方案。 ... [详细]
  • 在JavaWeb开发中,文件上传是一个常见的需求。无论是通过表单还是其他方式上传文件,都必须使用POST请求。前端部分通常采用HTML表单来实现文件选择和提交功能。后端则利用Apache Commons FileUpload库来处理上传的文件,该库提供了强大的文件解析和存储能力,能够高效地处理各种文件类型。此外,为了提高系统的安全性和稳定性,还需要对上传文件的大小、格式等进行严格的校验和限制。 ... [详细]
  • 深入解析Struts、Spring与Hibernate三大框架的面试要点与技巧 ... [详细]
  • 如何使用 `org.apache.tomcat.websocket.server.WsServerContainer.findMapping()` 方法及其代码示例解析 ... [详细]
  • 本文介绍了如何利用Struts1框架构建一个简易的四则运算计算器。通过采用DispatchAction来处理不同类型的计算请求,并使用动态Form来优化开发流程,确保代码的简洁性和可维护性。同时,系统提供了用户友好的错误提示,以增强用户体验。 ... [详细]
  • 本文深入探讨了如何利用Maven高效管理项目中的外部依赖库。通过介绍Maven的官方依赖搜索地址(),详细讲解了依赖库的添加、版本管理和冲突解决等关键操作。此外,还提供了实用的配置示例和最佳实践,帮助开发者优化项目构建流程,提高开发效率。 ... [详细]
  • 本指南详细介绍了如何在CentOS 6.6 64位系统上以root用户身份部署Tomcat 8服务器。系统环境为CentOS 6.6 64位,采用源码安装方式。所需软件为apache-tomcat-8.0.23.tar.gz,建议将软件下载至/root/opt目录。具体下载地址请参见官方资源。本指南涵盖了从环境准备到服务启动的完整步骤,适用于需要在该系统环境下搭建高性能Web应用服务器的技术人员。 ... [详细]
  • Amoeba 通过优化 MySQL 的读写分离功能显著提升了数据库性能。作为一款基于 MySQL 协议的代理工具,Amoeba 能够高效地处理应用程序的请求,并根据预设的规则将 SQL 请求智能地分配到不同的数据库实例,从而实现负载均衡和高可用性。该方案不仅提高了系统的并发处理能力,还有效减少了主数据库的负担,确保了数据的一致性和可靠性。 ... [详细]
  • 一、Tomcat安装后本身提供了一个server,端口配置默认是8080,对应目录为:..\Tomcat8.0\webapps二、Tomcat8.0配置多个端口,其实也就是给T ... [详细]
  • MySQL初级篇——字符串、日期时间、流程控制函数的相关应用
    文章目录:1.字符串函数2.日期时间函数2.1获取日期时间2.2日期与时间戳的转换2.3获取年月日、时分秒、星期数、天数等函数2.4时间和秒钟的转换2. ... [详细]
  • 本文详细介绍了如何在 Linux 系统上安装 JDK 1.8、MySQL 和 Redis,并提供了相应的环境配置和验证步骤。 ... [详细]
  • 2021年Java开发实战:当前时间戳转换方法详解与实用网址推荐
    在当前的就业市场中,金九银十过后,金三银四也即将到来。本文将分享一些实用的面试技巧和题目,特别是针对正在寻找新工作机会的Java开发者。作者在准备字节跳动的面试过程中积累了丰富的经验,并成功获得了Offer。文中详细介绍了如何将当前时间戳进行转换的方法,并推荐了一些实用的在线资源,帮助读者更好地应对技术面试。 ... [详细]
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社区 版权所有