一、灵活构建的意义
一个优秀的构建系统必须足够灵活,它应该能够让项目在不同的环境下都能成功地构建。例如,典型的项目都会有开发环境、测试环境和产品环境,这些环境的数据库配置不尽相同,那么项目构建的时候就需要能够识别所在的环境并使用正确的配置。

还有一种常见的情况是,项目开发了大量的集成测试,这此测试运行起来非常耗时,不适合在每次构建项目的时候都运行。因此需要一种手段能让我们在特定的时候才激活这些集成测试。
Maven为了支持构建的灵活性,内置了三大特性,即属性、Profile和资源过滤。
 
二、Maven属性
Maven共有六类属性:
1、内置属性
常用的两个内置属性:
${basedir}:表示项目根目录
${version}:表示项目版本
 
2、POM属性
属性的默认值都是在超级POM中定义的。
 
3、自定义属性
POM的properties元素下定义的,如:
 
4、Settings属性
使用settings. 开头的属性引用settings.xml文件中的XML元素值,如
${settings.localRepository}指向本地仓库的地址。
 
5、Java系统属性
如${user.home}指向用户目录。
可以使用mvn help:system查看Java系统属性。
 
6、环境变量属性
使用env. 开头的Maven属性引用环境变量,如
${env.JAVA_HOME}代指JAVA_HOME环境变量的值。
 
三、资源过滤
1、替代可变部分——提取src/main/resources等配置文件中的可变部分
为了应对环境的变化,首先需要使用Maven属性将这些将会发生变化的部分提取出来。如在src/main/resources中的数据库配置文件,连接数据库使用的驱动类、URL用户名和密码都可能发生变化,因此用Maven属性取代它们:
 
2、配置可变部分——在POM中配置可变部分的值
即使使用了Maven属性,就应该在某个地方定义它们。我们知道了自定义Maven属性,这里要做的是使用一个额外的profile将其包裹,如:
这里与在POM的properties元素下定义并无二致,只是使用了一个id为dev的profile,将开发环境下的配置与其他环境区别开来。
 
3、使用配置——开启资源过滤
上述定义了Maven属性,但是Maven属性默认只有在POM中才会被解析。即${db.username}在POM中会变成test,但是在src/main/resources/目录下的文件中,构建的时候仍然是${db.username}。
资源文件的处理其实是maven-resoures-plugin做的事情,它默认的行为只是将项目主资源文件复制到主代码编译输出目录中,将测试资源文件复制到测试代码编译输出目录中。
不过只要通过一此简单的POM配置,该插件就能够解析资源文件中的Maven属性,即开启资源过滤。
 
4、激活profile
需要在命令行激活所需的profile的 id,则Maven就能够在构建项目的时候使用profile中属性值替换数据库配置文件中的属性引用。命令如下(id为dev):
  1. mvn clean install -Pdev
-P 参数表示在命令行激活一个profile,构建完成后,输出目录中的数据库配置就是:
 
四、Maven Profle
上述已经用到dev的开发环境profile,现在详细解释一下profile。
1、针对不同环境的profile
开发人员激活dev的profile,测试人员激活test的profile。
 
2、激活profile
激活可以使用命令行,也可使用settings设置文件,如下(id为dev-x):
另外,还有更多的激活方式,如
系统属性激活:某系统属性存在且值确定是激活profile;
操作系统环境激活:自动基于不同的操作系统进行激活;
文件存在与否激活:根据项目中某个文件存在与否来觉得是否激活profile;
默认激活:在定义profile的时候指定其默认激活,这种方式看似方便,但是优先级低。即,若POM中有任何一个profile通过以上任意一种方式被激活了,那么所有的默认激活配置都会失效!
如了解当前激活的profile?
  1. mvn help:active-profiles
  2. mvn help:all-profiles
 
3、profile的种类
与POM中的配置类似,可在以下位置声明profile:
pom.xml
用户settings.xml
全局settings.xml
 
五、Web资源过滤
有时,希望在构建项目的时候,为不同用户使用不一样的资源文件(如不同log、不同的css主题等)。
 
那么,如何开启过滤?
需要配置maven-war-plugin插件,对src/main/webapp这一Web资源目录开启过滤,并使用includes指定要过滤的文件。如下:
然后就可以选择激活某个profile进行构建,如
  1. mvn clean install -Pclient-a
 
 
 

