Maven的核心概念

Maven是一个强大的Java项目构建工具

什么是构建工具?

构建工具是将软件项目构建相关的过程自动化的工具。构建一个软件项目通常包含以下一个或多个过程:

  • 生成源码(如果项目使用自动生成源码)
  • 从源码生成项目文档
  • 编译源码
  • 将编译后的代码打包成JAR或ZIP文件
  • 将打包好的代码安装到服务器、仓库或者其它的地方
Maven概览-核心概念

Maven的中心思想是POM文件(项目对象模型)。POM文件是以XML文件的形式表述项目的资源,如源码、测试代码、依赖(用到的外部Jar包)等。POM文件应该位于项目的根目录下。


pom.xml执行流程
POM文件

当你执行一条Maven命令的时候,你会传入一个pom文件。Maven会在该pom文件描述的资源上执行该命令

构建生命周期、阶段和目标

Maven的构建过程被分解为构建生命周期、阶段和目标。一个构建周期由一系列的构建阶段组成,每一个构建阶段由一系列的构建目标组成。如果执行一个生命周期,该生命周期内的所有构建阶段都会被执行。如果执行一个构建阶段,在预定义的构建阶段中,所有处于当前构建阶段之前的阶段也都会被执行。

依赖和仓库

Maven执行时,其中一个首要目标就是检查项目的依赖。依赖是你项目用到的jar文件(java库)。如果在本地仓库中不存在该依赖,则Maven会从中央仓库下载并放到本地仓库。本地仓库只是你电脑硬盘上的一个目录。你可以根据需要制定本地仓库的位置,你也可以指定下载依赖的远程仓库的地址。

插件

构建插件可以向构建阶段中增加额外的构建目标。如果Maven标准的构建阶段和目标无法满足项目构建的要求,你可以在POM文件里增加插件。Maven有一些标准的插件供选用,如果需要你可以自己实现插件。

配置文件

配置文件用于以不同的方式构建项目。比如,你可能需要在本地环境构建,用于开发和测试,你也可能需要构建后用于开发环境。这两个构建过程是不同的。在POM文件中增加不同的构建配置,可以启动不同的构建过程。当运行Maven时,可以指定要使用的配置。

Ant与Maven

Ant是Apache另一个流行的构建工具。
相比而言,Ant构建文件描述的是如何构建项目。在Maven里,如何构建是在Maven构建声明周期、阶段和目标中预定义的。

Maven POM文件

Maven的POm文件是一个xml文件,描述项目用到的资源,包括源代码目录、测试代码目录等的位置,以及项目依赖的外部jar包。
POM文件描述的是构建什么,而不是如何构建。如何构建是取决于Maven的构建阶段和目标。
每一个项目都有一个POM文件。POM文件即pom.xml,应该放在项目的根目录下。一个项目如果分为多个子项目,一般来讲,父项目有一个POM文件,每一个子项目都有一个POM文件。在这种结构下,既可以一步构建整个项目,也可以各个子项目分开构建。

父pom

所有的Maven pom文件都继承自一个父pom。如果没有指定父pom,则该pom文件继承自根pom。可以让一个pom文件显式地继承另一个pom文件。这样,可以通过修改公共父pom文件的设置来修改所有子pom文件的设置,在pom文件的起始处指定父pom。子pom文件的设置可以覆盖父pom文件的设置,只需要在子pom文件里指定新的设置即可。

有效pom

考虑到pom文件的继承关系,当Maven执行的时候可能很难确定最终的pom文件的内容。总的pom文件(所有继承关系生效后)被称为有效pom(effective pom)。

Maven配置文件

Maven有两个配置文件。配置文件里的设置,对所有的pom文件都是有效的。
配置文件名为settings.xml,两个配置文件分别为:

  • +Maven安装目录中:$M2_HOME/conf/settings.xml
  • +用户主目录中:${user.home}/.m2/settings.xml
    两个配置文件都是可选的。如果两个文件都存在,则用户目录下的配置会覆盖Maven安装目录中的配置
让Maven跑起来

