Apache Maven 基础

Apache Maven

01核心概念

maven 概念

  • Maven 是一个项目管理工具,可以对 Java 项目进行构建、依赖管理

  • 解决的问题:

      1. 项目的 jar 来源
      1. 项目的依赖如何管理
      1. 项目构建

名词解释

  • Project

    • 可被 Maven 识别的项目结构,是项目运行的工作空间, Maven Project 构建之后会生产 Java SE 或 Java EE 项目的目录结构(Java Project)
  • POM

    • POM (Project Object Model),项目对象模型.. 是 Maven 工程的基本单位,是一个 XML 格式的文件,包含了项目的基本信息,主要是用于描述项目如何构建,声明项目依赖,等等
  • 仓库

    • 本地仓库

      • 存放资源(jar)的本地目录,Maven 项目请求拉取资源的时候,优先查找本地仓库,如果找不到对应的资源,回从远程库中拉倒本地库,项目在从本地库拉取资源
    • 远程仓库

    • 中央仓库

      • 由 Maven 社区提供的仓库,其中包含了大量常用的库.所有主流的资源到哪
    • 私有仓库

      • 开发人员自己定制仓库,包含了所需要的代码库或者其他工程中用到的 jar 文件
  • 坐标

    • groupId

      • 公司或者组织的唯一标志
    • artifactId

      • 项目的唯一id
    • version

      • 项目的版号

02生命周期

clean

  • 清理项目编译空间

validate

  • 验证项目是否正确且所有信息必须都是可用的

compile

  • 执行编译, 源代码编译, Maven Project -> JavaProject

test

  • 运行项目中的测试(单元测试)

package

  • 打包成可用分发格式文件,如 JAR\WAR. Java Project -> Jar / WAR 包

verify

  • 验证打包好的程序

install

  • 安装本项目到本地仓库

deploy

  • 将打包好的 Jar/War 包推送到远程仓库

03项目类型

jar

  • Java SE 项目工程

war

  • Java EE 工程项目

pom

  • POM 项目工程是逻辑工程,主要用于父级工程中.(继承\聚合)的父工程

04项目关系

聚合关系

  • 可以帮助我们把项目的多个模块聚合起来,一次性可构建多个模块
  • 解决了多模块构建效率低,能快速构建多个子项目
  • 可以通过父项目中
    <modules>子项目</modules>
    判断子项目是否被聚合了

继承关系

  • 可以将各个模块相同的依赖和配置提取出来,能简化子项目POM,并且也可以促进模块化配置的一致性(如版本号)
  • Maven 项目中的继承是 POM 资源之间的继承,不是项目之间的继承
  • 在子项目中的 pom.xml 中增加
    <parent> 父坐标 </parent>

依赖关系

  • 项目A 使用项目 B 的资源,我们将 B 包导入到 A 项目中, 即 A 依赖于 B
  • 在 IDEA 中 A B 项目放在通过工作空间中,开发中可以直接引用,但是启动的时候,必须将 B 项目安装到本地仓库,A才能引用

05常用配置

配置本地仓库

<localRepository>
    本地仓库目录
</localRepository>

配置阿里镜像仓库

  • 详情

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

06命令使用

mvn + 生命周期

跳过测试

  • -DskipTests:不执行测试用例,但会编译生成测试的class
  • -Dmaven.test.skip=true:不执行也不编译测试内容

加快构建速度

  • -Dmaven.compile.fork=true 启用多线程编译
  • -T 8C :表示 8 个核编译

指定项目构建

  • --projects 或者 -pl :构建指定的项目,多个项目以逗号隔开

构建项目所依赖的项目也要常用构建

  • --also-make 或者 -am

例子

  • mvn clean install -DskipTests -Dmaven.compile.fork=true -T 3C -pl project 1,project2,project3 -am

07依赖管理

依赖范围(scope)

  • Maven 在编译、测试、运行阶段所需的依赖不完成一致,所以 Maven 通过三种不同的 classpath 实现在不同阶段引入所需的依赖:编译 classpath、测试classpath、运行classpath

  • 范围

    • compile

      • 编译、测试、运行
    • test

      • 如Junit

        • 测试
    • provided

      • 编译、测试
    • runtime

      • 测试、运行
    • system

      • 编译、测试;通过手动指定依赖<systemPath></systemPath>
    • import

      • 不会影响

传递性依赖

  • 项目 A 依赖项目 B ,而项目B 依赖项目 C,那么项目 A 依赖项目 C

依赖调节

  • 项目 A 依赖项目 B 和项目 C,而项目B 和项目 C 依赖于项目 D,那项目 A 是通过 A -> B -> D 是通过 A -> C -> D 依赖 项目 D的?需要引入依赖调节解决该问题

  • 依赖调节原则

    • 原则1:路径最短者优先
    • 原则2:第一声明者优先

可选依赖(option )

  • 当 dependency 下的 option 配置为 true ,表示依赖是可选的,不会因为传递性依赖导致依赖被引入

排除依赖(exclusions)

  • 因传递性依赖会引入第三方的依赖,第三方依赖可能存在安全问题,或者发生了依赖冲突,这时候就需要排除依赖

08高级用法

dependencyManagement

  • Maven 中 dependencyManagement 元素提供了版本管理,只要在父模块中声明依赖的版本号,那么子模块再次引入依赖的时候就不需要显式的列出版本号,这样在父模块就能管理整个项目的依赖版本。
    注意:被 dependencyManagement 包起来的依赖不会被主动引入,需要在子模块中再次引入

在 src 下的非java文件不会编译到 classpath 中

  • 配置不过滤文件

    <resources>
         <resource>
           <directory>src/main/java</directory>
           <includes>
             <include>**/*.xml</include>
           </includes>
           <filtering>true</filtering>
         </resource>
         <resource>
           <directory>src/main/resources</directory>
           <filtering>true</filtering>
         </resource>
    </resources> 
    

Maven BOM

  • Maven提供的功能,它通过定义一整套相互兼容的jar包版本集合,使用时只需要依赖该BOM文件,即可放心的使用需要的依赖jar包,且无需再指定版本号。
    BOM 的本质是 pom 文件,文件中定义了一组可以相互兼容的依赖,并且通过 dependencyManagement 包装起来
  • 覆盖 BOM 只要在子项目中 dependency 中添加 version 即可

思维导图

posted @ 2021-05-12 23:11  gingogo  阅读(148)  评论(0)    收藏  举报