Maven 出现到现在也有很长时间了Q初识它的感觉至今仍清晰的印在脑中。现在想来,当时?Ant UL Maven 的想法其实很朴素Q就是因?Maven 可以以网站的形式展现与项目相关的信息Q如开发h员列表、各U?Report。这U方式ؓ目的构建带来了极大的方便,其?Report 的。试惛_于生的 Junit-Report、JavaDoc、CheckStyle、PMD {报告,如果没有一个统一的入口,每次切换目录是多么o人厌烦的事情Q?/p>
Maven 无疑是相当成功的Q这一点从来多的开源项目开始?Maven 可以看出。Maven 取得成功的原因很单:在简化构本的同时Q功能ƈ没有~水Q反而有所增强Q提供汇集项目信息的工具Qƈ以相当友好的方式呈现Q丰富的插g化了工作。如此有力的工具出现Q自然是争相使用?/p>
如今 Maven2 已经推出QMaven 的官方网站称QMaven2 相对?Maven1 是一个相当大的{变,甚至不惜牺牲兼容性来辑ֈq一目的。(Z Maven1 的用L惻IMaven1 仍在l箋他的使命。)如此大的变动到底换来了什么样的结果?
比v Maven1 那不急不慢的q行速度QMaven2在速度上有了质的飞跃,甚至与Ant相比也毫不逊色Q当Ӟ下蝲不算Q。除此之外,"化工作,使用业界公认的最?jng)_?也是?Maven2 的另一大主题,其他的新Ҏ(gu)无处不在体?Maven2 为简化工作而做出的努力?/p>
Maven1 ?Maven2 主要配置文g的对比:
POM是Maven的核心对象模型,在Maven2中POM已由project.xml转移到pom.xml中用,版本也由3升?。对于项目,一般只需要pom.xmlp了?/p>
在Maven2中不需要也不提倡用maven.xmlQ原因如下:
如果仍期望能够用类似maven.xml的功能,?lt;preGoal>Q请参?a style="color: #5c81a7; ">Inserting non-standard build steps using preGoals and postGoals?/a>
在Maven2中,配置使用settings.xmlQ它取代了原有的project.properties和build.properties。配|在Maven2中存在两U别:
在settings.xml中可以配|,如本地Repository、proxy{等Q关于settings.xml的结构可以从Maven的官方网站上获取?/p>
在Maven2中,~写plugin的语a由jelly变更为Java和BeanShell。Java在速度上更有优势,而且开发h员的熟?zhn)E度更高。对于其他的行脚本Q如groovyQMaven的官方网站的意见是,{待其更成熟时再考虑
?/span>好的目录l构可以使开发h员更Ҏ(gu)理解目Qؓ以后的维护工作也打下良好的基。Maven2Ҏ(gu)业界公认的最佳目录结构,为开发者提供了~省的标准目录模ѝMaven2的标准目录结构如下:
使用目录模板Q可以pom.xml更简z。因为Maven2已经Ҏ(gu)~省目录Q预定义了相关的动作Q而无需人工的干预。以resources目录ZQ?/p>
q些动作?Maven1 中,是需要在 maven.xml 中?lt;preGoal>?lt;postGoal>来完成的。如今,完全不需要在pom.xml中指定就能够自动完成。在src和test都用resourcesQ方便构建和试Q这U方式本已是前人的l验。通过使用Maven2Qɘq个l验在开发团队中得到普及?/p>
创徏标准目录模板Q可以通过如下命oQ?/p>
mvn archetype:create -DgroupId=com.codeline.commons -DartifactId=codelineCommons |
groupId和artifactId的含义与Maven1中的含义一P参数artifactId的g作ؓ目根目录的名字。除了徏立相应的目录之外QMaven2q会创徏~省的pom.xml?/p>
Maven2也考虑刎ͼ不同cd的项目需要拥有不同的目录l构。如创徏web目Q可以用命令:
mvn archetype:create -DgroupId=com.mycompany.app -DartifactId=my-webapp -DarchetypeArtifactId=maven-archetype-webapp |
在Maven2中有了明的生命周期概念Q而且都提供与之对应的命oQ得项目构建更加清晰明了。主要的生命周期阶段Q?/p>
如果要执行项目编译,那么直接输入Qmvn compile卛_Q对于其他的阶段可以cL。阶D之间是存在依赖关系QdependencyQ的Q如test依赖test-compile。在执行mvn testӞ会先q行mvn test-compileQ然后才是mvn test?/p>
在POM 4中,<dependency>中还引入?lt;scope>Q它主要理依赖的部|Ӏ目?lt;scope>可以使用5个|
<scope>的用D例:
<dependency> <groupId>hibernate</groupId> <artifactId>hibernate</artifactId> <version>3.0.3</version> <scope>test</scope> </dependency> |
在Maven1中,需要把依赖所需要的包也一q列出。这对于使用cM如Hibernate的用h说所操的心太多了Q而且也不方便。在Maven2中实C传递依赖,如此对于Hibernate所依赖的包QMaven2会自动下载,开发h员只需兛_Hibernate卛_?/p>
注意Q只有得到Maven支持的依赖,通常是plugin形式出现Q才能获得这个特性。而且对于一些老的pluginQ可能由于时间的关系不支持传递依赖。如臛_在Maven 2.0.1中,对于Hibernate 2.1.2Q仍焉要显式列出Hibernate 2.1.2所依赖的包?/p>
![]() ![]() |
![]()
|
安装Maven2的步骤非常简单:首先从Maven官方|站下蝲相应的Y件包Q目前是Maven 2.0.1Q然后解压,q设|环境变量M2_HOME= Maven2的解压安装目录;最后将%M2_HOME%/bind到path中,方便Maven在Q何目录下q行?/p>
Maven2的运行命令是mvnQ用mvn -h可以获得相关的帮助信息。常用情形:
或许是由于刚刚推出的~故QMaven2目前q是有一些不如人意的地斏V尤其是Report部分的pluginQ有的是因ؓ目前q没有,如junit-report。有的则是一些莫名其妙的问题Q如checktyle和pmdQ在本地l(f)ocale下都无法正常工作。以pmd举例Q在产生PMD报告时会抛出如下异常Q?/p>
java.util.MissingResourceException: Can't find bundle for base name pmd-report, locale zh_CN at java.util.ResourceBundle.throwMissingResourceException(ResourceBundle .java:839) at java.util.ResourceBundle.getBundleImpl(ResourceBundle.java:808) at java.util.ResourceBundle.getBundle(ResourceBundle.java:702) …… |
q运的是QMaven2一出现备受关注,要不了多长时_诸如此类的问题应该就会很快解冟?/p>
![]() ![]() |
![]()
|
Maven2在Maven1的优势基之上Q又向前q进了一大步。它提供的这些新Ҏ(gu)大大地~短了开发管理中的工作量Q得开发h员将_֊集中在实际的业务问题上。而且q些新特性对于简化用,普及最?jng)_践,也vCU极的作用?/p>