当你安装好了Maven,并且在项目的根目录下创建了POM文件,可以在项目上运行Maven了
运行Maven只需在命令行执行mvn命令即可。当执行mvn命令时,将构建周期、阶段或目标作为参数传进去,Maven就会执行他们

Maven目录结构

Maven有一个标准的目录结构。如果你在项目中遵循Maven的目录结构,就无需在pom文件中指定源代码、测试代码等目录
以下为最重要的目录:

- src
   - main 
      - java
      - resources
      - webapp
  - test
      - java 
      - resources
- target

src目录是源代码和测试代码的目录。main目录是应用的源代码目录。test目录是测试代码的目录。main和test下的java目录,分别表示应用的java源代码和测试代码
resources目录包含项目的资源文件
如果是一个web项目,则webapp目录为web项目的根目录,其中包含如WEB-INF等子目录
target目录是由Maven创建的,其中包含编译后的文件、jar文件等。当执行Maven的clean目标后,target目录会被清空

外部依赖

Maven的外部依赖指的是不在Maven的仓库(包括本地仓库、中央仓库和远程仓库)中的依赖的(jar包)。这里的“外部”是对Maven仓库系统而言的,不仅仅是对项目而言。大部分的外部依赖都是针对项目的,很少的外部依赖是针对仓库系统的(即不在仓库中)

快照依赖

快照依赖指的是那些还在开发中的依赖(jar包)。快照版本的每一个build版本都会被下载到本地仓库,即使该快照版本已经在本地仓库了。
在pom文件的最开头(设置groupId和artifactId的地方),在版本号后追加-SNAPSHOT。则告诉Maven你的项目是一个快照版本

Maven仓库

Maven仓库就是存储jar包和一些元数据信息的目录。其中的元数据即pom文件,描述了该jar包属于那个项目,以及jar包所需的外部依赖。该元数据信息使得Maven可以递归地下载所有的依赖,直到整个依赖树都下载完毕并放到你的本地仓库中。
Maven有三种类型的仓库:

  • 本地仓库
  • 中央仓库
  • 远程仓库
    Maven根据以上的顺序去仓库中搜索依赖。首先是本地仓库,然后是中央仓库,最后,如果pom文件中配置了远程仓库,则会去远程仓库中查找
本地仓库

本地仓库就是开发者电脑上的一个目录, 该仓库包含了Maven下载的所有依赖。一般来讲,一个本地仓库为多个不同的项目服务。因此,Maven只需下载一次,即使有多个项目都依赖它。
通过mvn install命令可以将你自己的项目构建并安装到本地仓库中。这样,你的其它项目就可以通过在pom文件将该jar包作为外部依赖来使用
Maven的本地仓库默认在你的本机的用户目录下

中央仓库

Maven的中央仓库由Maven社区提供。默认情况下,所有不在本地仓库中的依赖都会去这个中央仓库查找,然后Maven会将这些依赖下载到你的本地仓库,访问中央仓库不需要做额外的配置

远程仓库

远程仓库是位于web服务器上的一个仓库,Maven可以从该仓库下载依赖,就像从中央仓库下载依赖一样。
远程仓库一般用于放置组织内部的项目,该项目由多个项目共享。
远程仓库中的依赖也会被Maven下载到本地仓库中

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

推荐阅读更多精彩内容

  • 一、Maven坐标和仓库   Maven坐标是一个唯一的标识,用于表示我们的项目的一些信息或者引用jar包的位置。...
    嗷老板阅读 804评论 0 5
  • 简介 概述 Maven 是一个项目管理和整合工具 Maven 为开发者提供了一套完整的构建生命周期框架 Maven...
    闽越布衣阅读 4,282评论 6 39
  • Spring Boot 参考指南 介绍 转载自:https://www.gitbook.com/book/qbgb...
    毛宇鹏阅读 46,799评论 6 342
  • 参考资料: http://ifeve.com/maven-1/ http://ifeve.com/maven-2/...
    这个该叫什么呢阅读 528评论 0 1
  • 那年十月,我和文朋诗友们到武隆采风,有幸到仙女山一游。 到达仙女山的时候,还是清晨,小雨淅沥,为仙女山披上了一层薄...
    李易芸阅读 398评论 1 5