Maven学习笔记


Maven概述

  • Maven定义

    • Maven是一个项目管理和整合,统一管理jar包的工具;
    • Maven为开发者提供了一套完整的构建生命周期框架,可以让开发团队快速完成工程的基础构建配置,因为Maven使用了标准的目录结构和默认的生命周期;
    • Maven能够帮助开发者完成构建、文档生成、报告、依赖、SCMs、发布、分发和邮件列表;
  • 总结

    • Maven简化了工程的构建过程,并对其标准化;
    • 衔接了编译、发布、文档生成、团队合作和其他;
    • Maven提高了重用性,负责大部分构建任务;
  • Maven历史
    Maven最初是在Jakarta-Turbine项目中为了简化构建过程而设计的。项目中有几个子工程,每个工程包含稍有不同的 ANT 文件。JAR 文件使用 CVS 管理。
    Apache 小组随后开发了Maven,能够同时构建多个工程、发布工程信息、部署工程、在几个工程中共享 JAR 文件,并且协助团队合作。

  • Maven目的

    • 主要是为开发这提供一个可复用、可维护、更易理解的工程综合模型
    • 以及与这个模型交互的插件或者工具
  • Maven宗旨
    始终贯彻一句话:约定优于配置
    开发者不需要关心每一个配置细节。当创建Maven工程时,Maven会创建默认的工程结构,开发者只需要合理防止文件,在pom.xml中不需要再定义任何配置;

例如: Maven工程的默认结构(假定${basedir}表示工程目录)

配置项 默认值
源代码 ${basedir}/src/main/java
配置文件 ${basedir}/src/main/resources
测试文件 ${basedir}/src/test
打包的jar包 ${basedir}/target
编译后的文件(字节码文件) ${basedir}/target/classes

Maven环境配置

  • 系统要求
项目 要求
JDK Maven3.3要求JDK1.7或以上
Maven3.2要求JDK1.6或以上
Maven3.0/3.1要求JDK1.5或以上
内存 没有最低要求
磁盘 Maven自身安装大约10MB空间,除此之外,都是用来存放本地仓库的jar包,预期至少500MB
操作系统 没有最低要求
  • 配置步骤
  1. 检查Java安装(JDK)
    打开操作系统的命令行,然后输入命令:java -version
  2. Java环境配置
操作系统 设置
Windows 环境变量 JAVA_HOME = Java的JDK安装目录,然后将JAVA_HOME添加到系统的环境变量Path后面
Linux export JAVA_HOME=/usr/local/java-current,然后export PATH=PATH:JAVA_HOME/bin/
Mac export JAVA_HOME=/Library/Java/Home
  1. 下载Maven文件
    http://maven.apache.org/download.html下载Maven3.2.5
  2. 解压并配置Maven环境变量
    解压文件,安装Maven3.2.5得到子目录apache-maven-3.2.5
操作系统 设置
Windows 使用系统属性设置环境变量
M2_HOME=C:\dictionary\apache-maven-3.2.5
M2=%M2_HOME%\bin
MAVEN_OPTS=-Xms256m -Xmx512m,然后添加“;%M2%”到Path变量后面
Linux 打开命令行设置环境变量
export M2_HOME=/usr/local/apache-maven/apache-maven-3.2.5
export M2=$M2_HOME/bin
export MAVEN_OPTS=-Xms256m -Xmx512m
最后export PATH=M2:PATH
Mac 打开命令行设置环境变量
export M2_HOME=/usr/local/apache-maven/apache-maven-3.2.5
export M2=$M2_HOME/bin
export MAVEN_OPTS=-Xms256m -Xmx512m
最后export PATH=M2:PATH
  1. 验证Maven安装
    打开操作系统的命令行,然后输入命令:mvn -version

Maven仓库

  • 定义
    Maven仓库:仓库是一个位置,可以存储所有工程的jar文件,library jar文件,插件或者其他工程指定的文件;
  • 类型
    • 本地仓库
      • Maven本地仓库是本地机器上的一个文件夹,在第一次运行任何maven命令的时候创建;
      • 本地仓库在运行maven构建后,会自动下载并保存工程中需要的所有依赖、插件等到本地仓库中,避免每次构建都需要去远程仓库引用;
      • 本地仓库的默认路径在User/用户名/.m2下,如果需要重新定义位置,可以在settings.xml文件中的localRepository标签中定义新的存放位置;
    • 中央仓库
      • 由Maven社区提供的仓库,包含了大量常用的库;
      • 这个仓库由Maven社区管理;
      • 不需要用户手动配置;
      • 需要通过网络才能访问;
      • 搜索Maven中央仓库的jar包依赖:http://search.maven.org/#browse
    • 远程仓库
      • 远程仓库是为了解决Maven在中央仓库找不到依赖的库文件而停止构建并报错这种情况;
      • 远程仓库是开发人员你自己定制的仓库,包含了自己需要的代码或者其他项目需要的jar文件;

