都说maven很好很强大,我就在想为什么呢?今天不妨认识一下她。
maven本身的意思是“专家”,大概是告诉人们我很牛。哈哈。我们先看看这个专家的想法:
Philosophy, 哲学
一提到maven,你准想到ant,老想和这个build元老级工具比一比谁牛。可以maven却不想和ant比肩。他的目标更远大。ant确实是一个很强大的build工具箱,而maven不想成为第二个。他的想法是想基于模式来建立一个基础架构,这个架构具有可视性,可重用性,可维护性,易于理解等特性。
这些“性”似乎是我们开发和项目管理中希望做到有很难做到的。停下来,让大脑想一会,你在项目开发中遇到了什么问题:
每天都在coding,不知道别人在干什么?
写了半天的代码,偶尔见听到别人以前写过?晕倒
只知道要实现这个接口,不了解整个项目的构成,和构建过程?迷糊
勤快的人时不时去看看别人的代码,也常常因为太复杂,不知道从何入手?
一个项目完成了,要开启一个新的项目,发现这个新的项目除了业务不同外,底层技术和构架,以及构建过程都大部分相似。怎么办?copy过来修改?试过没有?你可能会半途而废。尤其当不是你开发的项目,看懂别人的,没门。大部分都是把lib copy过去,管他有没有用。多了比少了强。再吧ant的build.xml复制过去改一下,大功告成。似乎项目的壳子准备好了,谁然办法土了点,也还凑合。总想应该还有更好的办法。。。
回顾过去做过的项目,是不是总是重复着built, tested, packaged, documented and deployed这些过程,当然,这都是pm不可少的。这些过程在不同的项目中会有不同。Maven说能从变中抽出不变,模式pattern, 让项目组的人都能透过pattern来清晰的认识项目。如果你是pm,有没有在开始的时候觉得创建这样一个空项目感到繁琐,有没有一遍又一遍的给你的team mem说我们的目录要这样建立。如果你的是一个新手,是不是不知道什么是项目,项目中有哪些东西,怎么建目录结构。干脆去baidu helloworld,你会发现五花八门,绝对让你更迷糊。多想有个大拿在旁边指点一下啊。另外,弄了半天,却不知道怎么运行,失败,不搞了。哈哈,有了maven,就如同一个大拿帮你开个好头。有了maven,pm,就像有了秘书,“嗨,小马,准备一个空项目,我们要开工了”,呵呵,不是所有人都有秘书哦。
什么?maven能帮我们?看来有戏。亮出你的法宝:
法宝1. Archetype 原型
字面意思就看出是一种模板技术,模板里面透着模式哦。看来不是吹的。
利用Archetype,maven能快速帮你生成一个基本的项目,统一的目录结构,基本的配置文件,为什么这样建立目录,这就是总结前人的经验了。这就是项目目录模式吧。安装好maven以后,执行下面的命令就能创建一个基本的项目:
- mvn archetype:create \
- -DarchetypeGroupId=org.apache.maven.archetypes \
- -DgroupId=com.mycompany.app \
- -DartifactId=my-app
这个命令会帮你在执行命令的当前目录生成一个java的Hello World项目。同时还有一个pom.xml,我们后面会谈。另外你会发现他帮你生成了一个基本的目录结构来存放java app代码和test代码。
所谓万事开头难。但,Archetype使得new user有个很容易的开始。另外,Archetype 还体现了maven支持附加物似地扩充项目的内容。比如,一开始可以用generate产生一个working project,之后可以利用site archetype 来为这个project 添加 一个site。将这个想法延伸一下,如果你想在一个大一些的范围比如公司范围内推行一种项目结构标准。那你就可以自己开发一个模板也就是Archetype,然后把它放在一个集中的repository,以后大家在创建项目的时候直接基于这个Archetype来创建。这样既推行了标准化,有体现了重用性。
其实mvn archetype:create这个命令是被deprecated了,现在推荐你用mvn archetype:generate。这是一个交互式的插件,maven会列出一些原型让你基于他们构建你的项目,默认是基本的java project,也有一些struts2,spring的样例项目让你选择,很爽的。
选择完以后,你会得到一个项目目录,就是create差不多。但是如果你要是想在eclipse里面开发,你还可以生成eclipse项目文件,只需要在刚才生成的项目根目录,也就是pom所在的目录执行下面的命令:
- mvn eclipse:eclipse
然后你就可以将这个项目导入eclipse里面开发了。爽吧。
法宝2. POM 项目对象模型
既然是项目管理工具,自然是以项目为中心的。pom提供了一个项目的所有相关信息和配置细节。这样,通过一个pom.xml,你就能全面的了解这个项目的各个方面,当然除了项目代码。通过这个文件,你可以build整个项目,直至发布。可见maven所谓让我们比较容易的看到项目的全局,也并非虚言。等一下,让大脑想一会。我知道xml很强大,几乎可以描述任何事物。但是完全靠一个pom.xml,就声称可以简单而清楚的描述一个项目的信息和配置。可能吗?要知道一个项目,除了resource的目录以外,还有以来的lib,测试,发布等信息。怎么才能做到呢?
project object?什么,对象?难道和java对象一样?还真行。maven说项目可以继承。而且提供了一个super pom,就像java的Object类一样,尽管你不用写extends Object,你的类也会自动继承这个类。同样,maven也让你的pom继承这个super pom。这样可以再super pom提供很多默认设置使得你自己的pom在没有必要修改super默认设置的情况下变得很简单。
简单浏览了一下这个super pom的2.1版本:
- <project>
- <modelVersion>4.0.0</modelVersion>
- <name>Maven Default Project</name>
- <repositories>
- ... 存储库
- </repositories>
- <pluginRepositories>
- ... 插件存储库
- </pluginRepositories>
- <build>
- ... 构建项目所需的信息
- </build>
- <reporting>
- 报告信息
- </reporting>
- <profiles>
- 项目描述性信息
- </profiles>
具体细节后面再研究,但看这些信息似从这些大类别上也涵盖的差不多了。有了这些默认信息,你自己的pom只要包含下面的信息就好:
project root
modelVersion - should be set to 4.0.0
groupId - the id of the project's group.
artifactId - the id of the artifact (project)
version - the version of the artifact under the specified group
下面是一个例子:
- <project>
- <modelVersion>4.0.0</modelVersion>
- <groupId>com.mycompany.app</groupId>
- <artifactId>my-app</artifactId>
- <version>1</version>
- </project>