本文原先发表与博客园(http://www.cnblogs.com/libingbin/p/6104588.html ),不过个人博客园已经再也不更新了,原有博文会逐步迁移的。html
听说半夜喝咖啡敲出来的代码,有一种淡淡的咖啡味道;那半夜写出来的总结,是否是也会有一种夜晚的宁静呢!今晚夜深人静,就给后生们总结总结Maven吧!毕竟,今天搞J2E的工程师若是不会或不知道Maven,那就在圈子里尴尬了。Maven是一个采用纯Java编写的开源项目管理工具。Maven采用了一种被称之为project object model (POM)概念来管理项目,全部的项目配置信息都被定义在一个叫作POM.xml的文件中,经过该文件,Maven能够管理项目的整个声明周期,包括编译,构建,测试,发布,报告等等。目前Apache下绝大多数项目都已经采用Maven进行管理。而Maven自己还支持多种插件,能够方便更灵活的控制项目。一句话:Maven是一个项目管理和构建工具,主要作编译、测试、报告、打包、部署等操做完成项目的构建。web
Maven能干吗呢?spring
1.项目自动化编译部署:apache
2.项目jar包的依赖管理:api
3.企业开发分包分模块部署:框架
首先,确定是官网看看(https://maven.apache.org)喽!jsp
2. 将下载好的maven(压缩版的)进行解压/并拷贝本身的开发目录maven
3. 设置系统环境变量
设置Maven_HOME(例如:D:\dev\maven3.3.9)
设置PATH(例如:%MAVEN_HOME%\bin)ide
4. mvn -v 检查是否安装成功工具
5. maven仓库的定位
1. 配置用户范围的settings.xml(MAVEN_HOME/conf/settings.xml拷贝至C:\Users\admin.m2目录下)
2. 打开settings.xml文件将仓库路径修改(打开复制好的文件并修改里面的节点内容,指定本身的本地库。见下图:)
6. Maven遵循约定优于配置的原则(有约定好的默认值和目录机构、框架基础)
项目输出位置
首次运行mvn compile会看到奇怪的下载内容。。。。。。???
为了保证Maven顺利运行,会从远程仓库下载部分jar包到本地库, 本地库地址就是你本身配置的MAVEN_HOME/conf/settings.xml文件里面的内容
当你第一次运行 maven 的时候,它会从网上的 maven 库 (repository) 下载须要的程序, 存放在你电脑的本地库 (local repository) 中,因此这个时候你须要有 Internet 链接。
Maven 默认的本地库是 ~/.m2/repository/ ,
在 Windows 下是 %USER_HOME%.m2\repository\
9. 项目单元测试的编译:mvn test
10. 打包(生成target目录,编译、测试代码,生成测试报告,生成jar/war文件):mvn package
11. 发布项目提交到本地仓库:mvn install
12. Maven的生命周期
完整的项目构建过程一般包括清理、编译、测试、打包、集成测试、验证、部署等步骤,Maven从中抽取了一套完善的、易扩展的生命周期。Maven的生命周期是抽象的,其中的具体任务都交由插件来完成。
定位:C:\Users\~.m2\repository\org\apache\maven\plugins
2. 生命周期阶段与插件关系
Maven 的生命周期是抽象的,实际须要插件来完成任务。 这一过程是经过将插件的目标(goal)绑定到生命周期的具体阶段(phase)来完成的。 如:将 maven-compiler-plugin插件的compile目标绑定到default生命周期的compile阶段,完成项目的源代码编译
3. maven的内置插件
咱们在执行maven命令的时候 mvn clean compile package等, maven会经过本身内置插件帮咱们执行项目的清理/编译/打包工做, 这些也是经过maven的内置插件实现的
packageing:定义打包方式,默认jar包,若是是web项目是war包
本地库
1. ~/.m2/settings.xml/该文件里面的配置
2. 每一个用户只有一个本地仓库
远程库
1. 中央库:Maven默认的远程仓库,http://search.maven.org/
2. 私服库:是一种特殊的远程仓库,它是架设在局域网内的仓库(例如使用Sonatype Nexus搭建Maven私服 )
镜像库
1. 用来替代中央仓库,速度通常比中央仓库快
基本概念:
依赖关系列表(dependency list)是POM的重要部分,也就是咱们项目对jar包的管理
jar包去哪找?
http://mvnrepository.org/
http://search.maven.org/
http://maven.outofmemory.cn/
jar如何添?
示例以下:
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>4.2.5.RELEASE</version>
</dependency>
</dependencies>
依赖传递
最短路径:路径最近者优先(只会选择路径最短的一个,不会两个都下载,否则就是jar包冲突,
实际开发中,maven本身搞定,咱们只须要了解
)
最早申明:路径相同者POM文件里面的,第一声明者优先
依赖引用
说白了,就是须要maven2工程里面能够引入maven1工程,
1) maven1能够做为jar包发布到本地库
针对maven1的pom.xml运行 mvn install
2) 让maven2的pom.xml里面引用maven1,做为jar包填入。
引用maven1的jar包
<dependency>
<groupId>com.****.p2p</groupId>
<artifactId>maven1</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
依赖排除
引用工程之间有一样功能的jar包,也即jar包重复,如何破?
新建新工程maven2:
1. 依赖排除,去重复
<dependency>
<groupId>com.atguigu.crm</groupId>
<artifactId>maven1</artifactId>
<version>0.0.1-SNAPSHOT</version>
<exclusions><!-- 依赖排除 -->
<exclusion>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.1.2</version>
</dependency>
2. jar包重复状况
1 好比Maven02自引用了 <dependency> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> <version>1.1.2</version> </dependency> 2 Maven03又引用了Maven02+commons-logging-1.1.1.jar 3 问题:commons-logging1.1.2和commons-logging1.1.1会冲突
4 用到了那个?mavne03如何作出选择?咱们如何手工排除? 4.1 用到了1.1.1 4.2 依据是最短路径 4.3 假如不想用maven02工程的1.1.2,须要在引用包里面添加
依赖范围
maven在构建过程有3套classpath,咱们会根据配置依赖的范围依赖不一样的classpath:
compile:默认是compile,对 编译+测试+运行 都有效
provided:对编译和测试,运行的时候不须要加入(例如 jsp 依赖 searvlet api ,好比咱们在编译和测试的时候有效可是在运行的时候容器已经提供servletapi,若是加入会形成冲突)
runtime:只在测试和运行时 有效,比较典型的例子 jdbc api,只有在启动代码测试或者运行的时候才会启用
聚合模块为项目目录的最顶层,其余模块做为聚合模块子目录而存在。目的是为一次性批处理各个模块构建多个项目模块。
aggregation聚合,Modules快速构建
创建整体的聚合工程
聚合pom.xml (切记:<packaging>pom</packaging>)
统一执行聚合工程的pom.xml
生产真实项目maven构建介绍
pom继承是为了抽出重复配置,一般配置在父模块中,为子模块提供使用,这样能够作到“一处声明,到处使用”。
Parent继承,消除重复配置 创建整体的父类继承工程 继承pom.xml,父类定义+子类引用
前提是你的IntelliJ IDEA已经配置好maven了哦!
接下来,建立过程如图所示:
本文为博主原创文章,转载请注明出处!