1. Maven定义
Apache Maven is a software project management and comprehension tool. Based on the concept of a project object model (POM), Maven can manage a project’s build, reporting and documentation from a central piece of information.——Maven official website
Apache Maven是一个软件项目管理和理解工具。基于项目对象模型(POM)的概念,Maven可以管理项目的构建,报告和文件,从信息中心。
Maven采用一种“优先于配置(CoC)”的策略来管理项目。它不仅把源代码构建成可以发布的项目(包括编译、打包、测试和分发),还可以生成报告生成web站点等。——轻量级javaEE企业应用实战
2. 为什么用Maven
- maven项目依赖的本地仓库,没有jar包,项目比平常的项目要小很多,节省空间
- 不需要在每个项目靠同样的包,只需要在本地仓库有一份就行了
- maven可以带插件,如果导入配置了tomcat等插件的maven项目就不需要再配置本地tomcat了
- 一键构建项目,编译,测试,运行,打包,部署
- maven是java开发的自然是跨平台的
- 应用于大型项目,可以提高开发效率
3. Maven入门
3.1. 下载Maven
官网地址(这里下载的是apache-maven-3.5.0-bin.zip)
3. 2. 解压目录介绍
- bin:maven的可执行性文件
- boot:plexus-classworlds类加载器框架
- conf:相关配置文件
- lib:Maven的类库
3.3. 设置环境变量
- JAVA_HOME:JDK的安装路径
- MAVEN_HOME:Maven的安装路径
ps:M2_HOME设置好后在path中注册一下:%M2_HOME%\bin;
3.4. 验证安装
打开cmd,输入mvn help:system,此时Maven会从网络上下载各种文件,当出现如下信息时表示安装成功了。
3.5. 设置Maven
3.5.1. maven 两种设置方式:
- 全局设置即通过Maven安装目录下的conf\settings.xml进行设置(推荐)
- 当前用户范围:通过${user.home}/.m2/settings.xml进行配置
3.5.2. maven参数配置
这里需要在maven配置文件中配置一个本地仓库,当然它有一个默认的在c盘,但是最好自己定义一个,配置方式参看:(3.5.3. settings相关配置参数)。
3.5.1. settings相关配置参数:
(localRepository)配置本地仓库:
<localRepository>D:/ide/Maven/LocalRepository</localRepository>
(interactiveMode)与用户交互:true提示用户输入,false智能选择默认值
- (offline)设置maven是否为离线状态:false,当maven找不到本地插件、依赖库时会尝试从网络下载
- (proxies)设置Maven代理服务器:设置代理服务器,包括代理服务器的ID、协议、代理服务器的地址、端口、用户信息、密码等信息
3.6. Maven常用命令
- mvn tomcat:run:一键启动tomcat
- mvn clean:清理编译好的文件(target文件夹)
- mvn compile:编译主目录的文件
- mvn test :编译test下的文件
- mvn packge:打包,放在了target目录下
- mvn install :将项目推送到本地仓库(推jar包,war包没有什么作用)
compile,test,package,install有执行顺序:
执行后者会把它前面的也都执行了(这就是mvn的声明周期的概念)
4. Maven核心概念
4.1 Maven生命周期
不同生命周期的命令可以同时执行例:mvn clean package
以下只包含主要的阶段(phase):
- clean 生命周期:clean
- default 生命周期:compile,test,package , install,deploy(发布到私服上)
- site声明周期:site 生成项目说明文档
4.2 Maven 的坐标
4.2.1 项目坐标
pom需要为每个项目配置一个唯一的标识,这个标识就是坐标
<!-- 公司域名或组织名-->
<groupId>net.hncu</groupId>
<!-- 项目名-->
<artifactId>ssmTest</artifactId>
<!--打包方式-->
<packaging>war</packaging>
<!-- 版本-->
<version>1.0-SNAPSHOT</version>
4.2.2 依赖的坐标:
pom中可以依赖其他项目的jar包
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.2.7</version>
</dependency>
4.3 Maven插件和目标
Maven的强大之处来自于它的插件,Maven的所有功能几乎都是由插件完成的。Maven生命周期其实也是由Maven的各个插件完成的。
<build>
<plugins>
<plugin>
<!--插件坐标-->
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<!--插件执行详情-->
<executions>
<execution>
<!--绑定到compile阶段-->
<phase>compile</phase>
<!--执行的目标插件-->
<goals>
<goal>compile</goal>
</goals>
<!--执行相关参数-->
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>utf-8</encoding>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
如上代码,是以Maven的编译插件为例,我们必要配置plugin的坐标,同时我们可以配置它的详情,它在哪个阶段执行、它执行什么目标、执行插件目标的参数
4.4 Maven依赖
就是对项目中jar 包的管理。可以在pom文件中定义jar包的GAV坐标,管理依赖。
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.2.7</version>
</dependency>
4.4.1. Maven依赖范围
依赖范围是通过scope来设置的
- Compile 例:struts2-core
范围:编译(compile) 、测试(Test),运行(),打包 - Provided 例: jsp-api.jar servlet-api.jar
范围:编译(compile)时需要,测试(test)时也需要 ,运行时不需要,打包时不需要 - Runtime 例: jdbc
范围:编译时不需要,测试时需要,,运行时需要,打包时需要 - Test 例:junit.jar
范围:编译时不需要,测试时需要,运行时不需要,打包也不需要
4.4.2. 依赖传递
如果B中使用A,C中使用B,则称B是C的直接依赖,而称A是C的间接依赖。
- 当第二依赖的范围是compile的时候,传递性依赖的范围与第一直接依赖的范围一致。
- 当第二直接依赖的范围是test的时候,依赖不会得以传递。
- 当第二依赖的范围是provided的时候,只传递第一直接依赖范围也为provided的依赖,且传递性依赖的范围同样为 provided;
- 当第二直接依赖的范围是runtime的时候,传递性依赖的范围与第一直接依赖的范围一致,但compile例外,此时传递的依赖范围为runtime;
4.4.3. 依赖冲突
- 如果直接与间接依赖中包含有同一个坐标不同版本的资源依赖,以直接依赖的版本为准。
即:假如项目A中包含junit 3.9,B中包含junit 4.1,B依赖A,C依赖B,C会选择最近的B中的junit4.1- 如果直接依赖中包含两个不同版本的包,会选择配置下方的为准。
4.4.4 解决冲突
4.4.4.1 从父类角度
可以配置optional阻止向下传递
<!--true不传递,默认false-->
<optional>true</optional>
4.4.4.2 从子类 角度
可以配置排除依赖,排除依赖包中所包含的依赖关系,不需要版本号
<exclusions
<exclusion>
<groupId>com.qf.maven</groupId>
<artifactId>maven-first</artifactId>
</exclusion>
</exclusions>
4.5 Maven的资源库
4.5.1. 本地资源库
在本机上的一个文件夹,所有Maven用的插件、jar包都在这里,当此处没有时会去远程下载
4.5.2 远程资源库
一般由某个司或团队自己维护,通过远程库可以让公司或团队都用同样的jar系统,如果没有找中央仓库
4.5.3 中央仓库(默认)
由Maven官方维护。