Maven为了支持构建的灵活性,内置了3大特性,即:属性、Profile和资源过滤。

6.1 Maven属性

Maven的属性与Java代码的常量有异曲同工之妙,都是为了消除重复,对相关内容进行统一管理并且可以减少日后升级版本的工作量,降低错误发生的概率。

在POM文件中,可以通过${属性名称}的方式来引用属性。

在Maven中,存在6类属性,分别为:

  1. 内置属性,主要有两个,分别为:${basedir}表示项目根目录,即POM文件所在的目录、${version}表示项目的版本。

  2. POM属性,用户可以通过该类属性引用POM文件中对应元素的值,如:

     ${project.artifactId}对应到<project><artifactId>的值,常用的POM属性有:
    ${project.build.sourceDirectory}项目的主源码目录,默认为src/main/java/
    ${project.build.testSourceDirectory}项目的测试源码目录,默认为src/test/java
    ${project.build.directory}项目构建输出目录,默认为target/
    ${project.outputDirectory}项目主代码编译输出目录,默认为target/classes
    ${project.testOutputDirectory}项目测试代码输出目录,默认为target/test-classes
    ${project.groupId}项目的groupId
    ${project.artifactId}项目的artifactId
    ${project.version}项目的version,与${version}等价
    ${project.build.finalName}项目打包输出文件名称,默认为${project.artifactId}-${project.version}

Remark:每一个POM属性都对应到一个POM元素

  1. 自定义属性:用户在POM文件的<properties>元素下定义的Maven属性,如:
<properties>
<spring.boot.version>1.5.9.RELEASE</spring.boot.version>
</properties>
  1. Settings属性

    与POM属性同理,使用settings.开头的属性引用settings.xml文件中xml元素的值,如常用的${settings.localRepository}引用本地仓库的地址。

  2. Java系统属性

    所有java系统属性都可以使用Maven属性进行引用,如${user.home}指向用户目录,可以通过mvn help:system查看所有的java系统属性。

  3. 环境变量属性

    所有的环境变量可以使用env.开头的Maven属性进行引用,如${env.JAVA_HOME}指向了JAVA_HOME环境变量的值,可以通过mvn help:system查看所有的环境变量。

6.2 Maven属性最佳实践

6.2.1通过自定义属性消除重复

基于Java平台的开发,目前基本都会引进springframework帮我们简化工作,需要MVC功能,则引入spring-webmvc,需要事务管理功能,引入spring-tx。在我们POM文件中引入相关依赖:

<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>4.3.14.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>4.3.14.RELEASE</version>
</dependency>

当我们需要升级springframework的时候,需要修改多个地方,如果这些依赖不放在一起的时候,则容易造成漏更改,导致多版本并存,这个时候,可以使用自定义属性,如:

