Maven是什么?
Maven是一个项目管理工具,它包含了一个项目对象模型(Project Object Model),一组标准集合,一个项目生命周期(Project Lifecycle),一个依赖管理系统(Dependency Management System),和用来运行定义在生命周期阶段(phase)中插件(plugin)目标(goal)的逻辑。当你使用Maven的时候,你用一个明确定义的项目对象模型来描述你的项目,然后Maven可以应用横切的逻辑,这些逻辑来自一组共享的(或者自定义的)插件。
如果没有Maven,你可能不得不经历下面的过程:
1 如果使用了spring,去spring的官网下载jar包;如果使用hibernate,去hibernate的官网下载Jar包;如果使用Log4j,去log4j的官网下载jar包.....
2 当某些jar包有依赖的时候,还要去下载对应的依赖jar包
3 当jar包依赖有冲突时,不得不一个一个的排查
4 执行构建时,需要使用ant写出很多重复的任务代码
5 当新人加入开发时,需要拷贝大量的jar包,然后重复进行构建
6 当进行测试时,需要一个一个的运行....检查
有了Maven,它提供了三种功能:
1 依赖的管理:仅仅通过jar包的几个属性,就能确定唯一的jar包,在指定的文件pom.xml中,只要写入这些依赖属性,就会自动下载并管理jar包。
2 项目的构建:内置很多的插件与生命周期,支持多种任务,比如校验、编译、测试、打包、部署、发布...
3 项目的知识管理:管理项目相关的其他内容,比如开发者信息,版本等等
Maven有一个生命周期,当你运行mvn install的时候被调用。这条命令告诉Maven执行一系列的有序的步骤,直到到达你指定的生命周期。遍历生命周期旅途中的一个影响就是,Maven 运行了许多默认的插件目标,这些目标完成了像编译和创建一个JAR文件这样的工作。
1.项目的构建流程
2.Maven模型
3.Maven的约定
src/main/java: 存放项目的java文件。
src/main/resources:存放项目的资源文件,如spring,hibernate的配置文件。
src/test/java:存放所有的测试的java文件。
src/test/resources: 存放测试用的资源文件。
target: 项目输出位置。
pom.xml 文件
想要安装 Apache Maven 在Windows 系统上, 需要下载 Maven 的 zip 文件,并将其解压到你想安装的目录,并配置 Windows 环境变量。
所需工具 :
- JDK 1.8
- Maven 3.5.0
- Windows 7
- eclipse Neon.3
1. JDK 和 JAVA_HOME
确保已安装JDK,并 “JAVA_HOME” 变量已加入到 Windows 环境变量。
2. 下载Apache Maven
访问 Maven官方网站,打开后找到下载链接,如下:
下载 Maven 的 zip 文件,例如: apache-maven-3.5.0-bin.zip,将它解压到你要安装 Maven 的文件夹。
假设你解压缩到文件夹 – D:\apache-maven
3. 添加 MAVEN_HOME
添加 MAVEN_HOME 环境变量到 Windows 环境变量,并将其指向你的 Maven 文件夹。
4. 添加到环境变量 - PATH
更新 PATH 变量,添加 Maven bin 文件夹到 PATH 的最后,如: %MAVEN_HOME%\bin, 这样就可以在命令中的任何目录下运行 Maven 命令了。
5. 验证
完成,以验证它,执行 mvn –version 在命令提示符下,如下图输出结果:
2、 Maven如何管理jar包
对于maven来说,仓库只分为两类:本地仓库和远程仓库。
远程仓库又分为:中央仓库+私服+其它公共远程仓库
在Maven中会涉及到几种仓库:
1、 工作空间,即我们的项目工程,这里面可能会放着pom.xml文件,这个pom.xml就是maven的配置文件
2、 本地仓库,本地仓库用于存放jar包,其实Jar包并不是直接放入工作空间的,它是存放在本地仓库,然后在执行发布打包的时候,添加依赖路径
3、中央仓库:Maven中央存储库是由Maven社区提供的资源库。它包含了大量的常用程序库。它不要求配置,搜索时需要互联网接入
4、 私库:是架设在本机或者局域网中的一种特殊的远程仓库,通过私服可以方便的管理其它所有的外部远程仓库,用于缓解频繁从外网下载jar包资源的压力。而且使用私库作为缓存层,也相对安全一些。
5、 其它共享仓库:除了中央仓库和私服,还有很多其他公开的远程仓库,常见的有Java.NET Maven库(http://download.java.net/maven/2/)和jboss Maven库(http://repository.jboss.com/maven2/)等
通过下面这张图可以清晰地表达项目、本地仓库、远程仓库(共享仓库)之间的关系
当我们在pom中声明了依赖关系后,参考上面的图:
当我们执行 Maven 构建命令,Maven 依赖库按以下顺序进行搜索:
1 Maven在执行相关的任务时,会先去本地仓库查看是否有该资源,如果有的话,判断版本是否正确,如果一切都没问题则直接使用;否则,执行下一步
2 Maven会去配置的共享仓库中查找,如果找到就拷贝到本地仓库中;找不到则会给出相关的提示
3 Maven在本地如果搭建了私库,则会去私库中查找,找到就拷贝到本地仓库;找不到就会去共享仓库中查找,然后放入私库和本地库。有了私库,局域网内的开发者可以共享依赖,就不用每个人都去外网下载jar包,浪费带宽了。
既然 Maven 安装了,那么本地仓库也就有了,默认路径在我们C盘目录下,对于专业人士来说C盘很危险,下面我们修改一下默认配置。
关于本地仓库和共享仓库的配置都在settings.xml中,这个文件位于conf中,如果没有则拷贝一份即可。
1.本地仓库
默认情况下,不管是在windows还是Linux上,每个用户在自己的用户目录下都有一个路径名为.m2/repository/的仓库目录。有时候,因为某些原因(例如C盘空间不够),用户会想要自定义本地仓库目录地址。这时,可以编辑文件~/.m2/settings.xml,设置localRepository元素的值为想要的仓库地址。例如:
注:如果未出现.m2文件夹,可以运行 mvn help:system生成
这样,该用户的本地仓库地址就被设置成了D:\apache-maven-3.5.0\repository。需要注意的是,默认情况下,${user:home}/.m2/settings.xml文件是不存在的,用户需要从Maven安装目录复制${user:home}/conf/settings.xml文件再进行编辑。
一个构件只有在本地仓库中之后,才能由其他Maven项目使用,那么构件如何进入到本地仓库中呢?最常见的是依赖Maven从远程仓库下载到本地仓库中。还有一种常见的情况是,将本地项目的构件安装到Maven仓库中。例如本地有两个项目A和B,两者都无法从远程仓库获得,而同时A又依赖于B,为了能构建A,B就必须首先得以构建并安装到本地仓库中。为了安装项目,我们可以在项目中执行: mvn clean install命令。Install插件的install目标将项目的构建输出文件安装到本地仓库。
安装好Maven后,如果不执行任何Maven命令,本地仓库目录是不存在的。当用户输入第一条Maven命令之后,Maven才会创建本地仓库,然后根据配置和需要,从远程仓库下载构件至本地仓库。
2.中央仓库
由于最原始的本地仓库是空的,Maven必须知道至少一个可用的远程仓库,才能在执行Maven命令的时候下载到需要的构件。中央仓库就是这样一个默认的远程仓库,Maven的安装文件自带了中央仓库的配置。读者可以使用解压工具打开jar文件$M2_HOME/lib/maven-model-builder-3.5.jar(在Maven2中,jar文件路径类似于$M2_HOME/lib/maven-2.2.1-uber.jar),然后访问路径:org/apache/maven/model/pom-4.0.0.xml,可以看到如下的配置:
包含这段配置的文件是所有Maven项目都会继承的超级POM。这段配置使用id central对中央仓库进行唯一标识,其名称为Maven Repository Switchboard,它使用default仓库布局。最后需要注意的是snapshots元素,其子元素enabled的值为false,表示不从该中央仓库下载快照版本的构件【快照版本的项目是版本不稳定的项目,所以中央仓库默认是关闭的】。
3.私服
私服是一种特殊的远程仓库,它是架设在局域网内的仓库服务,私服代理广域网上的远程仓库,供局域网内的Maven用户使用。当Maven需要下载构件的时候,它从私服请求,如果私服上不存在该构件,则从外部的远程仓库下载,缓存在私服上之后,再为Maven的下载请求提供服务。此外,一些无法从外部仓库下载到的构件也能从本地上传到私服上供大家使用。
4.镜像仓库
镜像仓库可以理解为仓库的副本,从仓库中可以找到的构件,从镜像仓库中也可以找到。比如针对中央仓库 http://repo1.maven.org/maven2 ,有时通过中央仓库会出现m2eclipse之Unable to update index for central,这个问题的原因很明显:m2eclipse连不上maven index更新站点,此时可以在在.m2/settings.xml内设置 镜像来解决:
其中,<mirrorOf> 指明了为哪个仓库配置镜像,可以使用通配符如:<mirrorOf>*</mirrorOf>,或者 <mirrorOf>repo1,repo2</mirrorOf> 等进行匹配。一旦配置了镜像,所有针对原仓库的访问将转到镜像仓库的访问,原仓库将不再能直接访问,即使镜像仓库不稳定或停用。在搭建私服的时候,我们通常为所有仓库设置镜像为私服地址,通过私服对所有仓库进行统一管理。 POM.xml文件的解释