为什么我要对后生说你要懂Maven呢
序言
据说半夜喝咖啡敲出来的代码,有一种淡淡的咖啡味道;那半夜写出来的总结,是不是也会有一种夜晚的宁静呢!今晚夜深人静,就给后生们总结总结Maven吧!毕竟,今天搞J2E的工程师如果不会或不知道Maven,那就在圈子里尴尬了。Maven是一个采用纯Java编写的开源项目管理工具。Maven采用了一种被称之为project object model (POM)概念来管理项目,所有的项目配置信息都被定义在一个叫做POM.xml的文件中,通过该文件,Maven可以管理项目的整个声明周期,包括编译,构建,测试,发布,报告等等。目前Apache下绝大多数项目都已经采用Maven进行管理。而Maven本身还支持多种插件,可以方便更灵活的控制项目。
一句话:Maven是一个项目管理和构建工具,主要做编译、测试、报告、打包、部署等操作完成项目的构建。
基础概述
Maven能干嘛呢?
1.项目自动化编译部署:
2.项目jar包的依赖管理:
3.企业开发分包分模块部署:
怎样下载、安装、配置
首先,肯定是官网看看(https://maven.apache.org)喽!
2. 将下载好的maven(压缩版的)进行解压/并拷贝自己的开发目录
3. 设置系统环境变量
设置Maven_HOME(例如:D:\dev\maven3.3.9)
设置PATH(例如:%MAVEN_HOME%\bin)
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的生命周期是抽象的,其中的具体任务都交由插件来完成。
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,父类定义+子类引用
用IDEA建立Maven Web工程
前提是你的IntelliJ IDEA已经配置好maven了哦!
接下来,创建过程如图所示:
本文为博主原创文章,转载请注明出处!
http://www.cnblogs.com/libingbin/
感谢您的阅读。