此文来源于: https://www.cnblogs.com/hafiz/p/8119964.html

带你深度解析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的更多相关文章

  1. 带你深度解析Maven

    一.What`s Maven? Maven是基于项目对象模型(POM project object model),可以通过一小段描述信息(配置)来管理项目的构建,报告和文档的软件项目管理工具,简单的说 ...

  2. mybatis 3.x源码深度解析与最佳实践(最完整原创)

    mybatis 3.x源码深度解析与最佳实践 1 环境准备 1.1 mybatis介绍以及框架源码的学习目标 1.2 本系列源码解析的方式 1.3 环境搭建 1.4 从Hello World开始 2 ...

  3. [WebKit内核] JavaScript引擎深度解析--基础篇(一)字节码生成及语法树的构建详情分析

    [WebKit内核] JavaScript引擎深度解析--基础篇(一)字节码生成及语法树的构建详情分析 标签: webkit内核JavaScriptCore 2015-03-26 23:26 2285 ...

  4. 第37课 深度解析QMap与QHash

    1. QMap深度解析 (1)QMap是一个以升序键顺序存储键值对的数据结构 ①QMap原型为 class QMap<K, T>模板 ②QMap中的键值对根据Key进行了排序 ③QMap中 ...

  5. Deep Learning模型之:CNN卷积神经网络(一)深度解析CNN

    http://m.blog.csdn.net/blog/wu010555688/24487301 本文整理了网上几位大牛的博客,详细地讲解了CNN的基础结构与核心思想,欢迎交流. [1]Deep le ...

  6. (转载)(收藏)OceanBase深度解析

    一.OceanBase不需要高可靠服务器和高端存储 OceanBase是关系型数据库,包含内核+OceanBase云平台(OCP).与传统关系型数据库相比,最大的不同点, 是OceanBase是分布式 ...

  7. Kafka深度解析

    本文转发自Jason’s Blog,原文链接 http://www.jasongj.com/2015/01/02/Kafka深度解析 背景介绍 Kafka简介 Kafka是一种分布式的,基于发布/订阅 ...

  8. java内存分配和String类型的深度解析

    [尊重原创文章出自:http://my.oschina.net/xiaohui249/blog/170013] 摘要 从整体上介绍java内存的概念.构成以及分配机制,在此基础上深度解析java中的S ...

  9. Unity加载模块深度解析(Shader)

    作者:张鑫链接:https://zhuanlan.zhihu.com/p/21949663来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 接上一篇 加载模块深度解析(二 ...

随机推荐

  1. Android Studio 中出现APK error

    可能有很多人在用Android Studio编写程序时,时不时的会出现一个APK error的错误,反正我自从开始用Android Studio后,这个错误真的是时不时的蹦跶出来 最开始的时候,我是去 ...

  2. 利用jquery 实现菜单控制对应视图的显示与隐藏

    效果: <!DOCTYPE html> <html lang="en" dir="ltr"> <head> <meta ...

  3. QT:圆角设置

    Qt在设置窗口边框圆角时有两种方式,一种是设置样式,另一种是在paintEvent事件中绘制窗口.下面分别叙述用这两种方式来实现窗口边框圆角的效果. 一.使用setStyleSheet方法 this- ...

  4. Python内置类属性

    __dict__ : 类的属性(包含一个字典,由类的数据属性组成) __doc__ :类的文档字符串 __name__: 类名 __module__: 类定义所在的模块(类的全名是'__main__. ...

  5. getch和getchar的区别

    造冰箱的大熊猫@cnblogs 2018/11/30 1.getc() 头文件:stdio.h 函数声明:int getc ( FILE * stream ); 功能: - 返回流(stream)当前 ...

  6. 如何制作自己的R包

    如何制作自己的R包? 摘自 方匡南 等编著<R数据分析-方法与案例详解>.电子工业出版社 R包简介 R包提供了一个加载所需代码.数据和文件的集合.R软件自身就包含大约30种不同功能的包,这 ...

  7. Pollard-rho算法[因子分解算法]

    试除法:最简单的因数分解算法,从$ 2 $到$ \sqrt n $一个一个试. 试除法(改进):从$ 2 $到$ \sqrt n $挑素数一个一个试. 然而这样复杂度是相当高的. 生日悖论:指如果一个 ...

  8. [BZOJ3611][Heoi2014]大工程(虚树上DP)

    3611: [Heoi2014]大工程 Time Limit: 60 Sec  Memory Limit: 512 MBSubmit: 2464  Solved: 1104[Submit][Statu ...

  9. hibernate 一对多单向注解配置(实现级联操作 )

    学生表关联学生的课程表(一对多) 学生表实体类: @Entity @Table(name = "JXD_COM_STUDENT") public class StudentMode ...

  10. LeetCode 56. 合并区间(Merge Intervals)

    题目描述 给出一个区间的集合,请合并所有重叠的区间. 示例 1: 输入: [[1,3],[2,6],[8,10],[15,18]] 输出: [[1,6],[8,10],[15,18]] 解释: 区间 ...