《Maven实战》笔记-10-灵活的构建的更多相关文章

  1. [maven] 实战笔记 - 构建、打包和安装maven

    ① 手工构建自己的maven项目 Maven 项目的核心是 pom.xml.POM (Project Object Model,项目对象模型)定义了项目的基本信息,用于描述项目如何构建,声明项目依赖等 ...

  2. Maven实战(三)Eclipse构建Maven项目

    1. 安装m2eclipse插件    要用Eclipse构建Maven项目,我们需要先安装meeclipse插件    点击eclipse菜单栏Help->Eclipse Marketplac ...

  3. (转)Maven实战(三)Eclipse构建Maven项目

    1. 安装m2eclipse插件    要用Eclipse构建Maven项目,我们需要先安装meeclipse插件    点击eclipse菜单栏Help->Eclipse Marketplac ...

  4. shell 脚本实战笔记(10)--spark集群脚本片段念念碎

    前言: 通过对spark集群脚本的研读, 对一些重要的shell脚本技巧, 做下笔记. *). 取当前脚本的目录 sbin=`dirname "$0"` sbin=`cd &quo ...

  5. [maven] 实战笔记 - maven 安装配置

    1.下载地址http://maven.apache.org/download.html 2.windows下安装maven(1)下载 apache-maven-3.0-bin.zip 解压到任意目录下 ...

  6. Maven实战系列文章目录

    Maven实战(一)安装与配置 Maven实战(二)构建简单Maven项目 Maven实战(三)Eclipse构建Maven项目 Maven实战(四)生命周期 Maven实战(五)坐标详解 Maven ...

  7. maven实战系列

    Maven实战(一)安装和配置 Maven实战(二)构建简单Maven项目 Maven实战(三)Eclipse构建Maven项目 Maven实战(四)生命周期 Maven实战(五)坐标详解 Maven ...

  8. 【构建工具】《Maven实战》读书笔记

    Maven是我们在做Java开发过程中用经常用到的一个辅助工具.本篇博客是我学习Maven的一个记录博客,学习过程主要参考<Maven实战>这本书.同时也参考了Maven的官方文档. 1. ...

  9. 学习笔记——Maven实战(六)Gradle,构建工具的未来?

    Maven面临的挑战 软件行业新旧交替的速度之快往往令人咂舌,不用多少时间,你就会发现曾经大红大紫的技术已经成为了昨日黄花,当然,Maven也不会例外.虽然目前它基本上是Java构建的事实标准,但我们 ...

  10. 《Maven实战》第14章 灵活的构建

    面对不同环境的差异能够灵活的构建项目, 操作系统的差异 开发环境.测试环境.产品环境的差异(最常用) 不同客户的差异 Maven中灵活的构建:属性.资源过滤.profile 14.1Maven属性 6 ...

随机推荐

  1. bzoj5457 城市

    一棵树,每个点有一个民族,和一个人数,求每个子树里最多的民族及其人数,如果一样,输出编号最小的 $n \leq 500000$ sol: 卡莫队的毒瘤题,需要 dsu on tree 大概就是 dfs ...

  2. 学习动态性能表(8)--v$lock&v$locked_object

    学习动态性能表 第八篇-(1)-V$LOCK  2007.5.31 这个视图列出Oracle 服务器当前拥有的锁以及未完成的锁或栓锁请求.如果你觉着session在等待等待事件队列那你应该检查本视图. ...

  3. Ant能干什么,编译?打包!

    Ant轻便,灵巧,不像Maven一般沉重. 但是,这是我之前的看法.之前一直使用Eclipse自带的编译工具进行编译,然后采用ant进行打包:但是Eclipse编译工具编译之后的jar包参数名称之类的 ...

  4. 把Azure专线从Class模式迁移到ARM模式

    前面几篇文章介绍了Azure的ASM模式和ARM模式.很多用户已经在ASM模式下部署了Azure的专线服务,如果部署的应用是ARM模式,或ASM模式和ARM模式都有,就需要把ASM模式的专线迁移到AR ...

  5. 使用内省的方式操作JavaBean

    import java.beans.BeanInfo; import java.beans.Introspector; import java.beans.PropertyDescriptor; im ...

  6. 【转】LTE 全过程流程

    LTE 过程全流程 1. UE处于关闭状态 2. 打开UE电源. 3. 搜索附近的频率 4. 同步时间 5. 小区搜索 6. 小区选择 7. 解码MIB 8. 解码SIB 9. 初始化RACH过程 1 ...

  7. Celery-4.1 用户指南: Extensions and Bootsteps (扩展和Bootsteps)

    自定义消息消费者 你可能想要嵌入自定义的 Kombu 消费者来手动处理你的消息. 为了达到这个目的,celery 提供了一个 ConsumerStep bootstep 类,你只需要定义 get_co ...

  8. 用Nmap检测漏洞

    介绍两个NSE脚本,可以检测CVE漏洞 nmap-vulners:https://github.com/vulnersCom/nmap-vulners vulscan:https://github.c ...

  9. Android 4学习(7):用户界面 - 基础

    参考<Professional Android 4 Development> Android UI基本元素 下面这些概念是Android UI设计的基础,深入学习和理解它们是Android ...

  10. SpringMVC的Date与String互转

    摘要:        项目里经常需要用到日期和String之间的转换,比如后台的Date对象以Json形式返回给前端页面的时候,希望转换为yyyy-MM-dd HH:mm:ss格式的字符串,而前端页面 ...