Maven多环境打包

场景

在应用部署的时候,往往遇到需要发布到不同环境的情况,而每个环境的数据库信息、密钥信息等可能会存在差异。举个例子,在Spring Boot中我们使用application.properties作为应用环境配置文件,那么不同环境下的配置可能有以下差异:

  • ** dev(开发环境)**
spring.datasource.url=jdbc:oracle:thin:@192.168.0.1:1521:orcl 
spring.datasource.username=dev
spring.datasource.password=dev
  • test(测试环境)
spring.datasource.url=jdbc:oracle:thin:@192.168.0.1:1521:orcl 
spring.datasource.username=test
spring.datasource.password=test
  • prod(生产环境)
spring.datasource.url=jdbc:oracle:thin:@123.56.5.34:1521:orcl 
spring.datasource.username=prod
spring.datasource.password=prod

那么如何在打包的时候较好处理环境信息呢?Maven提供了一种比较优雅的方案处理这类问题。
下面针对Spring Boot框架开发的应用对如何配置多环境信息进行说明。

配置步骤

1.在pom中设置Filters

Spring Boot在它的Parent Pom中使用了以下默认配置:

<resources>
    <resource>
          <directory>${basedir}/src/main/resources</directory>
        <filtering>true</filtering>
          <includes>
              <include>**/application*.yml</include>
              <include>**/application*.properties</include>
         </includes>
    </resource>
</resources>

(在Maven的Resource插件中,默认的filtering配置为false,此外Spring Boot默认为true)
上面配置的意思为满足/application.yml/application.properties**两个正则表达式的所有文件都会进行过滤处理,且当filtering为true时过滤处理才生效,什么是过滤处理,请看下面步骤。

在pom文件的build标签下配置filters如下:

<build>
        <filters>  
            <filter>${basedir}/filters/application-dev.properties</filter>  
        </filters> 
</build>

filter里面内容的意思为:
假如src/main/resources/application.properties的内容为:

spring.datasource.url=@spring.datasource.url@
spring.datasource.username=@spring.datasource.username@
spring.datasource.password=@spring.datasource.password@

maven会在filters/application-dev.properties提取这些参数的值,假如application-${env}.properties的内容为:

spring.datasource.url=jdbc:oracle:thin:@192.168.0.1:1521:orcl 
spring.datasource.username=dev
spring.datasource.password=dev

当我们使用mvn package命令打包后,原来位置WEB-INF/classes下的application.properties中的值会被替换成application-dev.properties里面的内容。

2.配置profile(可选)

步骤1中的${env}参数,等价于pom下的profile id

<profiles>  
    <profile>
    <id>test</id>
    <activation>
        <activeByDefault>true</activeByDefault>
    </activation>
    </profile>
<profiles>  

当我们使用mvn package -Ptest命令打包应用时,系统会将application-test.properties的参数值复制到src/main/resources/application.properties中;
同理当我们使用mvn package -Pdev命令时,系统会将application-dev.properties的参数值复制到src/main/resources/application.properties中。

其他说明

  1. 根据网上的资料application.properties中的参数写法为 ${param}
    但在Spring Boot 1.3.0.RELEASE中必须使用格式 @param@才能生效
    详见:
    https://github.com/spring-projects/spring-boot/issues/980,
    http://docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/htmlsingle/#howto-use-short-command-line-arguments

2.除了使用${env}环境变量,还可以使用其他方法传递参数

  • 通过mvn package -Dcustom=dev命令传入${custom}的参数值
  • 通过pom中的<properties>属性定义参数值

3.除了在parent的pom.xml里面根据profile设置运行参数外,maven还支持在parent的pom.xml或 module的pom.xml设置profile,使得在某一种条件下激活一个profile并执行自定义的步骤:

        <profile>
            <id>webdev</id>
            <activation>
                <activeByDefault>false</activeByDefault>
                <property>
                    <name>deploy.mode</name>
                    <value>dev</value>
                </property>
            </activation>
            <build>
            </build>
        </profile>

意思为,当打包的mvn命令中含有deploy.mode参数,且参数值为dev时,激活这个profile。
例:mvn package -Ddeploy.mode=dev

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容