zoukankan      html  css  js  c++  java
  • 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>
    
  • 相关阅读:
    洛谷 1850 NOIP2016提高组 换教室
    2018牛客多校第三场 C.Shuffle Cards
    2018牛客多校第一场 B.Symmetric Matrix
    2018牛客多校第一场 A.Monotonic Matrix
    2018牛客多校第一场 D.Two Graphs
    2018宁夏邀请赛L Continuous Intervals
    2018宁夏邀请赛K Vertex Covers
    BZOJ
    HDU
    ACM International Collegiate Programming Contest, Egyptian Collegiate Programming Contest (ECPC 2015)
  • 原文地址:https://www.cnblogs.com/snakejia/p/8528420.html
Copyright © 2011-2022 走看看