`

Maven 動態配置properties (resources)

阅读更多

    本文只作記錄和參考,希望對自己或者各位路人都有多少價值。

 

    在實際開發過程中,配置信息會因為不同環境而有所不同。而過多的人工干預,會增加工作量和錯誤率。現在記錄的是如何使用maven快速安全地切換配置信息而不需要多餘的人工修改干預。我們就以最常見的數據庫信息切換作為例子。

 

   Project Structure:

 

   ------src

            | ------ main

                          | ------java

                                        | ------ 省略,此處不是重點

                          | ------resources

                                        | ------ db.properties

                          | ------filters

                                        | ------ db-dev.properties

                                        | ------ db-prod.properties

            | ------ test

                          | ------java

                                        | ------ 省略,此處不是重點

                          | ------resources

                                        | ------ db.properties

                          | ------filters

                                        | ------ db-dev.properties

                                        | ------ db-prod.properties

   ------tags

   ------target

   ------trunk

   ------pom.xml

 

     項目結構就是最常見的maven project 結構。在此,留意filters, 這個是本文的重點。

     先來簡述一下。

      resources/db.properties -- 程序會從中讀取數據庫信息。對於不同的環境,dev/prod 信息不同。

      filters/db-dev.properties  -- dev 環境的數據庫信息

      filters/db-prod.properties  -- prod 環境的數據庫信息

 

     用一句話來概括, 就是字符的替換。 把db.properties的wildcard替換成dev/prod 的相應值。

 

     db.properties 的內容和dev/prod的內容,在格式上是一樣的。

   

 

#db.properties
db.username=${db.username}
db.password=${db.password}
application.name=${project.name}

 

#db-dev
db.username=dev
db.password=dev-pwd

 

#db-prod
db.username=prod
db.password=prod-pwd

 

 

    至此,準備工作已經完成。接下來是maven的配置。

 

    

<build>

    <filters>
         <filter>${project.basedir}/src/main/filters/db-${env}.properties</filter>
    </filters>
    <resources>
 	<resource>
        	<directory>src/main/resources</directory>
		<filtering>true</filtering>
	</resource>
    </resources>
</build>

 

 

     解釋一下。

     filters 的意義在於,表明使用該文件(s)中定義的值來替換目標字符。(From whom)

     resources/resource ,表示替換會對在哪個目錄下的文件作用。 (To whom)

 

    大家可能也會對${env} 有疑問。這個就是動態配置的關鍵之一。"profiles"

    在pom.xml 中,有以下聲明:

    

<profiles>
    <profile>
	<id>dev</id>
        <properties>
	   <env>dev</env>
	</properties>
    </profile>
    <profile>
	<id>prod</id>
        <properties>
	    <env>prod</env>
        </properties>
    </profile>
</profiles>

  

     此處聲明了2個 profiles. 這個profile 其實是可以定義任意的屬性,甚至可以把數據庫的信息定義在上面。不過,這麼做是不推薦的,靈活性太低。相反,僅定義2個profiles, 把並把對應的信息放入相應的properties會使的構建更加靈活和安全。畢竟,這些人手寫錯打錯導致各式各樣的問題屢見不鮮。當這些profile 被激活使用之後,就會初始化一個變量 , env。並且在filter下面的${env}會被替換成真實的值。這樣,就可以動態更改配置。

 

    把pom配置好之後,就可以嘗試編譯,體會一下這個形式的動態配置。

 

 

mvn clean compile

 

 

    此時,會出現以下錯誤: 

 

    

[ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:2.6:resources
        (default-resources) on project mvn.renew: Error loading property file 
         'D:\TestingDir\mavenBuildDemo\src\main\filters\db-${env}.properties' -> [Help
[ERROR]
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.

 

 

    為什麼? 因為這個時候還未有選擇 profile, 所以 ${env} 並沒有被初始化。我們應該用以下命令來構建:

    

 

mvn clean compile -Pdev

 

 

   -P 就是選擇對應在pom中聲明了的profile。

 

    

D:\TestingDir\mavenBuildDemo>mvn clean compile -Pdev
[INFO] Scanning for projects...
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building mvn.renew 1.0
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ mvn.renew ---
[INFO]
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ mvn.renew ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] Copying 1 resource
[INFO]
[INFO] --- maven-compiler-plugin:2.5.1:compile (default-compile) @ mvn.renew ---
[INFO] Compiling 1 source file to D:\TestingDir\mavenBuildDemo\target\classes
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 1.482 s
[INFO] Finished at: 2016-04-09T20:52:55+08:00
[INFO] Final Memory: 11M/107M
[INFO] ------------------------------------------------------------------------

 

 

    構建成功了。那麼怎麼驗證呢 ? 或許大家都知道,compile之後所有文件,包括 class and properties, 都會被放到 target/classes 下面。那麼我們就去target/classes 下面找。我們會找到一個 db.properties文件,打開檢查:

     

db.username=dev
db.password=dev-pwd
application.name=mvn.renew

 

 

   成功匹配 !!

 

   但是如果項目很大,每次構建都相當耗時,那麼,有沒有方法只更新配置文件而不重新編譯?

   這個問,肯定是有的啦 !

 

mvn process-resources -Pprod

 

     用process-resources, 這樣,只會更新配置文件,而不會重新編譯項目。

     再去看一下properties, 已經變成了 prod 的信息了。

    

 

db.username=prod
db.password=prod-pwd
application.name=mvn.renew

 

 

    本文到此,已經完結。大家有所感受了么? 

    在自己記錄的時候也喜歡在大家需要的時候給一點啟示或幫助.

   

    

分享到:
评论

相关推荐

    ResourceBundle与Properties读取maven中resources目录下的资源文件

    在Maven项目中,`src/main/resources`目录下通常存放了各种配置文件,例如`.properties`文件。本文将详细介绍如何使用`ResourceBundle`和`Properties`类来读取这些资源文件。 #### 二、Properties类读取资源文件 ##...

    maven profile多环境配置

    Maven Profile 多环境配置 Maven 是一个流行的项目管理工具,广泛应用于 JAVA 相关的项目中。...这样,在构建过程中,Maven 会加载 `src/main/resources/pro` 目录下的配置文件,实现了不同环境加载不同配置的目的。

    maven 过滤文件夹打包

    Maven的`maven-resources-plugin`插件提供了资源过滤功能,它允许我们在打包过程中根据构建目标(例如`package`命令)动态替换或选择性地包含文件。以下是如何配置Maven pom.xml文件来实现这一目标: ```xml ...

    MAVEN POM元素参考

    - `properties`: 定义项目属性,可在配置中通过`${property}`引用。 - `parent`: 定义父POM,子POM可以继承其属性和配置。 6. **构建生命周期** - Maven有三个主要的生命周期阶段:`clean`(清理),`default`...

    springboot+maven打包demo【将依赖与配置文件打包到jar包外部】

    在本文中,我们将深入探讨如何使用Spring Boot和Maven来构建一个项目,使得依赖和配置文件被打包到jar包外部,以实现更加灵活的项目管理。这个方法对于那些需要根据不同环境进行定制配置或者频繁更新配置的应用来说...

    maven多环境配置打包

    【标题】:“maven多环境配置打包” 在Java开发中,常常需要针对不同的运行环境(如开发、测试、生产)进行不同的配置。Maven作为Java项目管理的重要工具,提供了强大的多环境配置打包功能,帮助开发者有效地管理和...

    maven下载和配置,以及在idea里面如何设置本地仓库加配置,和创建java项目和web项目

    maven下载和配置、idea设置本地仓库、java项目和web项目创建 Maven是一个软件项目管理和理解工具,基于项目对象模型(POM)的概念,Maven可以从中央信息管理项目的创建、报告和文档。Maven的生命周期包括清理、编译...

    sprintboot maven 打包分享lib 资源文件properties xml yml

    这个过程不仅包括编译Java代码,还包括处理资源文件,如.properties, .xml, 和 .yml文件,这些文件对Spring Boot应用的配置至关重要。下面将详细解释如何使用Maven进行打包,并特别关注如何处理这些资源文件。 首先...

    Maven下载安装及其配置-maven下载安装配置

    ### Maven 下载安装及其配置详解 #### Maven 是什么? Maven 是由 Apache 软件基金会维护的一款专门针对 Java 项目提供构建与依赖管理支持的工具。它通过使用项目对象模型(Project Object Model, POM),能够自动...

    eclipse 创建maven 项目 动态web工程完整示例

    通过以上步骤,可以成功地在 Eclipse 中创建一个基于 Maven 的动态 Web 项目,并完成配置及部署。这种项目结构清晰,易于管理和维护,特别适合团队开发。同时,利用 Maven 的自动化构建特性,可以简化项目的构建过程...

    springmvc-CloudServer—maven基础配置+mysql+c3p0 项目基础搭建

    在本项目"SpringMVC-CloudServer"中,我们主要关注的是基于Maven的基础配置、MySQL数据库的使用以及c3p0数据源的集成。这是一个典型的Java Web项目,旨在搭建一个服务端应用,通过SpringMVC框架处理客户端请求。下面...

    Springboot与Maven多环境配置文件夹解决方案.docx

    本文介绍了如何使用 SpringBoot 和 Maven 实现多环境配置文件夹解决方案,使用 Profile 功能来加载不同的配置文件,使用 Resources 和 Filter 来指定打包内容和替换变量,选择当前环境,加载对应的配置文件。

    Maven项目中读取src/main/resources目录下的配置文件的方法

    Maven项目中读取src/main/resources目录下的配置文件的方法 在Maven项目中,读取src/main/resources目录下的配置文件是一件非常重要的事情。在本文中,我们将介绍如何在Maven项目中读取src/main/resources目录下的...

    解决Maven资源过滤的pom配置文件

    Maven通过`&lt;build&gt;`标签下的`&lt;resources&gt;`配置来管理这些资源文件的编译和打包过程。本文将详细解析如何通过POM配置文件控制资源文件的过滤行为。 #### Maven资源过滤简介 资源过滤是一种在构建过程中替换资源文件...

    maven多环境部署pom文件实例

    2. **文件夹方式**:创建不同环境的配置文件夹,如`src/main/resources-dev`、`src/main/resources-test`和`src/main/resources-prod`,并使用Maven资源过滤(Resource Filtering)来选择合适的资源文件。...

    ssm配置下resources需要的配置文件.zip

    本压缩包“ssm配置下resources需要的配置文件.zip”包含了SpringBoot学习课程中第六讲关于SSM和Maven在资源管理(resources)方面所需的配置文件。这些文件是构建SSM项目的基础,对理解Spring Boot如何整合这些框架...

    [SSH+Maven+Bootstrap视频教程]_17. 添加 log4j.properties 配置文件.zip

    在本节视频教程中,我们将深入探讨如何在Java项目中集成SSH(Struts、Spring、Hibernate)框架,并结合Maven构建工具以及Bootstrap前端框架,来添加和配置`log4j.properties`日志文件。这个过程对于任何Java开发人员...

    maven 3.6.1文件下次及配置修改

    ** Maven 3.6.1 文件结构详解及配置修改指南** Maven 是一个强大的Java项目管理工具,它帮助开发者构建、管理和部署项目。Maven 3.6.1 是一个稳定版本,提供了许多改进和优化。理解其文件结构以及如何进行配置修改...

Global site tag (gtag.js) - Google Analytics