• 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>
    
  • 相关阅读:
    洛谷P1196银河英雄传说
    NOIP2011普及组第三题瑞士轮(洛谷P1309)
    Dijkstra算法
    10.13做题——洛谷1449后缀表达式
    NOI题库(1.12.T3)甲流病人初筛
    10.12做题——NOI题库(1.13.T30)1的个数
    NOIP考试必备——随机数
    10.10做题——USACO1.2/洛谷1207回文平方数(Dual Palindromes)
    10.9做题——洛谷P1927防护伞
    10.9做题——USACO1.2/洛谷1206回文平方数(Palindromic Squares)
  • 原文地址:https://www.cnblogs.com/snakejia/p/8528420.html
Copyright © 2020-2023  润新知