Apache Maven 使用 profile 和 filtering 实现多种环境下的资源配置管理(属性过滤)

本文主要是介绍Apache Maven 使用 profile 和 filtering 实现多种环境下的资源配置管理(属性过滤),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

构建项目时可能会遇到在测试(如单元测试)、开发、模拟、生产等不同环境下需要不同配置(propertiesxml)或资源(jpgpngmp3)的情况。比如常见的数据库连接(即 jdbc url)的值,在不同的环境下可能有如下几种值:

· 测试环境:jdbc:mysql://localhost:3306/foobar_test

· 开发环境:jdbc:mysql://localhost:3306/foobar_dev

· 模拟环境:jdbc:mysql://192.168.1.11:3306/foobar

· 生产环境:jdbc:mysql://192.168.1.10:3306/foobar

或者同样是生产环境,针对(产品)交付给A公司客户的与交付给B公司客户的需要不同配置或者资源,比如产品界面中的公司名称、公司LOGO等。

又或者针对不同的操作系统(如 WindowsLinux)需要为某个配置设定不同的文件路径。

可见,在不同的软件开发生命周期阶段、不同的最终客户(用户)环境、不同的运行平台都有可能需要不同配置或资源的情况。假如各个环境下的差别很小的话,我们可以在项目编译之后手工修改或者写个 shell script 自动修改,但如果需要修改的项目很多而且复杂的话,则应该使用 Apache Maven 的 Profile 和 Filtering 功能来解决。(当然前提是你的项目必须是用 Maven 构建的啦,哈哈,还有测试阶段所使用到的资源文件实际上 Maven 默认已经划分出来,所以并不需要本文所说的方法)

Filtering 功能