<properties>
<springframework.version>4.3.14.RELEASE</springframework.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>${springframework.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${springframework.version}</version>
</dependency>
</dependencies>

当需要进行版本升级的时候,只需要修改springframework.version属性即可。

6.2.2使用POM属性依赖内部模块

在一个多项目中,模块之间一般会有依赖,并且这些模块通常会使用同一的groupId和version,这个时候可以使用POM属性,如:

<dependencies>
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>demo-base</artifactId>
<version>${project.version}</version>
</dependency>
</dependencies>

这样,当进行项目版本升级时,就不需要更改依赖模块的版本了。

Maven实战读书笔记(六):Maven灵活构建的更多相关文章

  1. 《Maven实战》笔记-10-灵活的构建

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

  2. maven实战读书笔记(二)

    一个Spring加载属性的工具类,指定目标位置之后可以用${}的方式加载配置文件 测试maven工程发送email的例子:运行成功的例子—github 常用的命令: mvn clean compile ...

  3. Maven实战读书笔记(二):Maven坐标与仓库

    2.1 Maven坐标 Maven坐标是Maven用来表示一个组件依赖的标示. Maven通过下面几个元素定义坐标:groupId.artifactId.version.packaging.class ...

  4. Maven实战读书笔记(四):Maven生命周期与插件

    Maven的生命周期是对所有构建过程的抽象和统一.包含了项目的清理.初始化.编译.测试.打包.集成测试.验证.部署和站点生成等几乎所有构建步骤. Maven的生命周期是抽象的,其实际行为是由插件来完成 ...

  5. Maven实战读书笔记(七):Maven常用功能

    7.1.资源排除 <resources> <!-- 启动过滤,包含的文件会被过滤掉 --> <resource> <directory>src/main ...

  6. Maven实战读书笔记(五):聚合与继承

    Maven的聚合特性能够把项目的各个模块聚合在一起构建,而继承特性则能够帮助抽取各模块相同的依赖和插件等配置,在简化POM的同时,还能促进各个模块配置的一致性. 5.1 聚合 Maven聚合也称多模块 ...

  7. Maven实战读书笔记(一):Maven概述

    1.1 Maven是什么,能做什么 Maven是一个跨平台的项目管理工具,主要服务于Java平台的项目构建.依赖管理和项目信息管理. Maven的用途之一是项目构建,能够自动化构建过程,从清理.编译. ...

  8. maven实战读书笔记(三)

    maven将一系列的步骤都封装为一系列的插件,运行命令后一系列的插件运行

  9. maven实战读书笔记(一)

    环境变量设置 MAVEN_HOME:G:\maven-3.2\apache-maven-3.2.5 Path: G:\maven-3.2\apache-maven-3.2.5\bin 其实正确的设置应 ...

随机推荐

  1. ORACLE PL/SQL 实例精解之第七章 迭代控制之二

    7.1CONTINUE语句 CONTINUE语句会导致循环终止当前迭代.并且当CONTINUE的条件为TRUE时,开始执行该循环的下一次迭代.需要借助于IF语句来计算COUNTINUE条件.当CONT ...

  2. 洛谷 - P1162 - 填涂颜色 - 简单搜索

    https://www.luogu.org/problemnew/show/P1162 在外面加一圈0把0连起来,然后把所有0换成2,再从(0,0)把连通的2全部改回来. 这也是一个判断内外圈的好办法 ...

  3. hdoj5667 BestCoder Round #80 【费马小定理(膜拜)+矩阵快速幂+快速幂】

    #include<cstdio> #include<string> #include<iostream> #include<vector> #inclu ...

  4. 洛谷 P2519 [HAOI2011]problem a

    传送门 考虑转化为求最多说真话的人数 设$f(i)$表示排名前$i$的人中最多说真话的人的数量,考虑转移,如果由$j$转移而来,可以设$[j,i]$之间的人全都分数相等,那么式子就是$f[i]=f[j ...

  5. 笔记-JavaWeb学习之旅

    junit单元测试 黑盒测试:不需要写代码,给输入值,看程序是否能够输出期望的值 白盒测试:需要些代码,关注程序具体的执行流程 Junit使用: 白盒测试 ​ 步骤: 定义一个测试类(测试用例) 定义 ...

  6. Jmeter之一个请求获取上一个请求的参数

    刚开始有这个需求,网上都是一些使用正则表达式的例子,苦于自己看不好正式的表达式,且响应结果稍微变一下,自己就不会写了,于是谷歌上各种搜,也阅读官网上文档,后来发现一个好的插件 Json path Ex ...

  7. python之os、sys和random模块

    import os # print(os.getcwd())#获取当前目录,绝对路径# print(os.chdir('../'))#更改当前目录,../的意思是退回上一级目录# print(os.g ...

  8. 优先队列 POJ 2431 Expedition

    题目传送门 题意:一辆卡车要行驶L长度,初始有P油,每行驶一个单位长度消耗一单位油.有n个加油站可以加油,问最少加油几次才能行驶L长度,如果不能输出-1 分析:按照挑战书的解法,每走到一个加油站相当于 ...

  9. ubuntu 16.0.4安装MySQL5.7

    系统版本 root@sishen:~# uname -a Linux sishen 4.10.0-35-generic #39~16.04.1-Ubuntu SMP Wed Sep 13 09:02: ...

  10. spark序列化及MapOutputTracker解析

    本文主要打算对spark内部的序列化机制以及在shuffle map中起衔接作用的MapOutputTracker做一下剖析.主要涉及具体实现原理以及宏观设计的一些思路. 1,spark序列化 任何一 ...