Maven

一. 基本介绍

介绍

Maven 是一个Java项目管理工具,主要功能是统一开发规范与包的依赖管理

主要包括:

  1. 管理jar文件
  2. 自动下载jar文件,以及文档和源码
  3. 管理jar的依赖
  4. 管理需要的jar版本
  5. 编译程序,java编译成class
  6. 测试代码
  7. 打包文件,如打包成jar或war
  8. 帮助部署项目

Maven构建:

构建是面向过程的,就是一些步骤,主要是编译,测试,运行,maven主要包括:

  1. 清理:把之前项目编译的东西清理掉,为新的编译做准备
  2. 编译:把源码批量的编译成可执行代码
  3. 测试:可以执行测试程序代码,验证功能正确性,且能批量执行多个测试代码
  4. 报告:生成测试结果文件,测试通过的没有
  5. 打包:将项目生成的class文件添加在一个压缩文件中,如jar文件和war文件
  6. 安装:将打包成的jar或war安装到本地仓库
  7. 部署

Maven核心概念

  1. POM:项目对象模型,表现为一个文件,名称为pom.xml,maven把一个项目当作一个模型使用,此文件用以控制项目构建过程。项目中编写此文件配置maven。
  2. 约定的目录结构:maven项目的目录和文件位置都是有规定的
  3. 坐标:表示资源的唯一字符串
  4. 依赖管理:管理项目的jar文件
  5. 仓库管理:资源存放位置
  6. 生命周期:maven构建项目的过程就是生命周期
  7. 插件和目标:执行maven时的构建过程用到的工具就是插件
  8. 继承
  9. 聚合

maven安装

  • 官网下载maven
  • 配置JAVA_HOME
  • 配置M2_HOME,值为maven安装目录
  • 将Maven的bin目录配置到path中%M2_HOME%\bin
  • 控制台输入命令验证安装:mvn -v

二. 核心概念

1. 约定的目录结构

Hello/ # 项目
--/src 
----/main #存放java代码和配置文件
------/java #程序包和包中的java文件
------/resources #程序中使用的配置文件
----/test # 存放测试程序和文件(可没有)
------/java #测试程序包和包中的java文件
------/resources #测试中使用的配置文件
--/pom.xml # maven的核心文件,必须有

--/target # maven编译后的项目存放位置

2. 仓库

仓库可以简单理解为存放jar包的地方,maven会自动从仓库中寻找项目需要的jar包。

(1)仓库类别
  • 本地仓库
    存放于本机上的仓库,默认存放位置是 %USERPROFILE%\.m2\repositorymaven会优先在本地仓库寻找资源,若没有需要的资源或者没有本地仓库,maven会从远程仓库拉取资源到本地仓库再使用。
  • 远程仓库
    不在本地上,通过网络访问的仓库
  • 中央仓库:为maven唯一的官方仓库,为全世界maven工程服务
  • 中央仓库镜像
  • 私服:局域网环境中部署的服务器,公司常常使用这种方式
(2)仓库配置
  • 修改本地仓库
  1. 找到配置文件,位置在于 %M2_HOME%\conf\settings.xml
  2. 修改如下的标签,填入新的路径(路径不要有中文):<localrepository>新路径<\localrepository>
  • 修改远程仓库
(3)使用流程





最后

Maven

本地仓库

私服

镜像

中央仓库


3.POM文件

即 Project Object Model 项目对象模型。Maven 把一个项目的结构和内容抽象成一个模型,在 xml 文件中进行声明,以方便进行构建和描述。简而言之可以将pom.xml 看作Maven在项目中的配置文件。

(1)基本标签

标签名

说明

modelVersion

Maven模型版本,现在不用管,只能是4.0.0

packaging

项目打包类型,可以是jar,war,pom等,默认不写为jar

name和url

填写项目名和项目网站

(2)坐标

坐标是项目在互联网中的唯一标识,由如下三个标签组成

标签名

说明

groupId

组织id,一般为公司域名倒写。如:com.baidu

artifactId

项目名称

version

项目版本号。通常使用三位数字标识,如1.1.0;若是不稳定版则版本号后面带 -SNAPSHOT

(3)依赖

配置项目依赖的jar包,这些jar包被成为依赖

标签名

说明

dependencies

在此标签下配置多个依赖,为dependency的父标签

(子)dependency

在此标签下配置一个依赖,其子标签为坐标的三个标签以确定唯一的依赖

示例:

