Maven 简介

1.Maven简介

1.Maven能干什么

    1:依赖管理:通过一个xml文件,同一管理项目中所以jar包。开发项目时,需要用到的jar包只需在配置文件中配置好几个相关信息,Maven就会自动下载、导入到项目中,并且如果该jar包有依赖包,也会自动一并下载、导入。如果项目有jar包依赖冲突,只需通过Maven的 mvn -X compile dependency:tree -Dverbose 指令即可自动排查出冲突的jar包信息。
    
    2:项目构建:这一步类似Ant,可以通过Maven的配置脚本批处理项目的编译、测试、打包、部署、发布等操作;
    
    3:信息管理:管理项目的相关信息,比如版本信息、开发者信息等。

2.Maven依赖管理简介

    1:在pom.xml中进行同一配置,管理;

    2:对每个jar包,通过:groupId、artifactId、version 三个信息唯一确定一个jar包;

    3:jar包的来源:在配置好jar包信息后,Maven是如何高效率地找到所需jar包并下载导入的?主要有三个来源。

        1)本地资源库:Maven安装后会在本机创建一个reposity文件夹,执行pom.xml时会把jar包下载到这里来,如果已经有的,就不会再下载。相当于一个本地缓存。

        2)共享资源库:即中央资源库,Maven有一个中央仓库存放来自全世界的共享jar包,通过配置的 groupId、artifactId、version 即可在中央仓库中唯一定位jar包,然后下载到本地资源库中。

        3)私人资源库:也叫中转资源库。对于一个公司而言,有可以有自己开发的jar包,并且不想公开出去;还有,公司可以提供一个jar包中转站,把网上常用的jar包先下载到一个仓库中,公司程序员在本地资源库找不到所需jar包时可以先到公司的资源库寻找、下载,这样就无需到网上下载了。这个资源库就是私人资源库。

    4:jar包的寻找过程:执行pom.xml—>本地资源库寻找—>私人资源库寻找—>中央资源库寻找

    5:Maven资源库配置:进入maven安装目录/conf/ ,编辑 settting.xml:

    本地仓库:<localRepository>:表示本地库的保存位置,也就是maven2主要的jar保存位置,默认在${user.dir}/.m2/repository,如果需要另外设置,就换成其他的路径。

    共享仓库:Mirrors 表示镜像库,指定库的镜像,用于增加其他库(私库、远程库)

3.配置仓库

配置本地仓库路径

找到settings.xml 49行左右,有注释版的本地仓库配置示范,我们删除注释括号,修改内容进行配置。

  <localRepository>/path/to/local/repo</localRepository>
配置镜像仓库

找到146行左右,有注释版的镜像仓库配置示范,我们删除注释括号,修改内容进行配置。

 <mirrors>
    <mirror>
      <id>mirrorId</id>
      <mirrorOf>是谁的镜像,如果是中央仓库的镜像就写central,如果是一切仓库的镜像就写*</mirrorOf>
      <name>镜像仓库名</name>
      <url>镜像仓库url</url>
    </mirror>
  </mirrors>

2.项目构建过程

项目构建过程包括【清理项目】→【编译项目】→【测试项目】→【生成测试报告】→【打包项目】→【部署项目】这几个步骤,这六个步骤就是一个项目的完整构建过程。

3.Maven的生命周期

1.Maven三套生命周期

Maven有三套相互独立的生命周期,分别是clean、default和site。每个生命周期包含一些阶段(phase),阶段是有顺序的,后面的阶段依赖于前面的阶段。

1、clean生命周期:清理项目,包含三个phase。

1)pre-clean:执行清理前需要完成的工作

2)clean:清理上一次构建生成的文件

3)post-clean:执行清理后需要完成的工作

2、default生命周期:构建项目,重要的phase如下。

1)validate:验证工程是否正确,所有需要的资源是否可用。
2)compile:编译项目的源代码。  
3)test:使用合适的单元测试框架来测试已编译的源代码。这些测试不需要已打包和布署。
4)Package:把已编译的代码打包成可发布的格式,比如jar。
5)integration-test:如有需要,将包处理和发布到一个能够进行集成测试的环境。
6)verify:运行所有检查,验证包是否有效且达到质量标准。
7)install:把包安装到maven本地仓库,可以被其他工程作为依赖来使用。
8)Deploy:在集成或者发布环境下执行,将最终版本的包拷贝到远程的repository,使得其他的开发者或者工程可以共享。

3、site生命周期:建立和发布项目站点,phase如下

1)pre-site:生成项目站点之前需要完成的工作

2)site:生成项目站点文档

3)post-site:生成项目站点之后需要完成的工作

4)site-deploy:将项目站点发布到服务器

2.lifecycle phase goal 概念介绍

1.lifecycle:生命周期

lifecycle:生命周期,这是maven最高级别的的控制单元,它是一系列的phase组成,也就是说,一个生命周期,就是一个大任务的总称,不管它里面分成多少个子任务,反正就是运行一个lifecycle,就是交待了一个任务,运行完后,就得到了一个结果,中间的过程,是phase完成的,自己可以定义自己的lifecycle,包含自己想要的phase
常见的lifecycle有 | clean | package ear | pageage jar | package war | site等等

2.phase

可以理解为任务单元,lifecycle是总任务,phase就是总任务分出来的一个个子任务,但是这些子任务是被规格化的,它可以同时被多个lifecycle所包含,一个lifecycle可以包含任意个phase,phase的执行是按顺序的,一个phase可以绑定很多个goal,至少为一个,没有goal的phase是没有意义的

3.goal

