初识Maven及入门

最近用到了Maven,就开始看看文档,网上找找资料,看了些视频。现在整理一下,仅供参考。


0x00    关于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的介绍。经过几天的折腾,我觉得Maven是一个开源的项目构建、管理工具,能够让团队更加高效的合作开发项目。其核心是pom文件,拥有一系列强大的插件和一个中央仓库。

古人说的好:纸上得来终觉浅,绝知此事要躬行。至于Maven是干什么用的,怎么用,我们下载一个,安装好,用用就知道了。或许你能够对Maven理解的更进一步。


0x01    安装Maven

接下来说一下,在windows环境下,如何安装Maven。选用的Maven版本是apache-maven-3.3.9。

-安装JDK

-设置Java环境变量

-设置Maven环境变量


*安装JDK

这个就没什么好说了。=_=


*设置Java环境变量

Control Panel -> System and Security -> System -> Advanced system settings -> Enviroment Variables

系统变量下    { 注:【】只是为了强调说明 }

新建CLASSPATH

值为【.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;】

新建JAVA_HOME 

值为【C:\Program Files\Java\jdk1.8.0_91】{备注:JDK的安装目录}

PATH后添加【%JAVA_HOME%\bin;】


*设置Maven环境变量

下载Maven并解压

系统变量下    { 注:【】只是为了强调说明 }

新建MAVEN_HOME -> 值为【D:\Program Files\apache-maven-3.3.9】{备注:Maven所在目录}

PATH后添加【%MAVEN_HOME%\bin;】

在命令行窗口中,使用mvn -v来查看一下maven的版本信息,如下图所示:

mvn -v

说明maven已经安装配置好了。

接下来说一下Maven的核心:pom文件。


0x02    pom.xml

就像Make的makefile一样,Maven项目的核心是pom.xml。POM(Project Object Model,项目对象模型),定义了项目的基本信息,用于描述项目如何构建,声明项目依赖,等等。

在Eclipse中新建一个Maven Project,生成的pom.xml文件如下:

pom.xml

其中groupId,artifactId,version是最重要的,这三个元素定义了一个项目基本的坐标。在Maven的世界,任何的jar,pom或者war都是以基于这些基本的坐标进行区分的。

*groupId  -- 定义了项目属于哪个组,这个组往往和项目所在的组织或公司存在关联。比如说,你在github上建立了一个名为myapp的项目,那么groupId就应该是com.github.myapp,如果你的公司是athrob,有一个项目为cloud,那么groupId就应该是com.athrob.cloud。

*artifactId  -- 定义了当前maven项目在组中唯一的ID。一般使用"项目名-模块名"来命名。

*version  -- 指定了当前maven项目的版本。SNAPSHOT意为快照,说明该项目还处于开发中,是不稳定的版本。随着项目的发展,version会不断更新,如,升级成1.0,2.0-SNAPSHOT,2.0等。{ 注:一般第一个0表示大版本号,第二个0表示分支版本号,第三个0表示小版本号,例:0.0.1,snapshot, -- 快照;alpha, -- 内部测试;beta, -- 公测;release, -- 稳定版GA(General Availability) -- 正式发布的版本 }

其他标签:

*name  -- 项目描述名,声明了一个对于用户更为友好的项目名称。虽然这不是必须的,但是推荐为每个pom声明name,以方便信息交流。

*package  -- 默认是jar

*description  -- 项目描述

*dependency,exclusions,build,plugin,parent,module等见下图所示:

dependency,exclusions,build,plugin,parent,module

关于依赖,后面我们会具体说一下依赖依赖的冲突。以及maven的聚合继承


0x03  Maven生命周期(clean,default,site)

clean -- 清理项目

default -- 构件项目

site -- 生成项目站点


*clean: 三个阶段

pre-clean -- 执行清理前的工作

clean -- 清理上一次构建生成的所有文件

post-clean -- 执行清理后的文件


*default: (最核心)

主要有这几个阶段:compile,test,package,install


*site:

pre-site -- 在生成项目站点前要完成的工作

site -- 生成项目的站点文档

post-site -- 在生成项目站点后要完成的工作

site-deploy -- 发布生成的站点到服务器上


0x04  Maven仓库

有本地仓库,远程仓库,镜像仓库。

接下来说一下如何修改他们。


本地仓库默认是在~/.m2目录下。{ ~ 表示用户所在的家目录,例:C:\Users\admin\.m2 }

修改maven的conf目录下的settings.xml文件,使用localRepository标签,添加本地仓库的目录,如下图:

local_repo

这样,我们就把Maven的本地仓库设置为:D:/maven_repo

然后复制settings.xml文件到我们设置的本地仓库目录下。


远程仓库可以理解为Maven的中央仓库:https://repo.maven.apache.org/maven2

通过打开lib目录下的maven-model-builder-3.3.9.jar包,依次进入org\apache\maven\model,查看pom-4.0.0.xml文件,就可以看到中央仓库的url了。


镜像仓库:

