在程序员发表的一篇maven文章,跟大家共享。
用
Maven
做项目管理
在
Java世界中我们很多的开发人员选择用
Ant来构建项目,一个
build.xml能够完成编译、测试、打包、部署等很多任务,但我们也碰到了很多的问题,如
jar文件管理混乱,各个项目结构和
build.xml相差很大等等。而
Maven的出现,给项目提供了更多的支持。
1
简介
Maven
作为
Apache
的一个开源项目,旨在给项目管理提供更多的支持,主页地址为
http://maven.apache.org
。它最早的意图只是为了给
apache
组织的几个项目提供统一的开发、测试、打包和部署,能让开发者在多个项目中方便的切换。很多伟大的事业,出发点都很简单,
ebay
就是很好的例证。而
maven
的成功又一次验证了这一点,越来越多的项目开始使用
maven
。
基本原理
Maven
的基本原理很简单,采用远程仓库和本地仓库以及一个类似
build.xml
的
pom.xml
,将
pom.xml
中定义的
jar
文件从远程仓库下载到本地仓库,各个应用使用同一个本地仓库的
jar
,同一个版本的
jar
只需下载一次,而且避免每个应用都去拷贝
jar
。如图
1
。同时它采用了现在流行的插件体系架构,只保留最小的核心,其余功能都通过插件的形式提供,所以
maven
下载很小(
1.1M
),在执行
maven
任务时,才会自动下载需要的插件。
这个基本原理与
Pear
――PHP扩展与应用库(
the PHP Extension and Application Repository
)的原理非常相似,都有一个官方的仓库,都是微内核,通过网络将需要的文件下载到本地,通过官方仓库将相应的类库进行统一管理。
Pear
已经成为
PHP
开发事实上的标准,而
Maven
在
Java
世界的地位也逐渐加强,成为标准指日可待。
另外由于插件的易开发性,现在有了非常多的可供选择的插件,如与
eclipse
结合的插件,与
test
相关的插件,后面我们结合
maven
在项目中的使用进行详细介绍。
图
1
2
项目管理
Maven
官方把
maven
定义为一个项目管理工具,我们不妨看看
maven
能给我们的项目提供哪些好的支持。
2.1
项目标准化
Maven
一个重要特性是定义了项目的标准模板,官方说法是最佳实践。可以通过命令:
mvn archetype:create -DgroupId=com.mycompany.app -DartifactId=my-app
创建一个单一的
maven
项目。创建好的项目,具有了特定的项目结构。这个项目结构是参考业界的最佳实践而成,为后面使用统一的
maven
命令打下了基础,如测试
mvn test
、打包
mvn package
等,无需写一行脚本,就可以方便的实现众多功能。
Maven
还提供其它一些类型模板,可以通过添加
-DarchetypeArtifactId=
{
type
}创建,如
-DarchetypeArtifactId=maven-archetype-site
,生成
site
类型的项目。
同时一些好的开源软件使用了
maven
,也能作为很好的项目模板,如
Equinox
(
Appfuse
的简化版),它的
pom
定义了对
hiberante,spring…
的依赖,可以通过
ant new -Dapp.name=NAME
快速生成项目原型,然后对
pom
文件进行裁减,以符合自身项目的需要。
有了这个标准,项目间能方便的进行交流,你也很容易了解其它使用
maven
项目的结构。对于企业来说,引入
maven
就自然引入了规范,这可比费时费力的写文档,定规范有效的多了。
2.2
文档和报告
使用
mvn site
可以快速生成项目站点,
apache
很多开源项目站点都采用
maven
生成,会出现
built by maven
字样的图标。
而
maven
提供的针对如
junit
,
checkstyle
,
pmd
等的插件,能够方便的进行测试和检查并能直接生成报告。使用都很简单,如
mvn surefire-report:report
就能自动进行
junit
测试,并生成
junit
报告,
mvn pmd:pmd
生成
pmd
报告。具体使用可以在
http://maven.apache.org/plugins/index.html
找到。
2.3
类库管理
Maven
一个很重要的特色就是类库管理。通过在
pom.xml
中定义
jar
包版本和依赖,能够方便的管理
jar
文件。以下是一个简单的
jar
定义片断:
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate</artifactId>
<version>3.1</version>
<type>jar</type>
<scope>runtime</scope>
</dependency>
|
这个片断告诉我们,依赖的
jar
包
groupId
为
org.hibernate
,
artifactId
为
hibernate
,版本为
3.1
,
scope
为
runtime
。在实际项目中,会将
M2_REPO(maven
本地仓库地址
)/ org/hibernate / hibernate /3.1/ hibernate -3.1.jar
放入
classpath
。
同时
maven
会通过
pom.xml
管理
jar
包间的依赖。比如上面的
hibernate-3.1.jar
同级目录肯定会有一个
hibernate -3.1.pom
,在这个
pom
文件中指定了这个
jar
对其它一些
jar
的依赖。而这个
pom
文件是远程仓库提供,无需进行修改,执行
maven
相关命令就会自动根据相关依赖去下载
jar
包。这样只需定义对
hibernate
的依赖而无需关心相关
jar
,在构建项目上方便了很多。
因为
pom
文件对
jar
的管理,也产生了一个很吸引人的特性:项目文件很小。以往一个
web
项目中,
jar
文件都要放入
WEB-INF/lib
下,并放入
cvs(svn)
中,很容易就达到几十
M
。而通过
maven
,只需一个
pom.xml
,在执行
mvn eclipse:eclipse
时再去远程仓库下载,项目文件一般只需几百
K
。
2.4
发布管理
使用
maven
可以方便的进行项目发表管理。在项目开发到一定阶段,可以使用
mvn package
打包,它会自动先运行
mvn test
,跑所有的
testcase
,只有全部通过才能正确打包。生成的
war
包(如果项目的
packaging
为
war
)在
target
目录下。这个
war
包与使用
ant
脚本生成一样,但无需一行脚本,这也是
maven
对比
ant
的优势之一。使用
mvn install
将编译和打包好的文件发布到
distributionManager
指定的远程
repository
。使用
mvn deploy
可以自动管理项目版本。
3
使用
maven
Maven
使用简单,插件丰富且经过大量项目考验,在项目中引入的风险很小。笔者在项目中使用
maven
,新进员工在半小时内就能成功使用
maven
构建项目,并很快掌握几个常用的命令。
Maven
也不需要什么特殊的设施。如果项目全部使用开源软件,并且不需要
maven
管理项目版本,只需要一个
SCM
环境(
CVS
或
SVN
),共享开发源码就可以。把
pom.xml
中的
repository
设为官方地址就行,配置如下:
<repository>
<id>central</id>
<url>http://www.ibiblio.org/maven2</url>
</repository>
|
这个官方
remote repository
上有非常多的开源软件,应该能满足大部分项目的需要。如果有项目需要而它上面暂时还没有的软件,或者希望使用公司内部的软件,那么就需要自己配置一个
repository
了。
3.1
自建私服
传奇私服大家应该都听过,一个网吧自己搞个私服,一伙人免费在上面砍杀。官方因此少赚了很多钱,因此总想打击。而
maven
官方却对自建私服很是支持,我们总算可以正正当当搞把私服了(
Springside
的老大江南白衣就是创建私服的好手)。我们就来介绍下自建私服的最快方法。
首先需要一个
http server
,找台服务器装上
apache
就行。放一个空的
maven
目录到
htdocs
下,假设服务器
ip
为
192.168.0.1
,确认能用
http://192.168.0.1/maven
访问到。然后在自己机器上装好
maven2
,初始化好项目,在
pom.xml
放入需要的
jar
定义,运行如
mvn eclipse:eclipse
就自动从官方下载
jar
到本地,如果不做配置,默认本地
repository
为
${user.home}/.m2/
。对于
windows xp
来说一般在
C:\Documents and Settings\
%
username%\.m2
下,其中%
username
%为操作系统登录用户名。这时你可以看到
${user.home}/.m2/
下多了个
repository
目录,里面有很多的项目相关
jar
,目录按
groupId/ artifactId/version
排好。把
repository
目录整个拷贝到
apache
服务器的
maven
目录下,如果需要官方缺少的
jar
或公司内部
jar
,仿照这个目录结构,做好
jar
放到
maven
目录下。自建私服成功!
要使用私服,只需修改
pom.xml
,在
repository
配置后加上:
<repository>
<id>companyName</id>
<url>http:// ${ip}/maven</url>
</repository>
|
这样需要下载
jar
时,会先到本地
repository
查看,没有下载过再到官方搜索,没有找到再到后面的
repository
查找。
3.2
安装配置
Maven
的安装很简单:
1.
从
apache
网站上下载
maven
安装包,实际上就是个压缩文件。将其解压到你想要存放
maven
的目录中。在这里假设你将
maven
解压到
C:\Program Files\Apache Software Foundation\maven-2.0.4
中。
2.
将
C:\Program Files\Apache Software Foundation\maven-2.0.4\bin
设到你的系统环境变量%PATH%中。
3.
同时确保你已经将你的JDK安装目录设为java_home系统变量。
4.
打开个命令行窗口,运行
mvn –version
验证是否安装成功。
5.
如果使用
eclipse
,在运行
mvn eclipse:eclipse
生成
eclipse
项目文件后,需加入
M2_REPO
到
Classpath Variables
中,指向
本地
repository
,例如:
C:/Documents and Settings/Owner/.m2/repository
。
3.3
基本使用流程
在项目进程中,不必做什么配置,在
pom.xml
同级目录,
cmd
使用简单的
maven
命令,就可以完成初始化
->
开发
->
测试
->
发布
的全过程。
Maven
的基本使用流程如下图:
其中在初次使用命令
mvn eclipse:eclipse
时会下载很多的插件和
jar
,可能需要较长的时间,建议泡杯咖啡,和同事吹吹牛。如果失败,可能是网络问题,可以重新运行
mvn eclipse:eclipse
,已下载好的插件和
jar
不会再下。运行
mvn test
和
mvn package
等命令,产出物都会放在
target
目录下。如果在使用过程中有什么问题,也可以和我联系,
mail:pesome@gmail.com
,我们一起来尝试解决。
总结:
Maven
作为新的项目管理工具,简单易用,能对项目的各个阶段提供大力支持,同时由于它易扩展的插件体系架构,出现了越来越多的插件,也使得其功能更加强大。短短一篇文章,实在很难把其特点一一尽述,
maven
还有很多好用的功能和插件等待我们去使用和开发。而学习新技术的最好方式就是实践,大家如果有兴趣,尽快下载一个最新版,开始你的
maven
之旅吧!
作者简介:张俊,网名
pesome
,上海交大软件工程硕士,
2
年
JavaEE
开发经验,资历尚浅。去年下半年开始接触
spring
等开源软件,并产生了浓厚的兴趣。今年
3
月开始做
www.openfans.net
,用一堆开源软件搭建而成,希望为中国的开源事业做出一点贡献。
参考文档:
1.
http://maven.apache.org
官方网站文档
2.
http://www-128.ibm.com/developerworks/cn/opensource/os-maven2/ Maven2
的新特性