pandaAnthony:Maven学习

接触maven已经很久了,在清理电脑资料中发现以前写的一篇maven培训的文章,整理下发出来方便初学者了解下一些maven的基础(文中没提到的请参考官网)。

一、什么是Maven?

Maven是Apache下的开源项目http://maven.apache.org/
Maven有“内行”和“专家”的意思,也可以翻译成为“知识的积累”。
Apache Maven is a software project management and comprehension tool.
Based on the concept of a project object model (POM), Maven can manage a project's build, reporting and documentation from a central piece of information.
Maven是软件项目管理和理解的工具。
基于项目对象模型POM(Project-Object-Model),Maven开源通过一小段描述信息来管理项目构建,报告和文档。

二、为什么用Maven?

以前我们普通的java项目,当需要依赖包的时候需要从其官网上下载对应的依赖jar包,需要我们手动的导入到lib文件夹下。而用maven构建项目,我们只需要写上jar包的名字和版本信息,maven会自动去网站上下载我们需要的jar。执行代码的时候需要我们去编译、运行单元测试、生成文档、打包、部署,而maven工具为我们封装了这些重复的工作。

1. Maven让build过程简单

Maven有中心仓库https://repo.maven.apache.org/maven2 ,默认配置都会去中心仓库下载包;下载的包会存储到本地仓库。项目中一般会搭建私有仓库,用来管理项目中相关的包。
不需要去到处找jar,只需要添加依赖。可以通过http://mvnrepository.com/ 去找。
代码复用,可以将公共的代码或者其他人需要调用的jar抽离出来发布到私有Maven库上,其他人只需要关注需要用引入依赖,不需要关心依赖的jar。

2. Maven可以方便的发布版本

Maven提供了很方便的插件进行版本发布,通过简单的命令(mvn deploy)就能将工程发布到Maven仓库中。

3. 方便学习开源项目

github和码云上大多数的开源项目都会用到Maven,可以通过Maven命令直接运行。

三、Maven安装

首先要必须安装java,Maven3.3以上版本必须要jdk1.7以上版本。
在Maven官网下载页https://maven.apache.org/download.cgi 找到需要的安装包以及系统要求:

image.png

将安装包复制到需要安装Maven的机器上解压,然后设置环境变量M2_HOME,指向对应的Maven目录;然后将M2_HOME\bin加到path中。(这里就不详细描述怎么配置环境变量了,系统不一样配置方式不一样,linux记得source下让环境变量生效)。
在命令行执行

mvn -v

查看是否安装成功。


image.png

四、Maven配置

1.setting.xml 配置

在maven安装目录下进入conf文件夹,可以找到setting.xml文件。
详细介绍http://maven.apache.org/settings.html

image.png

一般我们需要修改的配置:
localRepository:本地存储artifacts路径,所有下载的包和本地安装的包都会放在这里。


image.png

servers:发布snapshot和release的server,和项目设置结合使用


image.png

对应的pom设置(这里配置的url是搭建好的maven私服地址):
image.png

mirrors:仓库镜像,通过镜像去获取包(地址是搭建好的maven私服地址)
image.png

profiles:我们这里是用来激活配置的maven镜像去下载maven2中心库的包(其中配置的地址是maven仓库的默认地址)


image.png

2. pom文件

pom是项目对象模型 (Project Object Model)的简称,当Maven运行的时候它向项目对象模型(POM)查看关于这个项目的信息。POM回答类似这样的问题:这个项目是什么类型的?这个项目的名称是什么?这个项目的构建有自定义么?
详细介绍可以查看http://maven.apache.org/pom.html

image.png

2.1 Maven坐标(Coordinates)

groupId, artifactId, version和packaging这些组合的标识符拼成了一个项目的坐标:
groupId :团体,公司,小组,组织,项目,或者其它团体。团体标识的约定是,它以创建这个项目的组织名称的逆向域名(reverse domain name)开头。来自Sonatype的项目有一个以com.sonatype开头的groupId,而Apache Software的项目有以 org.apache开头的groupId。
artifactId:在groupId下的表示一个单独项目的唯一标识符。
version:一个项目的特定版本。发布的项目有一个固定的版本标识来指向该项目的某一个特定的版本。而正在开发中的项目可以用一个特殊的标识,这种标识给版本加上 一个“SNAPSHOT”的标记。
packaging:项目的类型,默认是jar,描述了项目打包后的输出。类型为jar的项目产生一个 JAR文件,类型为war的项目产生一个web应用。
Maven仓库(repositories)(公共的,私有的,和本地的)是通过这些标识符来组织的。当一个项目被安装到本地的Maven仓库,它立刻能被任何其它的项目所使用。而我们所需要做的只是,在其它项目用使用Maven的唯一坐标来加入对这个特定 构件的依赖。

