Maven,是基于项目对象模型(POM),可以通过一小段描述信息来管理项目的构建,报告和文档的软件项目管理工具。

  上面是百度百科对Maven的正式介绍,如果你是Maven初学者,我估计你看完之后心中肯定会有一万头姓草的动物奔腾而过,严重者甚至对Maven留下心理阴影。好吧,Maven到底是什么玩意?

  一、场景问题

  解释之前,提1个小问题:

  假如你正在Eclipse下开发两个Java项目,姑且把它们称为A、B,其中A项目中的一些功能依赖于B项目中的某些类,那么如何维系这种依赖关系的呢?

  在没有Maven时,需要用哪个项目中的哪些类,也就是用别人写好了的功能代码,导入jar包即可。所以这里也如此,可以将B项目打成jar包,然后在A项目的Library下导入B的jar文件,这样,A项目就可以调用B项目中的某些类了。

  但这样做有几个缺陷,一是如果在开发过程中,发现B中的bug,则必须将B项目修改好,并重新将B打包并对A项目进行重编译操作。二是如果在完成A项目的开发后,为了保证A的正常运行,就需要依赖B(就像在使用某个jar包时必须依赖另外一个jar一样),这时可以选择将B打包入A中,或者将B也发布出去,等别人需要用A时,告诉开发者,想要用A就必须在导入Bjar包。但是两个都很麻烦,前者可能造成资源的浪费(比如,开发者可能正在开发依赖B的其它项目,B已经存储到本地了,在导入A的jar包的话,就有了两个B的jar),后者是我们常遇到的,找各种jar包,非常麻烦。

  上面问题的描述,其实属于项目与项目之间依赖的问题[A项目使用SSH的所有jar,就说A项目依赖SSH],人为手动的去解决,很繁琐,也不方便,所以需要使用Maven来帮我们管理。

  二、Maven定义

  看了上面这个案例,我们知道了Maven的应用背景,那么回归到主题,Maven是什么?通俗点讲,Maven的核心功能便是合理叙述项目间的依赖关系,就是通过pom.xml文件的配置获取jar包,而不用手动去添加jar包,maven项目,就是在java项目和web项目的上面包裹了一层maven,本质上java项目还是java项目,web项目还是web项目,但是包裹了maven之后,就可以使用maven提供的一些功能了(通过pom.xml添加jar包)。

  进一步细化探究,怎么通过pom.xml的配置就可以获取到jar包呢?pom.xml配置文件从何而来? 如果用pom.xml文件,那么该项目需要为Maven项目,怎么来创建Maven项目?

  这时我们发现使用Maven,最终的目的就是学会如何创建maven项目,maven项目的结构是怎样,与普通java,web项目的区别在哪里,如何在pom.xml中配置获取到我们想要的jar包等等技术使用问题。

  二、仓库的概念

  通过pom.xml中的配置,就能够获取到想要的jar包(还没讲解如何配置先需要了解一下仓库的概念),但是这些jar是在哪里呢?就是我们从哪里获取到的这些jar包?答案就是仓库。仓库分为:本地仓库、第三方仓库(私服)、中央仓库。

  (一)本地仓库

  Maven会将工程中依赖的构件(Jar包)从远程下载到本机一个目录下管理,每个电脑默认的仓库是在 $user.home/.m2/repository下。如图:

  

  例如我的就在:C:\Users\Administrator.m2\repository,一般我们会修改本地仓库位置,自己创建一个文件夹,在从网上下载一个拥有相对完整的所有jar包的结合,都丢到本地仓库中,然后每次写项目,直接从本地仓库里拿就行了。修改本地库位置:$MAVEN_HOME/conf/setting.xml文件中修改,如图:

  

  D:\java\maven\repository:就是我们自己创建的本地仓库,将网上下载的所有jar包,都丢到该目录下,我们就可以直接通过maven的pom.xml文件直接拿。

  (二)第三方仓库

  第三方仓库,又称为内部中心仓库,也称为私服。私服一般是由公司自己设立的,只为本公司内部共享使用。它既可以作为公司内部构件协作和存档,也可作为公用类库镜像缓存,减少在外部访问和下载的频率。(使用私服为了减少对中央仓库的访问。私服可以使用的是局域网,中央仓库必须使用外网,也就是一般公司都会创建这种第三方仓库,保证项目开发时,项目所需用的jar都从该仓库中拿,每个人的版本就都一样。注意:连接私服,需要单独配置。如果没有配置私服,默认不使用

  (三)中央仓库

  Maven内置了远程公用仓库:http://repo1.maven.org/maven2,这个公共仓库是由Maven自己维护,里面有大量的常用类库,并包含了世界上大部分流行的开源项目构件。目前是以java为主,工程依赖的jar包如果本地仓库没有,默认从中央仓库下载。

  (四)小结

  获取jar包的过程:

  

  三、pom.xml的依赖关系讲解

  之前一直在使用pom.xml中找jar包最关键的三个属性,groupId、artifactId、version,如果你之前使用过Maven,对这个应该对这三个元素比较熟悉,也知道为什么通过这三个能找到对应的jar包,这一章节,就将依赖关系全面分析。

  (一)如何获取坐标(也就是三个关键属性值)

  方式1:使用网站搜索[从中央仓库拿]。

  步骤1:百度搜索关键字“maven repository”。

  

  步骤二:输入关键字查询获得需要内容,确定需要版本。

  

  步骤三:获得坐标。

  

  方式2:使用本地仓库,通过myeclipse获得坐标。

  上面已经介绍过了如何从本地仓库获取对应jar,这里在简单阐述一下:

  步骤一:添加依赖,pom.xml文件中,右键:

  

  步骤二:获得坐标。

  

  (二)依赖(坐标)的常见配置

  为了避免不知道说的哪些配置属性,看下面图就明白了,就是dependency下的属性配置,全部有9个,讲其中的7个。

  

  groupId、artifactId、version是依赖的基本坐标,缺一不可,限于篇幅,本文不对每个元素详细介绍,具体可以百度,关于配置的介绍文章非常多。

  (二)依赖调节原则

  这个就是maven解决传递依赖时jar包冲突问题的方法,按照两种原则,上面已经介绍了一种了,就是下面的第二原则。

  第一原则:路径近者优先原则:

  A–B–C–D–X(1.6)

  E–D–X(2.0)

  使用X(2.0),因为其路径更近

  第二原则:第一声明者优先原则。就是如果路径相同,maven 默认配置在前面的优先使用:

  A–B -- X(1.6)

  C–D– X(2.0)

  这样就是路径相同,那么如果A在前面,C在后面,则使用X(1.6),maven会先根据第一原则进行选择,第一原则不成,则按第二原则处理。

Maven到底是个啥玩意的更多相关文章

  1. maven(一) maven到底是个啥玩意~

    我记得在搞懂maven之前看了几次重复的maven的教学视频.不知道是自己悟性太低还是怎么滴,就是搞不清楚,现在弄清楚了,基本上入门了.写该篇博文,就是为了帮助那些和我一样对于maven迷迷糊糊的人. ...

  2. 转帖 maven(一) maven到底是个啥玩意~

    转载自:https://www.cnblogs.com/whgk/p/7112560.html 我记得在搞懂maven之前看了几次重复的maven的教学视频.不知道是自己悟性太低还是怎么滴,就是搞不清 ...

  3. 1.2.1 Maven到底是什么鬼

    解释之前,提1个小问题. 1.1.假如你正在Eclipse下开发两个Java项目,姑且把它们称为A.B,其中A项目中的一些功能依赖于B项目中的某些类,那么如何维系这种依赖关系的呢? 很简单,这不就是跟 ...

  4. maven(一) maven到底是什么

    为了方便自己查找,这里转载他人文章,原文出处http://www.cnblogs.com/whgk/p/7112560.html 我记得在搞懂maven之前看了几次重复的maven的教学视频.不知道是 ...

  5. doctrine2到底是个什么玩意

    之前和最近一个项目用到了Doctrine,由于是别人搭建的,自己没有很了解,最近又开始做的时候发现拙荆见肘,于是看了一下doctrine教程,本文就是加上自己理解的doctrine教程文档笔记了. D ...

  6. display:inline-block; 到底是个啥玩意?

    display:inline; 内联元素,简单来说就是在同一行显示.display:block; 块级元素,简单来说就是就是有换行,会换到第二行.display:inline-block; 就是在同一 ...

  7. IIS中“绑定”,“IP地址全部未分配”到底是个什么玩意

    最好是选择“全部未分配”,用这个选项时,服务器本机,在IE浏览器地址栏输入http://localhosts/ 或127.0.0.1 可以打开本机架设的网站的主页,也可以输入内网IP地址打开内网的网站 ...

  8. CSRF到底 是个什么玩意?

    CSRF CSRF(Cross-site request forgery)跨站请求伪造,也被称为"One Click Attack"或者Session Riding,通常缩写为CS ...

  9. Maven基本理解

    转 maven(一) maven到底是个啥玩意~ 我记得在搞懂maven之前看了几次重复的maven的教学视频.不知道是自己悟性太低还是怎么滴,就是搞不清楚,现在弄清楚了,基本上入门了.写该篇博文,就 ...

随机推荐

  1. 安装Vmware ESX Server5.5 ——hardware virtualization is not a feature of the cpu or is not enabled in the BIOS

    Error信息: hardware virtualization is not a feature of the cpu or is not enabled in the BIOS 解决方案: F2进 ...

  2. Storm 架构图

    画的丑,勉强看看吧 Nimbus我感觉他就像人的大脑一样! 当客户端给这个人发送了段信息 ,这个人的大脑就接收到这段信息,这个人不简单,是幕后大佬,一般不自己去干活,都是交给下面二当家去执行,当时这个 ...

  3. Python菜鸟之路:Django CMDB剖析

    CMDB需求分析 1. 采集资产 采集方式的配置(agent/salt/ssh三种方式) agent是在本地执行 salt和ssh则是在远端执行,首先通过API获取任务,然后去远端获取执行结果 插件的 ...

  4. LAMP兄弟连 视频教程集

    电驴的资源:http://www.verycd.com/topics/2843130/?ref=msg

  5. mysql数据库表插入单条数据/批量插入数据

    1.创建表格 reate table trade( id int(4) not null primary key auto_increment, product varchar(30) null, p ...

  6. cocos2d-x 3.0游戏实例学习笔记《卡牌塔防》第三步---编辑器(2)---更方便很多其它操作更像编辑器

    /* 说明: **1.本次游戏实例是<cocos2d-x游戏开发之旅>上的最后一个游戏,这里用3.0重写并做下笔记 **2.我也问过木头本人啦.他说:随便写,第一别全然照搬代码:第二能够说 ...

  7. Android开发之事件和事件监听器

    写了一个打飞机的小程序,用于作为事件监听的学习,此程序须要有实体按键的手机才干运行. PlaneView.java: public class PlaneView extends View{ publ ...

  8. C#设置当前程序通过IE代理服务器上网

    注意:以下设置只在当前程序中有效,对IE浏览器无效,且关闭程序后,自动释放代码. using System; using System.Collections.Generic; using Syste ...

  9. 关于shared pool的深入探讨(一) 【转载】

    关于shared pool的深入探讨(一)   作者:eygle |English [转载时请标明出处和作者信息]|[恩墨学院 OCM培训传DBA成功之道]链接:http://www.eygle.co ...

  10. 浅谈WebService SOAP、Restful、HTTP(post/get)请求

    http://www.itnose.net/detail/6189456.html 浅谈WebService SOAP.Restful.HTTP(post/get)请求 2015-01-09 19:2 ...