一、简介
maven:
是apache下的一个开源项目,是纯java开发,并且只是用来管理java项目的,Maven是跨平台的项目管理工具。
1.自动化构建和项目管理工具
Ant→Make→Maven→Gradle
2.Maven概述
①读音:妹文、麦文
②Maven作用一:自动化构建
③Maven作用二:依赖管理[多了重复、少了报错]
④Maven作用三:项目信息管理
3.自动化构建
①构建[build]:将程序员编写的代码从源文件到服务器部署的整个过程。
清理→编译→测试→报告→打包→部署→运行……
②自动化构建:将构建过程中的各个操作步骤交给构建工具自动完成。
4.Maven的好处?
节省空间
就是对jar包的统一管理就是对jar包的统一管理,依赖管理
一键构建,
可跨平台
5.Maven的用途
①项目构建:项目构建指的是程序模块从清理、编译直到部署的整个过程。
②依赖管理:Maven能够提供自动的依赖管理,将所需要的JAR自动导入到工程中,根据既定的规则很好的解决JAR包之间的冲突。
③项目信息管理:Maven能够提供高质量的项目信息,包括依赖关系、测试报告、站点信息等详细内容,并自动生成静态页面,拷贝到服务器上就可以直接使用。
二、Maven的配置
①要求当前系统环境下配置了JAVA_HOME
在CMD命令行中输入:echo %JAVA_HOME% 如果能出来JDK的安装目录,说明我们配置了JAVA环境
②将Maven的ZIP压缩包解压到一个非中文无空格目录下【maven.apache.org官方网站下载jar包】
apache-maven-3.3.9-bin.zip
③.配置环境变量,用mvn -v查看是否正确配置了maven【要配置jdk, maven3.3.9这个版本所需的jdk版本必须要1.7以上】
M2_HOME:
D:DevSoftapache-maven-3.3.9
path:
%M2_HOME%in;
mvn -v查看maven版本
④.先了解一下maven的目录结构:
projectname
-src
-main
-java
-package
-resources【配置文件或者说资源文件】
-test
-java
-package
-resources
pom.xml
按照上面的maven的目录结构创建一个maven项目,参照word文档!
⑤当针对某个Maven工程执行诸如“编译”、“测试”、“打包”、“部署”等命令时,需要进入到pom.xml所在的目录下执行。
mvn compile
三、maven的几个概念:
1.坐标
①数学坐标:平面中使用横纵两个坐标系可以唯一的定位平面中的任何一个点。
向量x:横坐标
向量y:纵坐标
②使用三个向量在Maven仓库中唯一的定位一个Maven工程。
向量groupid:公司或组织的名称+项目名称
向量artifactId:模块名称
向量version:模块版本
<groupId>com.neuedu.maven</groupId>
<artifactId>Hello</artifactId>
<version>0.0.1-SNAPSHOT</version>
③如何根据坐标zhao到仓库中查找对应的Maven工程
坐标
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>4.0.0.RELEASE</version>
仓库中的路径
org/springframework/spring-core/4.0.0.RELEASE/spring-core-4.0.0.RELEASE.jar
④如何查找指定jar包的坐标:
1.从maven仓库下载
http://search.maven.org/
http://mvnrepository.com/【建议使用这个】
四、仓库
①作用:保存Maven工程
②分类
[1]本地仓库:为当前电脑上所有Maven工程服务【本地仓库的配置只需要修改settings.xml文件就可以】
[2]远程仓库[私服]:为当前局域网中的所有Maven工程服务器,公司维护
[3]中央仓库:为全世界所有的Maven工程服务
[4]中央仓库的镜像:内容和中央仓库一样,架设在全世界各个大洲,让Maven用户可以就近获取需要的Maven资源,同时也能够减轻中央仓库的压力。
③jar包的查找过程
首先在本地仓库中查找,如果找不到就到局域网中的私服中去找,还找不到就连接中央仓库或镜像。从中央仓库或镜像中找到后,如果局域网中架设了私服,就保存到私服上,
下次同一局域网中的其他用户直接从私服上下载即可,不必连接中央仓库或镜像了。如果局域网中没有架设私服,则保存在本地仓库中。
④Maven工程分类
[1]Maven用户自己开发的工程
[2]Maven的插件
[3]使用Maven构建得到的第三方jar包
⑤可以修改Maven默认的本地仓库路径,使其指向一个提前下载好的目录
配置文件路径
Maven解压目录/conf/settings.xml
修改
<localRepository>D:MavenRepository</localRepository>
五、生命周期
clean 删除target目录
compile 编译
test 测试,先执行compile,再执行test
package 打包(并将jar包放入到target的目录中),先执行compile,然后执行test,最后执行package
install 安装jar包到本地仓库中
mvn deploy
site 生成一个站点,先执行compile,然后执行test,然后执行package,最后执行site
①Maven为了能够将构建过程自动化处理,定义了三个主要的生命周期。其中定义了相关的构建过程。
②三个生命周期
[1]清理周期clean
[2]站点周期site
[3]默认周期default
③最重要的特点:每个生命周期中执行任何一个操作,都是从这个生命周期最初的位置开始执行,直到到达命令指定的位。
六、依赖管理
1、使用坐标引用依赖的项目
依赖声明主要包含如下元素:
1 <dependencies> 2 <dependency> 3 <groupId>junit</groupId> 4 <artifactId>junit</artifactId> 5 <version>4.10</version> 6 <scope>test</scope> 7 </dependency> 8 </dependencies>
2、依赖方式
[1]在pom.xml配置文件中使用dependencies/dependency元素配置依赖信息
[2]通过目标jar包的坐标找到被依赖的文件
3、依赖范围
在依赖声明中,scope标签指定的就是当前项目在什么情况下对目标项目有依赖。可选值包括:compile、test、provided、runtime等
1.默认compile:当前所依赖的jar包是当前Maven工程中所有类都需要使用的,最终也需要参与打包。
2.test:只是当前工程中的测试类需要,最终不参与打包。
3.provided:当工程在服务器上运行起来后,可以由服务器提供,所以也只是在开发或测试时使用,部署到服务器上时就不需要。
一个自己开发的Maven工程,需要执行“安装”命令,才能够被放入到仓库中。
4、依赖复杂性
[1]路径最短者优先
MakeFriends --------> HelloFriends----------->Hello
| |
log4j.2.1.14 log4j.2.1.17
[2]路径相同时,先声明者优先
MakeFriends --------> HelloFriends ------>log4j.2.1.14
|
-------------->OurFriends ------->log4j.2.1.12
5、版本冲突的解决方案
[1]调节原则:
[1]路径最短者优先原则
[2]路径相同时,先声明者优先原则
[2]排除原则
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<exclusions>
<exclusion>
<groupId></groupId>
<artifactId></artifactId>
<!--这里不需要指定版本号 -->
</exclusion>
</exclusions>
<scope>provided</scope>
</dependency>
[3]版本锁定原则
<dependencyManagement>
<dependencies>
<dependency>
<!--jar包坐标 -->
<groupId></groupId>
<artifactId></artifactId>
<version></version>
</dependency>
</dependencies>
</dependencyManagement>
版本锁定之后,后面再使用到这个的 依赖的时候,就不要写版本号了!
而且如果有多个相同的需要锁定的jar包的版本号一致的话,我们可以单独提取到properties标签中,
在properties标签中,子标签自己定义,标签的值就是版本号,下面只需要在依赖的地方用${}引用就可以了!
七、继承
①目的一:将pom.xml文件中重复的信息统一提取到父工程中,简化pom.xml中的配置
②目的二:将各个子工程都需要依赖的jar包提取到父工程中统一管理
③注意:父工程打包的方式——pom,表示这是一个管理其他工程的工程
< packaging>pom</ packaging>
④指定当前工程的父工程
<parent >
<groupId>com.atguigu.maven</groupId>
<artifactId>Parent</artifactId>
<version>0.0.1-SNAPSHOT</version>
<!-- 如何通过当前工程的pom.xml文件找到父工程的pom.xml文件 -->
<!-- 配置父工程的pom.xml文件相对于当前工程pom.xml文件的相对路径 -->
<relativePath> ../Parent/pom.xml</relativePath >
</parent >
在tomcat运行一遍,用插件运行一遍
解决-Dmaven.multiModuleProjectDirectory system property is not set. Check $M2_HOME environment variable and mvn script match.
1.添加M2_HOME的环境变量
2.Preference->Java->Installed JREs->Edit 选择一个jdk,
添加 -Dmaven.multiModuleProjectDirectory=$M2_HOME
继承练习:
①新建Maven项目Parent
②修改Parent/pom.xml的<packaging>jar</packaging>为<packaging>pom</packaging>,表明这不是一个普通的Java工程或Web工程,而是管理其他Maven工程的工程。
③删除子项目中的重复内容,提取依赖信息
④在子项目POM中,添加
<parent>
<groupId>...</groupId>
<artifactId>...</artifactId>
<version>...</version>
<relativePath>从当前目录到父项目的pom.xml文件的相对路径</relativePath>
</parent>
注意:此时如果安装某个项目报错,则是因为Parent工程没有安装
⑤发现子项目中依赖的包和项目有问题
⑥将Parent项目中的dependencies标签,用dependencyManagement标签括起来
⑦在子项目中重新指定需要的依赖,删除范围和版本号