maven学习总结

1.maven是什么

maven是一个项目管理工具,它包含了一个项目对象模型,一组标准集合,一个项目生命周期,一个依赖管理系统,和用来运行定义在生命周期阶段中插件目标的逻辑。这是apache maven给的一个比较正式的定义,可能一开始看不懂,没关系,下面我们用例子来说明

2.maven项目坐标

maven项目,简单来说就靠一个pom(project object model)文件。当maven运行的时候,它向pom文件查看关于这个项目的信息。pom包含这个项目的类型、名称、构建等信息。pom中的groupId、artifactId、version唯一定义了一个项目,如下代码所示

<groupId>com.tmall.jst</groupId>
<artifactId>jrp</artifactId>
<version>2.1.0-SNAPSHOT</version>
当运行mvn package时,默认的会将一个单模块的maven项目打包成一个jar包,那么groupId相当于一个父文件夹,jrp相当于一个单个项目的子文件夹,jrp作为一个项目子文件夹,可以有多个版本号,所有版本号都存放在jrp文件中,针对上面的代码,本地仓库的目录结构如下如所示。


在这里,插播一个小故事,讲述下为什么需要version这个坐标

先说说如果没有SNAPSHOT会是什么样子。假设你的项目有2个模块,A,B,其中A依赖B。这三个模块分别由甲,乙两个人负责开发。在开发过程中, 因为A是依赖于B的,因此乙每次做一个改动都会影响到甲,于是,乙提交了一些更改后,需要让甲看到。这个时候,怎么做呢?乙对甲说,“你签出我的代 码,build一下就OK了”,甲有点不情愿,但还是照做了,签出代码,svn clean install,然后,发现build出错了,有个测试没有pass。甲郁闷了,对乙说,“你的代码根本不能用,我不想build,你build好了给 我”,乙看了看确实自己的代码build不过,于是回去解决了,然后打了个jar包,扔给甲,甲对了对groupId,artifactId,放到了自己 的.m2/repository/目录下,OK,能用了。

于 是乙每次更新都这样做,打包,复制,然后甲粘贴,使用……渐渐的,大家发现这是个很笨的办法,这是纯手工劳动阿,程序员最BS的就是重复劳动。一天,甲对 乙说,“你知道nexus么?你把你的jar发布到nexus上就可以了,我要用就自动去下载,这多棒!”乙说“哦?有这好东西,我去看看”于是乙发现了 nexus这块新大陆,并成功的发布了B到nexus上。但是,请注意,我们这里的一切都假设没有SNAPSHOT,因此如果乙不更改版本,甲下载一次如B-1.0.jar之后,maven认为它已经有了正 确的B的版本,就不会再重新下载。甲发现了这个问题,对乙说“你的更新我看不到,你更新了么?”乙说“不可能!我看看”,于是检查一下甲下载的C- 1.0.jar,发现那是几天前的。乙一拍脑袋,说“这简单,我更新一下我的版本就好了,我发布个B-1.1.jar上去,你更新下依赖版本”,甲照做 了,似乎这么做是可行的。

这里有一个问题,一次提交就更新一个版本,这明显不是正确的管理办法,此外,乙得不停的通知甲更新对B的依赖版本,累不累阿?1.0,或者说1.1,2.0,都代表了稳定,这样随随便便的改版本,能稳定么?

所以Maven有SNAPSHOT版本的概念,它与release版本对应,后者是指1.0,1.1,2.0这样稳定的发布版本。

现 在乙可以将B的版本设置成1.0-SNAPSHOT,每次更改后,都mvn deploy到nexus中,每次deploy,maven都会将SNAPSHOT改成一个当前时间的timestamp,比如B-1.0- SNAPSHOT.jar到nexus中后,会成为这个样子:B-1.0-20081017-020325-13.jar。Maven在处理A中对于B的 SNAPSHOT依赖时,会根据这样的timestamp下载最新的jar,默认Maven每天 更新一次,如果你想让Maven强制更新,可以使用-U参数,如:mvn clean install -U 。

现在事情简化成了这个样子:乙做更改,然后mvn deploy,甲用最简单的maven命令就能得到最新的B。


3.多模块项目

一个多模块项目通过一个父pom引用一个或多个子模块来定义,我们来看一个多模块项目

跟父pom定义如下

<groupId>com.tmall.jst</groupId>
    <artifactId>jstplatform</artifactId>
    <version>2.0-SNAPSHOT</version>
    <packaging>pom</packaging>
    <name>jstplatform</name>

    <modules>
        <module>jstplatform-client</module>
        <module>jstplatform-common</module>
        <module>jstplatform-service</module>
        <module>jstplatform-web</module>
    </modules>

子模板定义如下(仅列举jstplatform-client)

<parent>
        <groupId>com.tmall.jst</groupId>
        <artifactId>jstplatform</artifactId>
        <version>2.0-SNAPSHOT</version>
    </parent>

    <groupId>com.tmall.jst</groupId>
    <artifactId>jstplatform-client</artifactId>
    <version>${jstplatform.client.version}</version>
    <name>jstplatform-client</name>

4.添加依赖

自己的模块中如果要用到别人的内容,要在pom文件中添加依赖,代码示例如下

<dependency>
                <groupId>com.tmall.jst</groupId>
                <artifactId>jrp-client</artifactId>
                <version>2.1.3</version>
 </dependency>
需要什么依赖就添加什么依赖,然后运行命令mvn eclipse:clean eclipse:eclipse,将jar包下载到本地仓库

5.简单说下开发人员使用maven的开发步骤

maven的生命周期及其他详细的说明,见另外一篇博客


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值