依然是刚才提到的settings.xml,修改其中mirrors,mirror标签里的内容,就可以修改maven的镜像仓库,这里我修改为OSChina的,如下图:

OSChina mirror

0x05  关于Maven项目

*Maven项目主代码和测试代码:

默认情况下,项目主代码位于src/main/java目录,测试代码位于src/test/java目录。


*自动创建符合maven规范目录的两种方式:

mvn archetype:generate     [注:按照提示进行选择]

mvn archetype:generate -DgroupId=组织名、公司网址的反写 + 项目名 -DartifactId=项目名-模块名 -Dversion=版本 -Dpackage=代码所在的包名


*常用的maven命令:

mvn -v   --  查看maven版本

mvn compile   --  编译

mvn test   --  测试

mvn package   --  打包

mvn clean   --  删除target

mvn install   --  安装jar包到本地仓库中

也可以组合起来用,如:mvn clean package

好,接下来,说一说maven中另外一个比较重要的概念:依赖


0x06  依赖

前面也提到过,在pom.xml文件中使用dependencies和dependency标签,来声明依赖。

首先说一下依赖的范围:(使用scope标签声明依赖的范围)

compile -- 默认的范围,编译测试运行都有效

provided -- 在编译和测试时有效

runtime -- 在测试和运行时有效 

test -- 只在测试时有效

system -- 与本机系统相关联,移植性差

import -- 导入的范围,它只使用在dependencyManagement中,表示从其他的pom中导入dependency的配置


接下来用具体的例子来说明依赖,依赖的传递以及排除依赖传递,如下图所示:

A,B,C分别为三个maven项目。

B依赖A
C也依赖了A

使用exclusions,exclusion标签来声明排除依赖传递

C依赖B,不依赖A

接下来,说一下关于依赖的冲突。(即声明了相同的构件,不同的版本)

两条原则:

1.短路优先

A -> B -> C -> X(jar)

A -> D -> X(jar)

会优先解析路径短的版本

2.先声明,先优先

如果路径长度相同,则谁先声明,先解析谁


依然以图示例,这样会更好理解一些,如下图所示:

A,B,C为三个Maven项目

1. 短路优先

A-commons-io-2.4
B-commons-io-2.0
C-commons-io-2.0

2. 先声明,先优先

C-A-commons-io-2.4
C-B-commmons-io-2.0

0x07  聚合和继承

*聚合

我对聚合的理解就是一个maven项目能够直接对其他所有模块项目进行管理和构建。

如下图所示:

A,B,C为三个maven模块项目,新建一个all项目,通过modules,module标签声明聚合。

build-all-juhe

通过对all这个项目的maven build...就实现对其他三个项目的构建。查看控制台信息,如下:

A-B-C-build-success

这样就不用对每个模块逐个进行构建。可以看到A,B,C均构建成功。

build-A-jar
build-B-jar
build-C-jar

*继承

跟java中继承的概念很相似,还是以图示例,见下图:

可以看到,A没有依赖,parent依赖junit-3.8.1.jar。

A-no-yilai

在A的pom.xml中使用parent标签表现来声明继承parent,如下图:

A-jicheng-parent

可以看到,此时A就继承了parent对junit-3.8.1.jar的依赖。


0x08  使用Eclipse新建一个Maven Project之webapp

首先要安装m2eclipse插件:

在Eclipse IDE中,Help -> Install New Software... -> Add

Name: m2e

Location: http://m2eclipse.sonatype.org/sites/m2e

注:不要使用IDE内嵌的MAVEN插件

Windows -> Perferences -> Maven -> Installations  【取消使用IDE内嵌的Maven插件,选择Add添加Maven的安装目录】

然后更改Maven的User Settings。这里选择本地仓库的settings.xml文件。

maven-user-settings

然后我们开始新建一个Maven Project

new-other
new-maven-project
use-default-workspace

Select an Archetype这一步,选择webapp

select-an-archetype

填写groupId,artifactId,version,package等信息。

specify-archetype-param

等个一两分钟,项目就创建好了,但是会报一个jsp error的错误。这是因为,缺少了一个类。

jsp-error

解决办法如下图,添加Java Servlet API的依赖就好了:

jsp-error-solution

此时,就OK了。剩下的可以自由发挥了。


0x09  其他

上面我们创建好的Maven Project,发现没有src/main/java和src/test/java文件夹,只有一个src/main/resource文件夹。

我们更改一下项目的JRE System Library就好了。

add-JRE-System-Library
workspace default JRE
add JRE System Library
remove JRE1.5
main test folder appear

可以看到,此时就有src/main/java和src/test/java两个文件夹了。


使用jetty插件

jetty-plugin
run as maven build...
jetty-run
started-jetty-server

访问http://localhost:8080

localhost-8080

使用tomcat插件

tomcat-plugin

上面这里部署了在package阶段运行。

tomcat-clean-package
tomcat-run

访问http://localhost:8080/webdemo

localhost-8080-webdemo

完!


不足之处,请批评指正。

如有问题,请私信联系。

谢谢!

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

推荐阅读更多精彩内容