一、maven简介

1.1 maven的概念和作用

(1)什么是maven

  • maven的本质是一个项目管理工具,将项目开发和管理过程抽象成一个项目对象模型(POM)
  • POM(project object model):项目对象模型;
  • 仓库:用于存储资源,包含各种jar包
  • 仓库分类:
    • 本地仓库:自己电脑上的存储资源的仓库,连接远程仓库获取资源
    • 远程仓库:非本机电脑上的仓库,为本地仓库提供资源
      • 中央仓库:maven团队维护,存储所有资源的仓库
      • 私服:部门/公司范围内存储资源的仓库,从中央仓库获取资源
    • 私服的作用:
      • 保存具有版权的资源,包含购买或自主研发的jar(中央仓库中的jar都是开源的)
      • 一定范围内共享资源,仅对内部开放,不对外共享。

(2)maven的作用

  • 项目构建:提供标准的、跨平台的自动化项目构建方式
  • 依赖管理:方便快捷的管理项目依赖的资源(jar包),避免资源间的版本冲突问题
  • 统一开发结构:提供标准的、统一的项目结构

1.2 maven的下载与安装

(1)maven的下载

(2)maven的安装与环境变量的配置

  • maven属于绿色软件,解压即安装
  • 依赖Java,需要配置java home的环境变量(已配置)
  • 设置maven自身的环境,需要配置MAVEN_HOME
  • 测试环境配置结果

1.3 本地仓库与远程仓库的配置

(1)本地仓库的配置

  • 在maven解压后的文件夹下有个conf文件夹,里面有个setting.xml文件,默认指定保存下载的资源到本地仓库是如下标签

    1. <localRepository>${user.home}/.m2/repository</localRepository>
  • 因此要自定义位置,如下代码

    1. <localRepository>自定义位置</localRepository>

(2)远程仓库的配置

  • maven默认连接的远程仓库位置,是在setting.xml文件下的如下代码

    1. <repositories>
    2. <repository>
    3. <id>唯一 标识符</id>
    4. </repository>
    5. </repositories>
  • 因为直接连接中央仓库,下载的速度很慢,所以要配置aliyun镜像(要把原来的注释掉),如下:

    1. <mirror>
    2. <id>nexus-aliyun</id>
    3. <mirrorOf>central</mirrorOf>
    4. <name>Nexus aliyun</name>
    5. <url>http://maven.aliyun.com/nexus/content/groups/public</url>
    6. </mirror>

1.3 依赖管理

(1)依赖配置和依赖传递

  • 依赖配置

    • 依赖值当前项目运行所需的jar,一个项目可以设置多个依赖
    • 格式如下:
      1. <!--设置当前项目所依赖的所有jar包-->
      2. <dependencies>
      3. <!--设置具体的依赖-->
      4. <dependency>
      5. <!---依赖所属的群组(一般为公司域名倒写)-->
      6. <groupId>junit</groupId>
      7. <!---依赖所属项目id-->
      8. <artifactId>junit</artifactId>
      9. <!--依赖版本号-->
      10. <version></version>
      11. </dependency>
      12. </dependencies>
  • 依赖传递

    • 直接依赖:在当前项目中通过依赖配置建立的依赖关系
    • 间接依赖:被依赖资源的资源如果依赖其他资源,当前项目间接依赖其他的资源
  • 依赖传递冲突问题
    • 路径优先:当依赖中出现相同的资源时,层级越深,优先级越低,层级越浅,优先级越高;
    • 声明优先:当依赖在相同层级时,配置顺序靠前的覆盖配置顺序靠后的。
    • 特殊优先:当同级配置了相同的依赖是不同的版本时,后配置的覆盖先配置的。

(2)依赖的控制

  • 可选依赖

    • 可选依赖指对外隐藏当前依赖——不透明;
      1. <dependency>
      2. <groupId>junit</groupId>
      3. <artifactId>junit</artifactId>
      4. <version></version>
      5. <optional>true</optional>
      6. </dependency>
  • 排除依赖

    • 排除依赖指主动断开依赖,被排除的资源无需指定版本——就是不需要指定的依赖资源
      1. <dependency>
      2. <groupId>junit</groupId>
      3. <artifactId>junit</artifactId>
      4. <version>4.12</version>
      5. <exclusions>
      6. <exclusion>
      7. <groupId>org.hamcrest</groupId>
      8. <artifactId>hamcrest-core</artifactId>
      9. </exclusion>
      10. </exclusions>
      11. </dependency>
  • 依赖范围

    • 依赖的jar默认情况下可以在任何地方使用,可以通过scope标签设定作用范围
    • 作用范围:
      • 主要程序范围有效(main文件夹下)
      • 测试程序范围有效(test文件夹下)
      • 是否参与打包(package指令范围内) | scope | 主代码 | 测试代码 | 打包 | 范例 | | —- | —- | —- | —- | —- | | compile(默认) | Y | Y | Y | log4j | | test |
        | Y |
        | junit | | provided | Y | Y |
        | servlet-api | | runtime |
        |
        | Y | jdbc |
  • 依赖范围的传递性

    • 带有依赖范围的资源在进行传递时,作用范围将受到影响 |
      | compile | test | provided | runtime | | —- | —- | —- | —- | —- | | compile | compile | test | provided | runtime | | test |
      |
      |
      |
      | | provided |
      |
      |
      |
      | | runtime | runtime | test | provided | runtime |

    • 注:红色字体为直接依赖,黑色字体为间接依赖