学习Maven总结

427 阅读5分钟

Maven是什么?

Apache Maven is a software project management and comprehension tool. Based on the concept of a project object model (POM), Maven can manage a project's build, reporting and documentation from a central piece of information.
是一个软件(特别是Java软件)项目管理及自动构建工具,由Apache软件基金会所提供。基于项目对象模型(缩写:POM)概念,Maven利用一个中央信息片断能管理一个项目的构建、报告和文档等步骤。

简单地说,Maven是一个构建工具,能够帮助我们自动化构建构成,从清理、编译、测试到生成报告,再到打包和部署。使用Maven配置好项目后,输入简单的命令,如:mvn clean install,Maven会帮我们处理那些繁琐的任务。Maven可以帮助我们标准化构建过程.所有的项目都是简单一致的,简化了学习成本。Maven还是一个依赖管理工具和项目信息聚合工具,他还提供了中央仓库,能帮我们自动下载构件。

下载与配置Maven

Maven是一个Java工具,所以你必须安装Java环境。(注意maven的版本和JDK版本发布时间相差太远可能导致maven不能用)

  • 官网下载解压安装
  • path中加入maven安装目录下的bin目录路径
  • 测试安装成功:cmd中执行mvn -v
  • 修改配置文件————打开apache-maven-xxx\conf目录下的settings文件
    1. (可选,默认在C盘的用户目录下)找到

      <settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">
      

      样子的代码,在下面插入本地仓库的地址:

         <localRepository>d:\mvn\repo</localRepository>
      

      里面填自己的仓库的地址

    2. 由于用于maven搜索下载全球的global仓库是在外国搭建的,不稳定,为了加速可以使用国内的镜像仓库,可以使maven加载速度大大提高,在标签之间插入下面代码 (极速之选,不选龟速)修改mirrors,在标签下加入以下配置,启动阿里云的镜像

      <mirror> 
          <id>alimaven</id> 
          <name>aliyun maven</name> 
          <url>http://maven.aliyun.com/nexus/content/groups/public/</url> 
          <mirrorOf>central</mirrorOf>         
      </
      

创建与简单运行

在cmd中如下输入:

      mvn archetype:generate -DarchetypeCatalog=internal -DgroupId=com.chinasofti.build   -DartifactId=demo
      mvn clean compile exec:java -Dexec.mainClass="com.chinasofti.build.App"

生命周期

Maven对构建的过程进行了抽象和定义,这个过程被称为构建的生命周期。

生命周期由多个阶段(phase)组成,每个阶段会挂接一到多个goal。goal是Maven里定义任务的最小单位。

Maven坐标

Maven定义了这样一组规制:世界上任何一个构件都可以使用Maven坐标唯一标识,Maven坐标的元素包括groupId、artifactId、version、packaging、classifier。现在,我们只要提供正确的坐标元素,Maven就能找到对应的构件。

坐标详情

  • groupId:定义当前Maven项目隶属的实际项目。
  • artifactId:该元素定义实际项目中的一个Maven项目(模块)。
  • version:该元素定义Maven项目当前所处的版本。
  • packaging:该元素定义Maven项目的打包方式。
  • classifier:该元素用来帮助定义构件输出的一些附属构件。

依赖

  1. 依赖:引用第三方的jar包或库
  2. 依赖的配置
       <project>      
       <dependencies> 
        <dependency>
           <groupId>junit</groupId>
           <artifactId>junit</artifactId>      
           <version>3.8.1</version>
           <type>...</type>
           <scope>test</scope>
           <optional>...</optional>
           <exclusions>      
              <exclusion>      
                <groupId>...</groupId>      
                <artifactId>...</artifactId>      
              </exclusion> 
           </exclusions>      
       </dependency>         
       </dependencies>      
       </project>
    

根元素下project下的dependencies可以包含一个或者多个dependency元素,以声明一个或者多个项目依赖。每个依赖可以包含的元素有:

  • groupId,artifactId和version:依赖的基本坐标,对于任何一个依赖来说,基本坐标是最重要的,Maven根据坐标才能找到需要的依赖。
  • type:依赖的类型,对应于项目坐标定义的packaging。大部分情况下,该元素不必声明,其默认值是jar。
  • scope:依赖的范围,后面会进行详解。
  • optional:标记依赖是否可选。
  • exclusions:用来排除传递性依赖
  1. 依赖范围
  • compile:编译依赖范围。使用此依赖范围的Maven依赖,对于编译、测试、运行的classpath都有效,依赖在所有阶段都可以获得,这是默认值。

  • provided:已提供依赖范围。 提供的依赖范围用来编译应用程序,但无需部署。若你用到jdk或者应用服务器提供的JAR,则使用此范围,servlet APIs就属于这个依赖范围。测试时,此依赖范围也加入到classpath。但在生成包时,由于容器已经存在该jar包,再打包可能会有冲突,所以生成包时不会加入,运行时自然也没效果。

  • runtime:运行依赖范围。在编译阶段是不需要的,对于测试和运行classpath有效,比如JDBC驱动程序。

  • test:测试范围依赖使用此依赖范围的Maven依赖,只对于测试classpath有效比如:Junit。

  • system 该依赖范围与provided所表示的依赖范围一致,对于编译和测试有效,但在运行时无效。只是使用system范围依赖时必须通过systemPath元素显式地指定依赖文件的路径。由于此类依赖不是通过Maven仓库解析的,而且往往与本机系统绑定,可能造成构建的不可移植,因此应该谨慎使用。

    依赖范围 编译 测试 打包 运行
    compile Y Y Y Y
    provided Y Y N N
    runtime N Y Y Y
    test N Y N N
    system Y Y N N
  1. 依赖传递
  • 假如有Maven项目A,项目B依赖A,项目C依赖B。那么我们可以说 C依赖A。也就是说,依赖的关系为:C—>B—>A。那么我们执行项目C时,会自动把B、A都下载导入到C项目的jar包文件夹中。这就是依赖的传递性。
  • A->B->C
    简单传递依赖:A->C
  • A->B-C(0.1)
    A->C(0.2)
    最短路径优先原则: A->C(0.2)
  • A->B->C(0.1)
    A->E->C(0.2)
    第一声明优先原则:最终依赖C(0.1)