<dependencies>
    <!--导入一个依赖-->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context</artifactId>
      <version>5.1.9.RELEASE</version>
    </dependency>
    <!--导入二个依赖-->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-web</artifactId>
      <version>5.1.9.RELEASE</version>
    </dependency>
    <!--导入三个依赖-->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-webmvc</artifactId>
      <version>5.1.9.RELEASE</version>
    </dependency>
</dependencies>
(4)属性配置

标签名

说明

properties

properties 是 用 来 定 义 一 些 配 置 属 性 的 , 例 如 project.build.sourceEncoding(项目构建源码编码方式)设置为UTF-8

(5)构建

标签名

说明

build

build 表示与构建相关的配置,例如设置编译插件的 jdk 版本

(6)继承

标签名

说明

parent

类似java继承机制,继承父工程的pom配置

(7)聚合

标签名

说明

modules

在 Maven 的多模块开发中,为了统一构建整个项目的所有模块,可以提供一 个额外的模块,该模块打包方式为 pom,并且在其中使用 modules 聚合的 其它模块,这样通过本模块就可以一键自动识别模块间的依赖关系来构建所有 模块,叫 Maven 的聚合。

4. 生命周期

生命周期就是maven构建项目的过程,即清理、编译,测试,报告,打包,安装,部署过程

maven可以独立使用,使用命令,完成项目的清理编译测试等,以下为这些命令:

  • mvn clean
    清理,会删除编译和测试后的文件目录,即target目录,但是install到仓库的包不会删除
    会调用clean插件
  • mvn compile
    编译,会在项目根目录下生成target目录,里面存放编译后的文件
    会调用resources和compile插件,分别是将resources目录的资源文件和main目录下的代码编译到target中
  • mvn test-complie
    编译测试程序,放入target目录
    会依次调用resources、compile、testResources和testCompile插件
  • mvn test
    进行测试,在target目录中生成surefire-reports目录存放测试失败结果
    会依次调用resources、compile、testResources、testCompile和test插件,并在命令行展示测试结果
  • mvn package
    打包主程序,会依次编译->编译测试->测试->打包成pom中配置的jar包或者war包,并放置于target目录下,包中不会包含测试代码
    会依次调用resources、compile、testResources、testCompile、test和jar(或war等,按照打包配置选择)插件
  • mvn install
    把本程序打包安装到本地仓库
  • mvn deploy
    部署项目,会打包,保存到本地仓库、私服仓库,还会部署到web容器

**注意:**以上命令必须在pom.xml所在目录

5.插件

maven命令执行时,真正实现功能的是插件,插件就是些jar文件

在pom.xml中,于 <bulid>标签下的 <plugins>中配置插件(不配置也会有默认插件)

<build>
      <!-- 配置插件标签 -->
      <plugins>
        <!-- 具体配置的插件 -->
        <plugin>
          <!--插件名 -->
          <artifactId>maven-clean-plugin</artifactId>
          <!--版本 -->
          <version>3.1.0</version>
          <!--配置java版本 -->
          <configuration>
 			 <source>1.8</source>
 			 <target>1.8</target>
 		  </configuration> 

        </plugin>
      </plugins>
</build>

6.依赖范围

设定依赖于哪些生命周期中使用

在依赖标签下使用<scope>标签进行设定,包含如下范围:

编译程序

测试程序

打包

部署

compile(默认)

Y

Y

Y

Y

test

N

Y

N

N

provided

Y

Y

N

N

<dependency>
  <groupId>junit</groupId>
  <artifactId>junit</artifactId>
  <version>4.11</version>
  <scope>test</scope>
</dependency>

7.属性标签

设置maven在项目中的属性全局变量,在pom.xml的 <properties>中设定

  • 全局变量:使用自定标签设定全局变量,使用${名称}进行引用
<properties>
    <!--项目编码 -->
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <!--源码java版本 -->
    <maven.compiler.source>1.7</maven.compiler.source>
    <!--编译后运行的环境版本-->
    <maven.compiler.target>1.7</maven.compiler.target>
    <!--全局变量定义,标签名自取 -->
    <junit.version>4.11</junit.version>
  </properties>

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <!--引用全局变量 -->
      <version>${junit.version}</version>
      <scope>test</scope>
    </dependency>
  </dependencies>

一些错误:

  1. 创建项目后出现xxx already exists in VFS错误:因为残留上一次同名项目,所以删除对应项目,并重启IDEA
  2. 创建项目后项目没有.iml文件:在该项目下执行命令mvn idea:module