构建配置文件

  • 定义
  1. 构建配置文件是一组配置的集合,用来设置或者覆盖Maven构建的默认配置,使用构建配置文件,可以为不同的环境定制构建过程,例如pro和dev环境。
  2. Profile在pom.xml中使用activeProfiles/profiles元素指定,而且可以用多种方式触发,Profile在构建时修改POM,并且为变量设置不同的目标环境,例如日志环境,kafka环境。
  • Profile
    • Profile类型

      类型 使用
      Pre Project 定义在POM文件的pom.xml中
      Per User 定义在Maven设置xml文件中(%USER_HOME%/.m2/settings.xml)
      Global 定义在Maven全局配置xml文件中(%USER_HOME%/conf/settings.xml)
    • Profile激活方法

    1. 显式使用命令控制台输入
    2. 通过maven设置
    3. 基于环境变量(用户/系统变量)
    4. 操作系统配置
    5. 现存/缺失文件

Maven POM

  • POM前言
    定义:

    1. POM代表工程对象模型,是使用Maven工作的基本组件,是一个xml文件,被放在工程根目录下,命名为pom.xml;
    2. POM包含了工程和各种配置细节的信息;
    3. POM也包含了目标和插件;

    注意:

    1. 每个工程只有一个POM文件;
    2. 所有的POM文件需要根元素(project元素)和三个必须字段:groupId,artifactId,version;
    3. 在仓库中的工程标识为:groupId:artifactId:version;
  • POM用途

    • pom.xml用来定义Maven工程结构和内容,是Project Object Model的简称;
    • pom.xml是整个Maven系统的基础组件;
  • POM配置详解

    • POM配置组成

      1. POM的模型版本:modelVersion标签,在Maven2和Maven3中,只支持4.0.0版本

      2. 基本配置

      配置名称 描述
      dependencies 项目引用插件所需要的额外的依赖
      groupId 项目组ID
      artifactId 构件的标识符,它和groupId一起唯一标识一个构件
      version 项目版本
      packaging 项目打包方式,例如jar、war、ear、pom
      parent 引用的父项目
      modules 引用的模块
      properties 自定义的各种必要属性,在文件中可以使用${属性名}来引用
      1. build配置
      配置名称 描述
      build 构建项目需要的信息,主要标签:Resources(用于排除或者包含一些资源文件)和Plugins(设置构建的插件)
      reporting 使用报表插件产生的报表规范,当用户执行“mvn site”,这些报表就会运行
      1. 项目信息配置
      配置名称 描述
      issueManagement 给出defect tracking system及其访问URL
      ciManagement 给出Continuous Integration Management、其URL和notifier(集成过程中发生事件,以某种方式(如mail)通知开发人员)
      scm(software configuration management) connection、developerConnection、tag、url
      distributionManagement 构件的发布管理
      prerequisites POM执行的前提条件,目前只支持对Maven版本的要求
      mailingLists 开发人员或用户的邮件列表(name、subscribe、unsubscribe、post、archive、otherArchives)
      1. 环境配置
      配置名称 描述
      name 项目的名称代号
      description 项目说明
      url 项目官网url
      inceptionYear 项目开发年份
      licenses 可以包含多个license,以及子属性:name(license名称)、url(license可访问的url地址)、distribution(license发布方式)、comments(license说明)
      organization 包含组织的name,组织的官网url
      developers developer中包含id、name、email、url、organization、organizationUrl、roles、timezone、properties
      contributors contributor包含除了id之外的所有developer属性
    • POM元素继承
      元素继承的原因:为了减少重复代码的编写,需要创建POM的父子结构,在父POM中申明一些供子POM继承的配置,实现“一处申明,多处使用”。