Filtering 是 Maven Resources Plugin 的一个功能,它会使用系统属性或者项目属性的值替换资源文件(*.properties*.xml)当中 ${符号的值。比如你系统属性有一项 “user.name=foobar”,那么资源文件当中的 ${user.name} 符号会在 Maven 编译时自动被替换为 “foobar”。

举个例子:

默认的项目资源文件位于 “src/main/resources” 目录,在该目录下创建一个文件 “test.properties”,里面写上一行:

Hello ${user.name}

然后修改项目文件(pom.xml)启用 filtering 功能,如:

<project>

    ...

    <build>

      ...

        <resources>

          <resource>

            <directory>src/main/resources</directory>

            <filtering>true</filtering>

          </resource>

          ...

        </resources>

        ...

    </build>

    ...

</project>

然后编译项目:

$mvn clean compile -Duser.name=foobar

查看输出文件 target/classes/test.properties 的内容,可见原先的 “Hello {user.name}” 已经变成 “Hello foobar”。

我们也可以把 filtering 用到的变量写在项目属性段里,比如:

<project>

  ...

  <properties>

    <user.name>foobar</user.name>

    <user.email>foobar@some.com</user.email>

  </properties>

  ...

</project>

如果属性项比较多的话,最佳实践是把他们抽离出来独立一个属性文件,比如在你项目目录(即 pom.xml 文件所在的目录)新建一个属性文件 project.properties

user.name=foobar

user.email=foobar@some.com

然后在 build/filters/filter 里指明使用这个属性文件作为 filtering 属性值的来源:

<project>

  ...

  <build>

    ...

    <filters>

      <filter>project.properties</filter>

    </filters>

    ...

  </build>

  ...

</project>

Profile 功能

Profile 的作用是允许你在项目文件(pom.xml)里定义若干个 profile 段,然后在编译时选择其中的一个用于覆盖项目文件原先的定义。接着上一个例子,如果我们需要为开发环境和生产环境定义不同的 user.name 属性值,则我们在项目目录里创建两个属性文件:

profile-development.properties,内容

user.name=foobar

profile-production.properties,内容

user.name=tom

然后在项目文件(pom.xml)里增加 profile 段,如下:

<project>

  ...

  <profiles>

    <profile>

      <id>development</id>

      <activation>

        <activeByDefault>true</activeByDefault>

      </activation>

      <build>

        <filters>

          <filter>profile-development.properties</filter>

        </filters>

      </build>

    </profile>

    <profile>

      <id>production</id>

      <build>

        <filters>

          <filter>profile-production.properties</filter>

        </filters>

      </build>

    </profile>

  </profiles>

</project>

在编译项目时,可以使用 -P 参数指定需要使用的 profile 的 id,比如下面命令将会使用 development profile

$mvn clean compile -Pdevelopment

如果想使用 production profile 则执行如下命令:

$mvn clean compile -Pproduction

假如不指定 -P 参数的话,则会使用 activeByDefault=true 的一项(即 development)。

至此,通过 filtering 和 profile 功能实现了为开发环境和生产环境使用不同配置值的目的。当然 profile 还可以允许你添加更多的定义,比如为某一个 profile 添加不同的资源文件。在一些大中型项目里,不同的环境可能仅仅修改配置值并不足够,可能还需要某个配置文件整个替换,那么就应该在 profiles/profile/build/resources 段里指定了。详细的可以参阅附录链接。

 

这篇关于Apache Maven 使用 profile 和 filtering 实现多种环境下的资源配置管理(属性过滤)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/831666

相关文章

关于集合与数组转换实现方法

《关于集合与数组转换实现方法》:本文主要介绍关于集合与数组转换实现方法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、Arrays.asList()1.1、方法作用1.2、内部实现1.3、修改元素的影响1.4、注意事项2、list.toArray()2.1、方

使用Python实现可恢复式多线程下载器

《使用Python实现可恢复式多线程下载器》在数字时代,大文件下载已成为日常操作,本文将手把手教你用Python打造专业级下载器,实现断点续传,多线程加速,速度限制等功能,感兴趣的小伙伴可以了解下... 目录一、智能续传:从崩溃边缘抢救进度二、多线程加速:榨干网络带宽三、速度控制:做网络的好邻居四、终端交互

Python中注释使用方法举例详解

《Python中注释使用方法举例详解》在Python编程语言中注释是必不可少的一部分,它有助于提高代码的可读性和维护性,:本文主要介绍Python中注释使用方法的相关资料,需要的朋友可以参考下... 目录一、前言二、什么是注释?示例:三、单行注释语法:以 China编程# 开头,后面的内容为注释内容示例:示例:四

java实现docker镜像上传到harbor仓库的方式

《java实现docker镜像上传到harbor仓库的方式》:本文主要介绍java实现docker镜像上传到harbor仓库的方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录1. 前 言2. 编写工具类2.1 引入依赖包2.2 使用当前服务器的docker环境推送镜像2.2

C++20管道运算符的实现示例

《C++20管道运算符的实现示例》本文简要介绍C++20管道运算符的使用与实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录标准库的管道运算符使用自己实现类似的管道运算符我们不打算介绍太多,因为它实际属于c++20最为重要的

Java easyExcel实现导入多sheet的Excel

《JavaeasyExcel实现导入多sheet的Excel》这篇文章主要为大家详细介绍了如何使用JavaeasyExcel实现导入多sheet的Excel,文中的示例代码讲解详细,感兴趣的小伙伴可... 目录1.官网2.Excel样式3.代码1.官网easyExcel官网2.Excel样式3.代码

Go语言数据库编程GORM 的基本使用详解

《Go语言数据库编程GORM的基本使用详解》GORM是Go语言流行的ORM框架,封装database/sql,支持自动迁移、关联、事务等,提供CRUD、条件查询、钩子函数、日志等功能,简化数据库操作... 目录一、安装与初始化1. 安装 GORM 及数据库驱动2. 建立数据库连接二、定义模型结构体三、自动迁

python实现对数据公钥加密与私钥解密

《python实现对数据公钥加密与私钥解密》这篇文章主要为大家详细介绍了如何使用python实现对数据公钥加密与私钥解密,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录公钥私钥的生成使用公钥加密使用私钥解密公钥私钥的生成这一部分,使用python生成公钥与私钥,然后保存在两个文

python删除xml中的w:ascii属性的步骤

《python删除xml中的w:ascii属性的步骤》使用xml.etree.ElementTree删除WordXML中w:ascii属性,需注册命名空间并定位rFonts元素,通过del操作删除属... 可以使用python的XML.etree.ElementTree模块通过以下步骤删除XML中的w:as

ModelMapper基本使用和常见场景示例详解

《ModelMapper基本使用和常见场景示例详解》ModelMapper是Java对象映射库,支持自动映射、自定义规则、集合转换及高级配置(如匹配策略、转换器),可集成SpringBoot,减少样板... 目录1. 添加依赖2. 基本用法示例:简单对象映射3. 自定义映射规则4. 集合映射5. 高级配置匹