2.2 Maven依赖管理 (Dependency Management)

在<dependencies>标签中,根据maven坐标来定义:


image.png

这里发现与maven坐标不同的是多了scope。
Dependency scope 是用来限制Dependency的作用范围的, 影响maven项目在各个生命周期时导入的package的状态。
compile:默认的scope,表示 dependency 都可以在生命周期中使用。而且,这些dependencies 会传递到依赖的项目中。
provided:跟compile相似,但是表明了dependency 由JDK或者容器提供,例如Servlet AP和一些Java EE APIs。这个scope 只能作用在编译和测试时,同时没有传递性。使用这个时,不会将包打入本项目中,只是依赖过来。
runtime:表示dependency不作用在编译时,但会作用在运行和测试时
test:表示dependency作用在测试时,不作用在运行时。
system:跟provided 相似,但是在系统中要以外部JAR包的形式提供,maven不会在repository查找它。
我们项目中一般使用默认的compile和test范围。
一个复杂的项目将会包含很多依赖,也有可能包含依赖于其它构件的依赖。这是Maven 最强大的特征之一,它支持了传递性依赖(transitive dependencies)。假如你的项目依赖于一个库,而这个库又依赖于五个或者十个其它的库(就像Spring或者 Hibernate那样)。你不必找出所有这些依赖然后把它们写在你的pom.xml里,你只需 要加上你直接依赖的那些库,Maven会隐式的把这些库间接依赖的库也加入到你的项目 中。Maven也会处理这些依赖中的冲突,同时能让你自定义默认行为,或者排除一些特定的传递性依赖。


image.png

2.3 Maven构建(build)

根据需要添加插件构建项目:

image.png

具体的plugins可以参考官网http://maven.apache.org/plugins/index.html (除了Build plugins还有下面要介绍的Reporting plugins)
image.png

2.4 Maven报表(reporting)

Maven可以同过mvn site来生成文档和报告,生成doc文档需要额外引用插件:


image.png

五、Maven命令

在介绍什么是Maven的时候提到‘运行定义在生命周期阶段(phase)中插件(plugin)目标(goal)的逻辑’,Maven的命令是基于生命周期来执行的。

5.1 Maven生命周期

Maven有三套相互独立的生命周期,请注意这里说的是“三套”,而且“相互独立”,这三套生命周期分别是:
Clean Lifecycle 在进行真正的构建之前进行一些清理工作。
Default Lifecycle 构建的核心部分,编译,测试,打包,部署等等。
Site Lifecycle 生成项目报告,站点,发布站点。
最核心的是Default Lifecycle:

image.png

image.png

记住,运行任何一个阶段的时候,它前面的所有阶段都会被运行,这也就是为什么我们运行mvn install 的时候,代码会被编译,测试,打包。
官网详细介绍查看:http://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html

5.2 Maven常用命令

mvn test 运行应用程序中的单元测试
mvn clean 清除项目目录中的生成结果
mvn package 根据项目生成的指定格式的文件(jar,war。。。)
mvn install 在本地Repository中安装
mvn site 生成项目相关信息的网站 需要检查项目的doc注解是否合要求。
mvn deploy 发布项目到公司的maven库。 执行这个命令时需要有nexus账号,并且有权限发布。开发过程中只有在其他人需要用到你开发的包时需要做发布操作,需要确保发布到公司nexus上的包是经过测试的稳定的。
可以组合着用,比如最常用的组合:mvn clean install。

六、Maven repository管理工具

参考官网介绍http://maven.apache.org/repository-management.html

image.png

搭建私服一般会用Sonatype Nexus OSS

image.png

如果有兴趣自己在windows下搭建maven私服的可以参考windows下搭建maven私服

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,463评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,868评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,213评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,666评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,759评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,725评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,716评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,484评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,928评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,233评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,393评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,073评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,718评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,308评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,538评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,338评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,260评论 2 352