Maven

Maven简介

Maven是一个异常强大的构建工具,能够帮我们自动化构建过程,从清理、编译、测试到生成报告,再到打包和部署。

Maven将项目构建的过程进行标准化,每一个阶段使用一个命令完成:

清理 –>编译 –> 测试 –> 报告 –> 打包 –> 部署

Maven 依赖管理

一个Java项目可能需要使用第三方的jar包才可以运行,那么我们就说这个Java项目依赖了这些第三方jar包。传统的项目工程要管理所依赖的jar包完全靠人工运行,需要手动将jar包添加到项目工程中,导致工作量繁重,工程体积过大。

Maven项目管理所依赖的jar包不需要手动向工程中添加jar包,只需要在pom.xml添加jar包的坐标,自动从Maven仓库下载jar包、运行。

Maven 标准目录结构

  |-src
  |   |-main
  |   |  |-java         —— 存放项目的.java文件
  |   |  |-resources    —— 存放项目资源文件,如spring, hibernate配置文件
         |-webapp       —— webapp目录是web工程的主目录
            |-WEB-INF
              |-web.xml
  |   |-test
  |      |-java         —— 存放所有测试.java文件,如JUnit测试类
  |      |-resources    —— 测试资源文件
  |-target              —— 目标文件输出位置例如.class、.jar、.war文件
  |-pom.xml             —— maven项目核心配置文件

Maven仓库

  • 本地仓库:用来存储从远程仓库或者中央仓库下载的插件和jar包,项目使用的一些插件或者jar包,优先从本地仓库查找
  • 远程仓库:如果本地仓库需要插件或者jar包,本地仓库没有,默认去远程仓库下载,远程仓库可以在互联网内也可以在局域网内
  • 中央仓库:在maven软件中内置的一个远程仓库的地址,它是中央仓库,里面存储了非常全的jar包,包含了世界上大部分流行的开源项目构件

Maven 命令

  • complie:Maven工程的编译命令,将src/main/java下的文件编译为class文件输出到target目录下
  • test:Maven工程的测试命令,会执行src/test/java下的单元测试类
  • clean:Maven工程的清理命令,执行会删除target目录下的内容
  • package:Maven工程的打包命令,对于Java工程执行package会打成jar包,Web工程会打成war
  • install:Maven工程的安装命令,执行会把Maven打成jarwar包发布到本地仓库

Maven生命周期

Maven拥有三套相互独立的生命周期,它们分别是clean default site

  • clean 生命周期的目的是清理项目
    • pre-clean:执行一些需要在clean之前完成的工作
    • clean:清理所有上一次构建生成的文件
    • post-clean:执行一些清理后需要完成的工作
  • default生命周期定义了真正构建时所需要的执行的所有步骤,是所有生命周期中最核心的部分
    • validate
    • initialize
    • generate-sources
    • process-sources 处理项目主资源文件
    • generate-resources
    • process-resources
    • compile:编译项目的主源码
    • process-classes
    • generate-test-sources
    • process-test-sources:处理项目测试资源文件
    • generate-test-resources
    • process-test-resources
    • test-compile:编译项目的测试代码
    • process-test-classes
    • test:使用单元测试框架运行测试,测试代码不会被打包或者部署
    • prepare-package
    • package:接收编译好的代码,打包成可发布的格式
    • pre-integration-test
    • integration-test
    • post-integration-test
    • verify
    • install:将包安装到Maven本地仓库
    • deploy:将包复制到远程仓库
  • site生命周期的目的是建立和发布站点
    • pre-site:执行一些在生成项目站点之前需要完成的工作
    • site:生成项目站点文档
    • post-site:执行一些在生成项目站点之后需要完成的工作
    • site-deploy:将生成的项目站点发布到服务器上

Maven的概念模型

Maven包含了一个项目对象模型(Project Object Model),一组标准集合,一个项目生命周期(Project Lifecycle),一个依赖管理系统(Dependency Manngement System)和用来运行定义在生命周期阶段中插件目标的逻辑。
这里写图片描述

  • 项目对象模型
    一个Maven工程有一个pom.xml文件,通过pom.xml文件定义项目的坐标、项目依赖、项目信息、插件目标等

  • 依赖管理系统

    通过Maven的依赖管理系统对项目所依赖的jar包进行统一管理

    例如:项目依赖junit4.9,通过在pom.xml中定义junit4.9的依赖即使用junit4.9,如下所示是对junit4.9的依赖定义

    <!-- 依赖关系 -->
    <dependencies>
        <!-- 此项目运行使用junit,所以此项目依赖junit -->
        <dependency>
            <!-- junit的项目名称 -->
            <groupId>junit</groupId>
            <!-- junit的模块名称 -->
            <artifactId>junit</artifactId>
            <!-- junit版本 -->
            <version>4.9</version>
            <!-- 依赖范围:单元测试时使用junit -->
            <scope>test</scope>
        </dependency>
  • 一个项目生命周期

    清理 –>编译 –> 测试 –> 报告 –> 打包 –> 部署

  • 一组标准集合

    Maven将整个项目管理过程定义一组标准,比如:通过Maven构建工程有标准的目录结构,有标准的生命周期阶段、依赖管理有标准的坐标定义

  • 插件目标Plugin Goal

    Maven的核心仅仅定义了抽象的生命周期,具体的任务是交由插件完成的,插件以独立的构件形式存在。Maven的生命周期和插件相互绑定,用以完成实际的任务。具体而言,是生命周期的阶段与插件的目标相互绑定,以完成某个具体的构建任务。例如项目编译这一个任务,它对应了default生命周期的compile这一个阶段,而maven-compiler-plugin这一个插件的compile目标能够完成任务,因此将它们绑定,就能实现项目编译的目的。

Maven工程的拆分与聚合

为达到拆分和聚合的目的,引入父工程maven project和模块maven module

父工程本身不写代码,它里面有一个pom.xml文件,这个文件可以将多个子模块中通用的jar所对应的坐标,集中在父工程中配置,将来的子模块就可以不需要在pom.xml中配置通用的jar的坐标了。

冲突问题的解决

  • 通过添加<exclusion>标签来解决冲突

    <dependency>
    <groupId>org.apache.struts</groupId>
    <artifacId>struts2-core</artifacId>
    <version>2.3.24</version>
    <exxlusions>
      <exclusion>
        <srtifactId>javassist</srtifactId>
        <groupId>javassist</groupId>
      </exclusion>
    </exxlusions>
    </dependency>
    • 使用版本锁定解决冲突
<dependencyManagement>
  <dependencies>
    <!-- 这里锁定版本为4.2.4 -->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-beans</artifactId>
      <version>4.2.4.RELEASE</version>
    </dependency>
  </dependencies>
</dependencyManagement>

依赖调节原则

  • 第一声明者优先原则

    pom.xml文件定义依赖,先声明的依赖为准

  • 路径近者优先原则

    A依赖XXX,A依赖B依赖XXX,则XXX优先被依赖在A中

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值