带你深度解析Maven
一、What`s Maven?
Maven是基于项目对象模型(POM project object model),可以通过一小段描述信息(配置)来管理项目的构建,报告和文档的软件项目管理工具,简单的说就是用来管理项目所需要的依赖且管理项目构建的工具。
二、Maven的优势
1. 约定优于配置
2. 简单
3. 测试支持
4. 构建简单
5. CI集成
6. 插件丰富
三、Maven的安装、配置
1. 在官网下载安装包:http://maven.apache.org/download.cgi
2. 解压缩压缩包
3. 配置环境变量MAVEN_HOME=maven的解压后的目录
4. 在变量Path的开头增加"%MAVEN_HOME%\bin;"
5. 在MAVEN_HOME/conf/setting.xml文件中通过<localRepository></localRepository>标签配置本地仓库的位置
注 :超级pom.xml的位置:MAVEN_HOME/lib/maven-model-build-3.3.9.jar/org/apache/maven/model/pom-4.0.0.xml
四、Maven的使用
1. 输出本地安装的maven的相关信息
mvn -version
2. 在IDEA中配置使用本地安装的maven
打开: File-->Settings, 然后按照下图操作
3. 控制台使用maven命令,配置文件加载顺序
1) ~/.m2/setting.xml
2) MAVEN_HOME/conf/setting.xml
五、配置Maven镜像加快依赖下载速度
<mirrors>
<mirror>
<id>aliyun_cental</id>
<name>aliyun_cental</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
<mirror>
<id>uk</id>
<mirrorOf>central</mirrorOf>
<name>Human Readable Name for this Mirror.</name>
<url>http://uk.maven.org/maven2</url>
</mirror>
<mirror>
<id>osc</id>
<name>Human Readable Name for this Mirror</name>
<url>http://maven.oschina.net:/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
<mirror>
<id>osc_thirdparty</id>
<mirrorOf>thirdparty</mirrorOf>
<url>http://maven.oschina.net/content/repositories/thirdparty/</url>
</mirror>
</mirrors>
具体请移步另一篇博客:只用一招,让你Maven依赖下载速度快如闪电
六、认识Maven的结构
1. maven项目结构
src/main/java : 项目java类文件位置
src/main/resources : 项目配置资源文件位置
src/test/java : 项目单元测试java类文件位置
src/test/resources : 项目单元测试配置资源文件位置
target : 项目打包后文件所在位置
2. setting.xml元素解读: https://www.cnblogs.com/yangxia-test/p/4409736.html
3. pom.xml元素解读: http://www.cnblogs.com/hafiz/p/5360195.html
七、Maven的坐标、依赖
1. 坐标:maven通过groupId、artifactId、version三个变量来唯一确定一个具体的依赖(俗称GAV)
2. 依赖:在pom.xml中我们通过dependency来声明坐标信息(GAV)如:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>4.2.6.RELEASE</version>
</dependency>
这样我们就在项目中依赖了4.2.6.RELEASE版本的spring-core jar包.
注 :pom.xml中packaging用来指定打包方式,默认为:jar
3. dependencyManagementy
1) 只能出现在父pom里
2) 统一版本号
3) 只是依赖声明,并不直接依赖,需要时在子项目中在声明要使用依赖的GA信息,V信息可以省略.
4. 依赖scope
1) compile:编译依赖范围,在编译,测试,运行时都需要,依赖范围默认值
2) test:测试依赖范围,测试时需要。编译和运行不需要,如junit
3) provided:已提供依赖范围,编译和测试时需要。运行时不需要,如servlet-api
4) runtime:运行时依赖范围,测试和运行时需要。编译不需要,例如面向接口编程,JDBC驱动实现jar
5) system:系统依赖范围。本地依赖,不在maven中央仓库,结合systemPath标签使用
5. 依赖传递时仲裁原则
1) 路径最短原则
2) 路径一样长,加载先后原则
注 : 第一列表示直接依赖的scope,第一行表示间接依赖的scope
6. 依赖排除
使用<exclusions>标签下的<exclusion>标签指定GA信息来排除,例如:排除xxx.jar传递依赖过来的yyy.jar
<dependency>
<groupId>com.xxx</groupId>
<artifactId>xxx</artifactId>
<version>x.version</version>
<exclusions>
<exclusion>
<groupId>com.xxx</groupId>
<artifactId>yyy</artifactId>
</exclusion>
</exclusions>
</dependency>
7. 依赖关系查看
进入工程根目录,在cmd中运行
1) mvn dependency:tree
命令会列出依赖关系树及各级依赖关系
2) mvn dependency:analyze
分析依赖关系
八、版本管理
尽量使用语义化版本,方便团队协作,后面我们专门写一篇文章来说语义化版本。
Maven中的版本号中带SNAPSHOT和不带的区别以及作用请移步:Maven版本号中隐藏的惊天大秘密
九、生命周期、插件
1. 生命周期
A build lifecycle is made up of phases.
A build phases is made up of plugin goals.
1) clean(按顺序分别包括:pre-clean 、clean 、post-clean)
2) default(compile、package、install、deploy ...)
3) site(又包括:pre-site、site、post-site、site-deploy)
2. 插件
请移步另一篇文章:
十、自定义手写Maven的项目骨架
请移步另外一篇文章:手写Maven的archetype项目脚手架
十一、总结
通过本文,我们就对maven有了一个直观深入的了解和学习,通过maven我们可以进行自己的定制和开发。这是工程化的第一步,我们继续加油,下一步解析Git和Jenkins.
带你深度解析Maven的更多相关文章
- 深度解析Maven
此文来源于: https://www.cnblogs.com/hafiz/p/8119964.html 带你深度解析Maven 一.What`s Maven? Maven是基于项目对象模型(POM ...
- 大白话5分钟带你走进人工智能-第四节最大似然推导mse损失函数(深度解析最小二乘来源)(2)
第四节 最大似然推导mse损失函数(深度解析最小二乘来源)(2) 上一节我们说了极大似然的思想以及似然函数的意义,了解了要使模型最好的参数值就要使似然函数最大,同时损失函数(最小二乘)最小,留下了一 ...
- 大白话5分钟带你走进人工智能-第三节最大似然推导mse损失函数(深度解析最小二乘来源)(1)
第三节最大似然推导mse损失函数(深度解析最小二乘来源) 在第二节中,我们介绍了高斯分布的 ...
- mybatis 3.x源码深度解析与最佳实践(最完整原创)
mybatis 3.x源码深度解析与最佳实践 1 环境准备 1.1 mybatis介绍以及框架源码的学习目标 1.2 本系列源码解析的方式 1.3 环境搭建 1.4 从Hello World开始 2 ...
- 第37课 深度解析QMap与QHash
1. QMap深度解析 (1)QMap是一个以升序键顺序存储键值对的数据结构 ①QMap原型为 class QMap<K, T>模板 ②QMap中的键值对根据Key进行了排序 ③QMap中 ...
- (转载)(收藏)OceanBase深度解析
一.OceanBase不需要高可靠服务器和高端存储 OceanBase是关系型数据库,包含内核+OceanBase云平台(OCP).与传统关系型数据库相比,最大的不同点, 是OceanBase是分布式 ...
- java内存分配和String类型的深度解析
[尊重原创文章出自:http://my.oschina.net/xiaohui249/blog/170013] 摘要 从整体上介绍java内存的概念.构成以及分配机制,在此基础上深度解析java中的S ...
- SpringMVC 源码深度解析<context:component-scan>(扫描和注冊的注解Bean)
我们在SpringMVC开发项目中,有的用注解和XML配置Bean,这两种都各有自己的优势,数据源配置比較经经常使用XML配置.控制层依赖的service比較经经常使用注解等(在部署时比較不会改变的) ...
- 汇顶指纹传感器GF919深度解析
前言: 随着指纹识别技术的日益普遍,其在手机上的应用也得到了广泛关注.作为全球第一款Android正面按压指纹识别手机,魅族MX4 Pro所搭载的国产指纹识别系统可谓是赚足了眼球,这就是由汇顶科技提供 ...
随机推荐
- C#获得时间段
DateTime today = dt.Date;//今天 00:00:00 DateTime tomorrow = dt.Date.AddDays(1);//明天 00:00:00 DateTime ...
- .net core 在视图中快速获取路由(Areas、Controller、Action)
我们在.net core中,经常碰到需要获取当前的Areas.Controller.Action,于是小编就扩展了Html,这样即可使用 Html.***来获取这些信息. 具体扩展类如下: publi ...
- [转载] HDFS简介
转载自http://www.csdn.net/article/2010-11-26/282582 http://subject.csdn.net/hadoop/ 一.HDFS的基本概念 1.1.数据块 ...
- [转载] Java NIO教程
转载自并发编程网 – ifeve.com http://ifeve.com/java-nio-all/ 关于通道(Channels).缓冲区(Buffers).选择器(Selectors)的故事. 从 ...
- opengl启动过程
GLuint _program = glCreateProgram(); //create shader program GLuint vertShader, fragShader;//顶点着色器,片 ...
- RAC(ReactiveCocoa)使用方法(二)
RAC(ReactiveCocoa)使用方法(一) RAC(ReactiveCocoa)使用方法(二) 上篇文章:RAC(ReactiveCocoa)使用方法(一) 中主要介绍了一些RAC中常见类的用 ...
- cardview和Palette,ActionBar颜色随图改变
CardView是一个控件,Palette是取色工具(工具类),本文会对他们进行比较细致的介绍,相信机制的各位看完一定轻而易举地实现ActionBar随图改变的特效. 首先看一下效果图: Gradle ...
- js学习笔记<拷贝传值,引用传址和匿名函数>
拷贝传值:把一个变量的值拷贝一份,传给了另外一个变量拷贝传值中,两个变量之间没有任何联系,修改其中一个一个变量的值,原来的变量不变. 例: var arr1 = ["张三",24, ...
- C#开发Windows窗体应用程序的步骤
使用C#开发应用程序时,一般包括创建项目.界面设计.设置属性.编写程序代码.保存项目.程序运行等6个步骤. 1.创建项目 在Visual Studio2017开发环境中选择“文件”→“新建”→“项目” ...
- 使用JSCH框架通过跳转机访问其他节点
之前搞了套远程访问ssh进行操作的代码,最近有需求,需要通过一台跳转机才能访问目标服务.在网上搜了半天,也没找到比较好的例子,就自己翻阅了下JSCH的API.但是看的云里雾里的.联想了下,端口转发的原 ...