1. Maven个人使用历史
我是06年开始接触Maven的,那个时候Maven+Subversion的组合满天飞,不用都不好意思了。不过也确实好用,所以后续的项目中基本上都在使用Maven。如果简单地归纳maven,你可以把它理解为:maven=build工具+项目(jar包,依赖)管理工具。
一提到maven,大家都会联想到ant,确实这哥俩干的活差不多,当然还有很多其它不知名的,比如ivy(一个大摩的同事介绍的)。这里不去讨论他们的优略,所谓技不压身,多掌握一门工具没什么坏处。
2. Maven与CoC
Maven的一大特点就是CoC(Convention over configuration, ruby on rails也是基于这个理念),啥意思呢?就是它已经事先规定好了很多你必须遵守的规则,没什么可商量的。CoC的好处就是,一但你适应了,你就省事了,照着做就是。如果你不适应,你一定要自定义,那就郁闷了。但是,世上哪有绝对j的自由呢?
3. Maven几个重要概念
假定你已经安装好了maven,M2_HOME变量(指向maven安装目录)设好了,PATH里也加上了%M2_HOME%\bin。那你在cmd下敲下:
mvn -version
肯定就会显示出几行信息,提示你maven以及java的版本。
Maven的配置文件——settings.xml位于%M2_HOME%\conf目录下,这里汇集了所有maven的配置信息,一旦出现什么问题,第一个要查看的就是这个文件。
Repository——前面不是说过,maven一大功用就是jar包管理,那maven把这些jars都藏在哪里呢?答案就是资料库——repository。Maven的repository分为local repository和remote repository,如果你在pom.xml文件里指定了一个dependency,那么maven在repository中查找该jar文件的顺序为local repository -> remote repository。local repository缺省为~/.m2/repository,你也可以在settings.xml中的<localRepository>里自定义。Remote repository缺省为http://repo1.maven.org/maven2/ (镜像:http://mirrors.ibiblio.org/pub/mirrors/maven2/ ),当然你也可以在settings.xml中指定。而且,一般的项目实践中,我们都需要配置一个公司范围内的repository,而且所有的jars只能从这个资料库中来获取,一般不允许连接到外部的资料库。
4. Maven与Java项目
分为两种情况:1、白手起家;2、已经有现成的project在cvs/svn中。
白手起家:
你可以从别的地方把pom.xml和目录结构拷贝过来,然后改改。或者你也可以用mvn提供的模板来生成一个项目,模板有很多种,最简单的命令就是:
mvn archetype:create -DgroupId=com.maven -DartifactId=test_project
已有source code:
在你把source code checkout下来后,如果你的Eclipse里已经装了maven插件(安装好插件后,还需要去Window->Perferences->Maven里面进行必要的设置,最主要的就是Installations里面“User Settings”和“Local Repository”两项,要确保正确),你可以把这些项目直接以maven project(只要有pom.xml文件就可以)的方式导入进来。当然导入之前你最好在命令行下运行一下“mvn clean install -DskipTests”命令以确保这些项目都是可编译的,如果导入后你发现并未导入成功,比如srm/main/java都没有被加入到Build Path,那说明导入过程中出错了(或者pom.xml本身就存在错误,这时候需要先fix,或者跑一下上面说到的命令),很简单,把项目delete然后重新导入,一般就能解决问题。
如果你没有安装maven插件或者你不喜欢用它(我的很多同事都不喜欢用Eclipse的maven插件,觉得很慢很容易出问题),你可以用如下的命令:
mvn eclipse:clean eclipse:eclipse(当然在用这个命令时,在生成的.classpath文件里会用到一个变量M2_REPO,在下面的导入之前,你需要在Eclipse里设置这个变量并指向你本地的repository)
先把它生成为普通的java project,然后在Eclipse中把它和其它java project一样导入进来。有的人会问了,如果我从cvs/svn中checkout下来的sourcecode中已经包含了.project和.classpath文件,我还需要运行上面的命令吗?我的建议是最好重新运行一遍,而且我是一直不建议将.project/.classpath这类非原始code(也就是可以由别的文件生成)放入到版本控制中的。
Maven项目层次:
一般大的项目,很少只有一个maven project,这个时候就需要管理好这些maven projects之间的层次,一般通用的做法是创建一个parent maven project。然后让其它项目作为它的子项目,这样容易管理。
. |-- my-module | `-- pom.xml `-- pom.xml
这样你在parent project的pom.xml里面就可以看到<modules></modules>定义,其中每个module是和目录名相对应的。在parent pom.xml里面你可以定义一些公用的依赖,propert,build plugin的自定义等等。而且,在Eclipse里面导入maven project的时候可以直接选中这个parent pom.xml,然后所以它的子项目都会自动导入。
5. Dependency详解
maven里面对jar的引用非常简单,只需要在pom.xml里面加上一个dependency即可。但是实际上里面有很多陷阱,需要好好注意。
第一就是这个version,我们平时一般的写法会是这样:
6. Maven与项目部署
还记得在用maven做部署之前,我们用过shell script来做,感觉maven还是简单了不少。
其实主要的几个步骤包括:
利用mvn scm plugin从cvs/svn上checkout source code——然后利用Maven Assembly Plugin来组装source tree生成最终的发布文件,当然做得专业的会生成一个dstream或者rpm文件,简单的做法就是生成一个zip文件,然后直接加压缩即可。
当然,这其中可能会涉及到一些文件的复制,就需要用到maven resources plugin。
How to share resources across projects in Maven: http://www.sonatype.com/people/2008/04/how-to-share-resources-across-projects-in-maven/
这里将以一个我们实际的项目为例来具体讲讲。
7. Maven与Jar文件发布
有的时候你需要将自己的jar包发布到公司的repository里,以便项目发布的时候或者其他项目能够使用它,你可以使用maven的命令去deploy。当然,现在一般的repository server都会有一个对应的web管理界面,你可以在那里deploy你的jar,把groupId,artifactId和version三个参数设置好就行。需要注意的是,如果你是在某个已有的jar上修改了一些类然后deploy上去的,你需要设置好上述三个参数以区分于你要替换的jar。