可继承的POM元素:

  1. groupId:项目组ID,项目坐标的核心元素
  2. version:项目版本,项目坐标的核心因素
  3. description:项目的描述信息
  4. organization:项目的组织信息
  5. inceptionYear:项目的创始年份
  6. url:项目的URL地址
  7. developers:项目的开发者信息
  8. contributors:项目的贡献者信息
  9. distributionManagement:项目的部署配置
  10. issueManagement:项目的缺陷跟踪系统信息
  11. ciManagement:项目的持续集成系统信息
  12. scm:项目的版本控制系统西溪
  13. malilingLists:项目的邮件列表信息
  14. properties:自定义的Maven属性
  15. dependencies:项目的依赖配置
  16. dependencyManagement:项目的依赖管理配置
  17. repositories:项目的仓库配置
  18. build:包括项目的源码目录配置、输出目录配置、插件配置、插件管理配置等
  19. reporting:包括项目的报告输出目录配置、报告插件配置等
  • 聚合与继承的关系

    • 区别
      1. 聚合模块知道那些被聚合的模块,但被聚合的模块不知道聚合模块的存在;
      2. 对于继承关系的父POM来说,不知道继承的字模块有哪些,但是字模块必须知道自己的父POM是什么。
    • 共同点
      1. 聚合POM与继承关系中的父POM的packaging都是pom;
      2. 聚合模块与继承关系中的父模块除了POM之外都没有实际内容。
  • 依赖管理
    依赖是使用Maven坐标来定位的,而Maven坐标主要由GAV(groupId, artifactId, version)构成。
    在实际项目中,会存在pom文件,这时,如果不进行依赖管理,则会出现同一个依赖模块可能在不同的pom中都会出现,这就造成了重复依赖,在Maven中消除这种重复依赖的正确做法是:
    1.在父模块中使用dependencyManagement配置依赖;
    2.在子模块中使用dependencies添加依赖;
    dependencyManagement实际上不会真正引入任何依赖,dependencies才会。但是,当父模块中配置了某个依赖之后,子模块只需使用简单groupId和artifactId就能自动继承相应的父模块依赖配置。

    • 依赖归类
      依赖归类主要体现在依赖groupId相同的jar包的版本控制,例如依赖了spring相关jar包,spring-context、spring-core,要保证版本号相同,版本号不同,有时会出现兼容性问题。解决方法是在pom.xml中定义:

      <properties>  
        <spring.version>2.5</spring.version>  
      </properties>
      
      <dependencies>  
        <dependency>  
          <groupId>org.spring.framework</groupId>  
          <artifactId>spring-core</artifactId>  
          <version>${spring.version}</version>  
        </dependency> 
        <dependency>  
          <groupId>org.spring.framework</groupId>  
          <artifactId>spring-context</artifactId>  
          <version>${spring.version}</version>  
        </dependency>
      </dependencies>
      
    • 依赖范围

      作用域变量名 编译时有效 测试时有效 运行时有效 示例
      compile smart-framework.jar(默认)
      test -- -- junit.jar
      runtime -- mysql-connector-java.jar
      provided -- servlet-api.jar
      system -- JDK的rt.jar
    • 分类器
      分类器的命名模式为:artifactId-version-classifier.packaging
      例如:

      <dependency>  
        <groupId>org.testng</groupId>  
        <artifactId>testng</artifactId>  
        <version>5.7</version>  
        <classifier>jdk15</classifier>  
      </dependency>
      

    分类器的用途:用来声明对test构件的依赖,比如我们在核心模块中声明了一些基础类,结果发现这个基础类对其他模块的测试类都有用,我们就可以把这个基础类打包成artifactId-version-test.jar,例如:

    <dependency>  
        <groupId>org.myorg.myapp</groupId>  
        <artifactId>core</artifactId>  
        <version>${project.version}</version>  
        <classifier>test</classifier>  
    </dependency>
    

生命周期

Maven强大的一个重要的原因是它有一个十分完善的生命周期模型(lifecycle),这个生命周期可以从两方面来理解:

  1. 顾名思义,运行Maven的每个步骤都由它来定义的,这种预定义的默认行为使得我们使用Maven变得简单,相比而言,Ant的每个步骤都要你手工去定义;
  2. 这个模型是一种标准,在不同的项目中,使用Maven的接口是一样的,这样就不用去仔细理解每个项目的构建了,一般情况下,mvn clean install 这样的命令是通用的。

Maven有三套相互独立的生命周期

生命周期 描述
clean 在进行真正构建之前作一些清理工作
default(or build) 构建的核心部分,编译、测试、打包、部署等等
site 用来生成项目报告、站点、发布站点

注意:你可以仅仅调用clean来清理工作目录,也可以仅仅调用site来生成站点,也可以直接使用mvn clean install site完成这一套生命周期。

clean
当运行mvn clean时,clean生命周期一共包含了三个阶段:

阶段名称 描述
pre-clean 执行一些需要在clean之前完成的工作
clean 移除所有上一次构建生成的文件
post-clean 执行一些需要在clean之后立刻完成的工作

注意:mvn clean 中的clean就是上面的clean,在一个生命周期中,运行某个阶段的时候,它之前的所有阶段都会被运行,也就是说,mvn clean 等同于 mvn pre-clean clean ,如果我们运行 mvn post-clean ,那么 pre-clean,clean 都会被运行。

