Maven
一. 基本介绍
介绍
Maven 是一个Java项目管理工具,主要功能是统一开发规范与包的依赖管理
主要包括:
- 管理jar文件
- 自动下载jar文件,以及文档和源码
- 管理jar的依赖
- 管理需要的jar版本
- 编译程序,java编译成class
- 测试代码
- 打包文件,如打包成jar或war
- 帮助部署项目
Maven构建:
构建是面向过程的,就是一些步骤,主要是编译,测试,运行,maven主要包括:
- 清理:把之前项目编译的东西清理掉,为新的编译做准备
- 编译:把源码批量的编译成可执行代码
- 测试:可以执行测试程序代码,验证功能正确性,且能批量执行多个测试代码
- 报告:生成测试结果文件,测试通过的没有
- 打包:将项目生成的class文件添加在一个压缩文件中,如jar文件和war文件
- 安装:将打包成的jar或war安装到本地仓库
- 部署
Maven核心概念
- POM:项目对象模型,表现为一个文件,名称为pom.xml,maven把一个项目当作一个模型使用,此文件用以控制项目构建过程。项目中编写此文件配置maven。
- 约定的目录结构:maven项目的目录和文件位置都是有规定的
- 坐标:表示资源的唯一字符串
- 依赖管理:管理项目的jar文件
- 仓库管理:资源存放位置
- 生命周期:maven构建项目的过程就是生命周期
- 插件和目标:执行maven时的构建过程用到的工具就是插件
- 继承
- 聚合
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\repository
maven会优先在本地仓库寻找资源,若没有需要的资源或者没有本地仓库,maven会从远程仓库拉取资源到本地仓库再使用。 - 远程仓库
不在本地上,通过网络访问的仓库
- 中央仓库:为maven唯一的官方仓库,为全世界maven工程服务
- 中央仓库镜像
- 私服:局域网环境中部署的服务器,公司常常使用这种方式
(2)仓库配置
- 修改本地仓库
- 找到配置文件,位置在于
%M2_HOME%\conf\settings.xml
- 修改如下的标签,填入新的路径(路径不要有中文):
<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;若是不稳定版则版本号后面带 |
(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>
一些错误:
- 创建项目后出现
xxx already exists in VFS
错误:因为残留上一次同名项目,所以删除对应项目,并重启IDEA - 创建项目后项目没有.iml文件:在该项目下执行命令
mvn idea:module