Maven基础
1 概述
Maven是一款自动化构建工具,专注服务于Java平台的项目构建和依赖管理。
Maven的作用:
- 整合多个项目之间的引用关系, 可以根据业务和分层需要任意拆分一个项目
- 规范地管理各个常用jar包及其各个版本, 并且可以自动下载和引入项目中
- 根据指定版本自动解决 jar 包版本兼容问题
- 把 jar 包所依赖的其它 jar 包自动下载并引入项目
Maven构建项目的主要环节:
①清理(clean):删除以前的编译结果,为重新编译做好准备。
②编译(compile):将Java源程序编译为字节码文件。
③测试(test):针对项目中的关键点进行测试,确保项目在迭代开发过程中关键点的正确性。
④报告:在每一次测试后以标准的格式记录和展示测试结果。
⑤打包(package):将一个包含诸多文件的工程封装为一个压缩文件用于安装或部署。 Java 工程对应 jar 包, Web工程对应war包。
⑥安装(install):在Maven环境下特指将打包的结果——jar包或war包安装到本地仓库中。
⑦部署(deploy):将打包的结果部署到远程仓库或将war包部署到服务器上运行。
2 安装
1、 确保已安装 java 环境:Maven本身是 java 写的, 所以要求必须安装 JDK。
从CMD中查看 java 环境变量: echo %JAVA_HOME%
2、 下载并解压 Maven 安装程序,解压到的目录最好是英文无空格的:
http://maven.apache.org/download.cgi
3、 配置 Maven 的环境变量:
MAVEN_HOME=d:/apache-maven-3.3.9
或者 M2_HOME=d:/apache-maven-3.3.9
path=%MAVEN_HOME%/bin;
或者%M2_HOME%/bin;
4、 验证是否安装成功:
在CMD输入命令mvn –v
,出现以下结果表示安装成功:
Apache Maven 3.3.9 (bb52d8502b132ec0a5a3f4c09453c07478323dc5; 2015-11-11T00:41:47+08:00)
Maven home: D:\Environment\apache-maven-3.3.9
Java version: 1.8.0_261, vendor: Oracle Corporation
Java home: D:\Environment\Java\jdk1.8\jre
Default locale: zh_CN, platform encoding: GBK
OS name: "windows 10", version: "10.0", arch: "amd64", family: "dos"
3 核心概念
3.1 Maven 工程约定目录结构
Maven 中约定的目录结构:
Hello 根目录,即工程名
|---src 源代码
|---|---main 主程序
|---|---|---java 主程序的java源码
|---|---|---resources 主程序的配置文件
|---|---test 测试程序
|---|---|---java 测试程序的java源码
|---|---|---resources 测试程序的配置文件
|---pom.xml Maven工程的核心配置文件
3.2 POM文件
即Project Object Model
项目对象模型,Maven 把一个项目的结构和内容抽象成一个模型,在 xml 文件中进行声明,Maven 的pom.xml 记录的关于构建项目的各个方面的设置,按照助约定的工程目录编译,测试,打包,部署,发布项目。
POM文件的主要内容:
标签 | 作用 |
---|---|
基本信息相关 | |
modelVersion | Maven 模型的版本,对于 Maven2 和 Maven3 来说,版本号是 4.0.0 |
groupId | 组织 id,一般是公司域名倒写+项目名,比如com.baidu.appolo |
artifactId | 模块名称,对应groupId中项目中的子项目。 |
version | 项目的版本号,version 使用三位数字标识,例如 1.1.0。如果项目还在开发中,是不稳定版本,通常在版本后带-SNAPSHOT。 |
packaging | 项目打包的类型,可以是 jar、war、rar、ear、pom,默认是 jar。Java 工程对应 jar 包, Web工程对应war 包。 |
依赖相关 | |
dependencies 和 dependency | Maven的一个重要作用就是管理 jar 包,为了一个项目可以构建或运行,项目中会依赖很多其他的jar包,这些 jar 被称为依赖,使用标签dependency来配置。 这些依赖的配置也是通过坐标来 定位的,因此Maven把所有的jar包也都视为项目。 |
配置属性相关 | |
properties | properties 用来定义一些配置属 性, 例如 project.build.sourceEncoding(项目构建源码编码方式),可以设置为UTF-8,防止中文乱码,也可定义相关构建版本号,便于日后统一升级。 |
构建相关 | |
build | build表示与构建相关的配置, 例如设置编译插件的 jdk 版本 |
继承相关 | |
parent | 如果多个模块都需要声明相同的配置,例如:groupId、version、有相同的依赖、或者相同的组件配置等, 可以使用类似 Java的继承机 制, 用parent声明要继承的父工程的pom配置。 |
聚合相关 | |
modules | 在多模块开发中,为了统一构建整个项目的所有模块,可以提供一个额外的模块,该模块的打包方式为 pom,并且在其中使用 modules 标签,列出聚合的其它模块,这样通过本模块就可以一键自动识别模块间的依赖关系来构建所有模块。 |
3.3 仓库
在Maven中,任何一个依赖、插件或者项目构建的输出,都可以称之为构件
。 Maven的具体构建工作是由特定的构件完成的,为了提高构建的效率和构件复用, Maven把所有的构件统一存储在某一个位置,这个位置就叫做仓库
。
仓库存放的有:
- Maven的插件,插件也是一些 jar包,这些 jar 包可以完成一定的功能
- 我们自己开发项目的模块
- 第三方框架或工具的 jar 包
根据仓库存储的位置,把仓库分为本地仓库和远程仓库:
-
本地仓库,存在于当前电脑上,默认存放在
~\.m2\repository
中,为本机上所有的Maven工程服务,~
是用户的主目录。可以通过Maven的配置文件Maven_home/conf/settings.xml
中的<localRepository>
标签来修改本地仓库所在的目录。 -
远程仓库,不在本机上, 通过网络访问,多电脑共享使用的。
-
中央仓库: 通过Internet访问,为全世界所有 Maven工程服务。 最权威的。
-
中央仓库的镜像:架设在不同位置,欧洲,美洲,亚洲等每个洲都有若干的服务器,为中央仓库分担流量,减轻中央仓库的访问,下载的压力。可以通过Maven的配置文件
Maven_home/conf/settings.xml
中的<mirror>
标签来修改镜像的地址。 -
私服: 在局域网环境中部署的服务器,为当前局域网范围内的所有 Maven工程服务,公司中常常使用这种方式。
-
https://mvnrepository.com/
网站可以查找需要使用的jar包。
3.4 坐标
groupId
、artifactId
、version
三个元素生成了一个Maven项目的基本坐标,在众多的 Maven 项目中可以唯一定位到该项目,坐标也决定着项目在仓库中的路径及名称。
groupId、artifactId和version决定项目在仓库中的路径, artifactId和version决定jar包的名称。比如:
<groupId>com.yupeng.maven</groupId>
<artifactId>Hello</artifactId>
<version>0.0.1-SNAPSHOT</version>
jar包所在的目录是:com/yupeng/maven/Hello/0.0.1-SNAPSHOT/
,名称是Hello-0.0.1-SNAPSHOT.jar
,所以此jar包的完整路径是com/yupeng/maven/Hello/0.0.1-SNAPSHOT/Hello-0.0.1-SNAPSHOT.jar
3.5 依赖
3.5.1 依赖的目的
当 A jar 包用到了 B jar 包中的某些类时, A就对B产生了依赖。一个 Maven 项目正常运行如果需要其它项目的支持, Maven会根据坐标自动到本地仓库中进行查找。对于程序员自己的 Maven 项目,需要进行安装后,才能保存到仓库中。
3.5.2 加入依赖的方式
在pom.xml文件中通过dependency标签加入:
<!--log4j日志依赖-->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<!--junit单元测试依赖-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
</dependency>
3.5.3 依赖的范围
依赖信息中除了目标 jar 包的坐标,可能还有一个scope标签, 这是依赖的范围。可用的依赖的范围有:compile
、test
、 provided
,默认采用compile,三种范围的有效性:
compile | test | provided | |
---|---|---|---|
对主程序是否有效 | ● | × | ● |
对测试程序是否有效 | ● | ● | ● |
是否参与打包 | ● | × | × |
是否参与部署 | ● | × | × |
3.6 常用设置
3.6.1 全局变量
在 Maven 的 pom.xml 文件中,<properties>
用于定义全局变量,通过${property_name}
的形式引用变量的值。
比如对同一个框架的一组jar包的版本管理,为了方便升级框架,可以将jar包的版本信息同一提取出来,使用自定义标签,作为全局变量:
<properties>
<spring.version>4.1.1.RELEASE</spring.version>
</properties>
引用前面声明的版本号:
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${atguigu.spring.version}</version>
</dependency>
</dependencies>
当需要升级框架版本时,只需要改变<spring.version>
标签中的内容即可。
<properties>
的其他用法:
<properties>
<maven.compiler.source>1.8</maven.compiler.source> 源码编译jdk版本
<maven.compiler.target>1.8</maven.compiler.target> 运行代码的jdk版本
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 项目构建使用的编码,避免中文乱码
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> 生成报告的编码
</properties>