site

阶段名称 描述
pre-site 执行一些要在生成项目站点文档前完成的工作
site 生成项目的站点文档
post-site 执行一些需要在生成站点文档之后完成的工作,并且为部署做准备
site-deploy 将生成的站点文档部署到特定的服务器上

经常会用到site阶段和site-deploy阶段,用以生成和发布Maven站点,完成文档和统计数据自动生成。

default(or build)

阶段名称 描述
validate 检查工程配置是否正确,完成构建过程的所有必要信息是否能够获取到
initialize 初始化构建状态,例如设置属性
generate-sources 生成编译阶段需要包含的任何源码文件
process-sources 处理源代码,例如过滤任何值
generate-resources 生成工程包中需要包含的资源文件
process-resources 拷贝和处理资源文件到目的目录中,为打包阶段做准备
compile 编译工程源码
process-classes 处理编译生成的文件,例如Java Class 字节码的加强和优化
generate-test-sources 生成编译阶段需要包含的任何测试源代码
process-test-sources 处理测试源代码,例如过滤任何值
test-compile 编译测试源代码到测试目录
process-test-classes 处理测试代码文件编译后生成的文件
test 使用适当的单元测试框架(例如JUnit)运行测试
prepare-package 在真正打包之前,为准备打包执行任何必要的操作
package 获取编译后的代码,并按照可发布的格式进行打包,例如JAR、WAR或者EAR文件
pre-integration-test 在集成测试执行之前,执行所需的操作。例如设置所需的环境变量
integration-test 处理和部署必须的工程包到集成测试能够运行的环境中
post-integration-test 在集成测试被执行后执行必要的操作。例如清理环境
verify 运行检查操作来验证工程包是有效的,并满足质量要求
install 安装工程包到本地仓库中,该仓库可以作为本地其他工程的依赖
deploy 拷贝最终的工程包到远程仓库中,以共享给其他开发人员和工程

注意:运行任何一个阶段,它前面的所有阶段都会被运行,这就是当我们运行mvn install时,代码会被编译、测试、打包的原因;而且,Maven的插件机制是完全依赖Maven的生命周期的。

Maven插件

  • 插件和生命周期
    使用mvn clean install构建Maven项目时:

    生命周期阶段 插件
    clean clean插件
    compile compile插件
    process-test-resources resources插件
    test-compile compiler插件
    test surefire插件
    package war/jar插件
    install install插件
  • 插件配置
    有一个compiler常用的配置,因为compiler插件默认使用的是Java1.4的标准来编译源代码的,如果代码中用到了Java1.5的新特性,这样就会编译报错,所以要进行配置compiler插件支持Java 1.5;

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <configuration>
        <source>1.5</source>
        <target>1.5</target>
    </configuration>
</plugin>

Maven版本管理

  • 定义

    • 版本管理不是指的版本控制,版本指的是artifact的版本,而不是指源码的版本;
    • 版本号我们可以通过修改pom中version之后,在构建一次就能改变,但是这样修改当我们同一个项目中有多个模块,这样改就会很麻烦;所以我们要了解如何自动化发布版本;
  • SNASHOT
    SNAPSHOT是不稳定版本,还在开发中,每天都会提交新的代码,会频繁地发布新的版本;

  • RELEASE
    RELEASE是一段时间内的稳定版本,经过了多个SNAPSHOT版本;

  • Maven版本规则
    规则:<主版本>.<次版本>.<增量版本>;
    主版本一般都是项目发生了大的架构变更;
    此版本一般只是增加了一些功能,或者原有功能的修改;
    增量版本则是修改的一些轻微的bug;

  • 相关插件
    maven-release-plugin,这个插件会帮助我们升级pom版本,提交,打tag,然后再升级版本,再提交,等等,使用方法:

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

推荐阅读更多精彩内容

  • 简介 概述 Maven 是一个项目管理和整合工具 Maven 为开发者提供了一套完整的构建生命周期框架 Maven...
    闽越布衣阅读 4,267评论 6 39
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,580评论 18 139
  • 阅读《Maven实战》许晓斌的一些笔记,便于自己和道友查阅 maven依赖 maven具有传递性依赖,比如 A 依...
    tenlee阅读 524评论 0 0
  • |-1-更新内容[6.从仓库解析依赖的机制(重要)] 1Maven仓库作用 仓库用来存储所有项目使用到构件,在ma...
    zlcook阅读 6,018评论 0 25
  • 生活在这世上的每一天里,有不尽人意的悲欢离合,也有不经意间发生着的小确幸。当遇到挫折、困惑、抑郁和悲痛时,能缓解坏...
    收了纳个Queen阅读 1,028评论 0 1