技术开发 频道

六年等一回 Maven 3的10大新特性详解

  【IT168 评论】6年了,我们终于等来了Maven 3,Maven 2虽然达到了一定的高度达,但它有两个死穴,一是难以扩展,二是它的代码难以理解,在Maven 3中,许多功能都进行了改造,消灭了Maven 2一直被人诟病的许多问题,在这篇文章中,我将介绍Maven 3的10大新特性。

  1、向后兼容

  Maven创始人,Sonatype公司的CTO Jason van Zyl表示“Maven 3是为用户构建的”,很明显,他的意思是Maven 3.0将会全面取代Maven 2.x,Maven 3开发人员尽了最大努力,确保Maven 2.x用户顺利过渡到Maven 3.0,如果出现重复依赖,插件声明或未指定插件版本号,Maven 3.0将会发出警告,这里我强烈建议你在POM中修复这些问题,因为Maven 3的未来版本可能不会支持生成畸形的项目。我已经尝试将我的多模块项目移植到Maven 3,同样,我收到了上述的警告,但我并没有遇到任何问题或生成时错误,Maven 3.0是可以兼容Maven 2.x的。

  2、性能改善

  我迁移到Maven 3最重要的一个原因是它的速度,更好的磁盘I/O,网络I/O,CPU利用率和更低的内存消耗,经过优化的Maven 3比Maven 2.x快50-400%,更快的生成速度显著提高了开发人员的生产力,我用Maven 3运行我的项目用时不到2分钟,而此前在Maven 2.x上需要耗时3分钟,值得注意的是我并没有开启并行生成功能,凭这一点,你就应该尽快去下载Maven 3亲自试一试。

  3、自动指定父版本

  在Maven 2中,你必须在子模块中指定父版本,当你在新版本上开发时,这是一个维护问题,Maven 3.1将会消除在子模块上指定父版本的需要。

  4、并行生成

  Maven 3引入了并行生成功能,它可以分析你的项目依赖图,允许你并行生成调度模块,使用下面的命令开启项目的并行生成功能。

mvn -T 2 clean install mvn -T 2C clean install

  第一个参数(-T 2)表示使用两个线程并行生成项目,第二个参数(-T 2C)表示每个处理器核心上使用两个线程生成项目,借助并行生成功能,可以让生成速度提升20-50%,但目前并行生成还处于实验阶段,将来不排除发生变化的可能性,因此我建议你现在不要在生产系统中使用它。

  5、更好的错误和完整性报告

  Maven 3改善了错误报告,它会在错误报告中提供指向Maven Wiki页面的链接,这样你可以查看更全面的错误描述和可能的原因,如图1所示,例如,当我未指定子模块的父版本时,运行子模块将会获得一条错误消息。注意:在Maven 3.1中将不再需要为子模块指定父POM版本号。

六年等一回 Maven 3的10大新特性详解
▲图1 Maven 3.0错误报告

  6、插件扩展点

  在Maven 3中,你可以挂上不同的扩展点以便修改插件行为,在Maven 2中你只能直接扩展插件,这个功能是Maven开发团队从Eclipse借来的理念,例如,你可以定义一个扩展点修改web.xml由WAR插件来处理。

  7、Mixin

  Mixin允许你使用参数化的POM片段来组成POM,而不是继承,但这个功能需要等到Maven 3.1发布才能使用,这些Mixin将被部署到仓库,然后使用标准的坐标进行引用,例如,如果你想使用我的项目的发布过程,在Maven 2时代,你必须继承我的项目的Maven POM,因为Mixin是由插件和配置组成的,它们是可以参数化的,你可以用它们组成你的POM。

  8、Maven Shell

  Maven Shell是Maven的命令行接口,它可以提高你的生成速度,因为它可以缓存解析过的POM,避免重复调用Maven的启动成本,它也支持和Maven Archetype集成,并提供Nexus整合,它包括了一个内置的帮助系统,在Mac OS X上,它提供了Growl支持,Maven Shell不属于Maven发行包的一部分,需要单独从这里下载。

  在操作系统命令提示符后输入mvnsh即可启动Maven Shell,输入help可以查看Maven Shell支持的所有功能,如图2所示。

六年等一回 Maven 3的10大新特性详解
▲图2 Maven Shell功能 

  9、多语言生成

  Polyglot Maven是Maven 3非常有特色的一项功能,它允许你以非XML格式编写POM文件,Maven内核提供了一个底层DSL访问Maven内部,你可以用你熟悉的语言编写POM文件,目前支持的语言包括Groovy,Ruby,Scale,Clojure,YAML等,Polyglot Maven希望推动不喜欢XML的人使用Maven。

  Polyglot Maven未捆绑在Maven 3中,需要单独从这里下载,它包括一个叫做translator的工具,这个工具可以将你的XML POM转换成Groovy,Scala或YAML格式的POM,例如,使用下面的命令可以将一个XML POM转换成Scala POM。

translate pom.xml pom.scala

  因此pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" target=newFrame>
<modelVersion>4.0.0</modelVersion>
<groupId>com.shekhar</groupId>
<artifactId>polygot-maven-test</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<name>polygot-maven-test</name>
<url>http://maven.apache.org</url>
<properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties>
<dependencies><dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>

  转换成Scala格式就是

project {
m
=> m.artifactId = "polygot-maven-test"
m.dependency
{
d
=> d.artifactId = "junit"
d.groupId
= "junit"
d.optional
= false
d.scope
= "test"
d._type
= "jar"
d.version
= "3.8.1"
}
m.groupId
= "com.shekhar"
m.modelVersion
= "4.0.0"
m.name
= "polygot-maven-test"
m.packaging
= "jar"
m.properties
+= ("project.build.sourceEncoding" -> "UTF-8")
m.url
= "http://maven.apache.org" m.version = "1.0-SNAPSHOT"}

  10、M2Eclipse

  M2Eclipse让Maven可以和Eclipse集成,M2Eclipse目前最新版本是0.10.0,它已经用Maven 3的嵌入式API进行了重写,M2Eclipse的性能得到了明显提升(根据该项目的网站描述,大约提升了200-500%),因为M2Eclipse在Maven POM中提供了额外的XML元数据,它们只能由M2Eclipse识别。

  原文出处:http://www.developer.com/java/article.php/3908561/article.htm

1
相关文章