Maven的核心概念

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

什么是构建工具?

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

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

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


Maven的核心概念_第1张图片
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下载到本地仓库中

你可能感兴趣的:(Maven的核心概念)