这是执行任务的最小单元,它可以绑定到任意个phase中,一个phase有一个或多个goal,goal也是按顺序执行的,一个phase被执行时,绑定到phase里的goal会按绑定的时间被顺序执行,不管phase己经绑定了多少个goal,你自己定义的goal都可以继续绑到phase中

4.mojo

lifecycle与phase与goal都是概念上的东西,mojo才是做具体事情的,可以简单理解mojo为goal的实现类,它继承于AbstractMojo,有一个execute方法,goal等的定义都是通过在mojo里定义一些注释的anotation来实现的,maven会在打包时,自动根据这些anotation生成一些xml文件,放在plugin的jar包里

3.命令行和生命周期

各个生命周期相互独立,一个生命周期的阶段前后依赖。
举例如下:

1、mvn clean

调用clean生命周期的clean阶段,实际执行pre-clean和clean阶段

2、mvn test

调用default生命周期的test阶段,实际执行test以及之前所有阶段

3、mvn clean install

调用clean生命周期的clean阶段和default的install阶段,实际执行pre-clean和clean,install以及之前所有阶段

4.生命周期插件

Maven的不同生命周期中的操作,是通过插件来完成的。我们可以在pom.xml通过 ...标签指定当前命令下运行哪个插件来工作。

具体的插件在Maven官网可以找到:http://maven.apache.org/plugins/index.html

在pom.xml中使用插件的格式:

<build>
  <plugins>
     <plugin>
        <!--通过坐标指定插件-->
        <groupId>        </groupId>
        <artifactId>      </artifactId>
        <version>        </version>

        <!--配置插件的使用阶段——在哪个生命周期被执行,执行的目标是什么-->
         <executions>
             <execution>
                 <phase>执行的生命周期</phase>
                 <goals>
                   <goal>插件的运行结果,Maven官网中该插件的说明找<goal>
                 </goals>
             </execution>
         </executions>
     </plugin>
  </plugins>
</build>

4.Maven元素解析——pom.xml

一个pom.xml中包含了许多标签,各个标签是对项目生命周期、依赖管理的配置。常用的主要有:

1:peoject:pom.xml的根标签,一个maven项目用一对标签包裹。

2:modelVersion:maven的版本

3:当前项目的坐标以及打包方式:

<groupId>:企业网址反写+项目名

<artifactId>:项目名-模块名

<version>:版本号+类型

版本号由三个整数表示,每个整数用“.”分隔,表示:大版本号.分支版本号.小版本号

类型:版本类型。主要有:snapshot快照版本(简化版本)、alpha内测版、beta公测版、release稳定版、GA正式发布版

<packaging>:打包类型,默认是jar,可以配置成war、zip、pom类型。

4:name:当前项目名

5:url:项目地址

6:description:项目描述信息

7:developers:开发者信息

8:licenses:项目许可证信息,用来发布时授予别人使用此项目的权利

9:organization:组织信息,企业信息

以上都是对这个maven项目的相关信息配置。

10:properties:属性值标签,也叫变量标签。与Ant中的property一样,可以通过这个标签包含一些属性并指定属性值。那么在pom.xml的其他地方,可以通过EL表达式访问变量的方法——${属性名} 来获取具体的属性值。一般这个用来作为整个pom.xml中需要重复使用的内容或者全局变量使用。

11:依赖标签

<dependencies>

    <!--一个依赖包-->
    <dependency>

       <!--通过坐标指定依赖包-->
        <groupId>        </groupId>
        <artifactId>      </artifactId>
        <version>        </version>

        <!--可选项:依赖范围。有六个可选值:常用compile/provided/test/runtime等-->
        <scope>一个范围</scope>
        <!--可选项:排除依赖传递:即:当前项目依赖当前配置的依赖包A时,如果这个依赖包又依赖其他包B,这里可以选择排除依赖的传递性,不下载导入B-->
         <exclusions>
            <exclusion>
              <!--被排除的依赖包坐标-->
              <groupId> </groupId>
              <artifactId> </artifactId>
              <version> </version>
            </exclusion>
         </exclusions>
    </dependency>
</dependencies>

12:依赖管理标签:主要用于制定父pom.xml,其他项目可以继承这个pom.xml,从而避免重复定义某些depency。

<depencyManagement>
    <depencies>
       <depency>
           依赖包的坐标...
       </depency>
    </depencies>
</depencyManagement>

13:build:项目支持标签,一般用来引入插件

<build>
    <plugins>
      <plugin>
         <!--插件坐标-->
         <groupId>         </groupId>
         <artifactId>         </artifactId>
         <version>         </version>

         其他设置...

      </plugin>
    </plugins>
</build>

14:parent:继承标签,用于继承父项目。

15:moudules:聚合标签,用于聚合多个maven项目,这样用某指令执行这个pom就会把聚合的各项目全部执行,同时处理多个项目。

示例:一个简单的构建JavaWeb项目的pom.xml如下:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.test</groupId>
  <artifactId>WebApp</artifactId>
  <packaging>war</packaging>
  <version>1.0</version>
  
  <name>WebApp Maven Webapp</name>
  <url>http://maven.apache.org</url>
  
  <dependencies>    
    <dependency>
      <groupId>commons-fileupload</groupId>
      <artifactId>commons-fileupload</artifactId>
      <version>1.2.1</version>
    </dependency>
    
    <!--commons-io为commons-fileupload的可选依赖包-->
    <dependency>
      <groupId>commons-io</groupId>
      <artifactId>commons-io</artifactId>
      <version>1.3.2</version>
    </dependency>
  </dependencies>
  
  <build>
    <finalName>WebApp</finalName>
  </build>
</project>
posted @ 2018-03-08 14:48  snakejia  阅读(271)  评论(0编辑  收藏  举报