BT

Maven实战(十)——Maven 3,是时候升级了

作者 许晓斌 发布于 2011年7月27日 | 被首富的“一个亿”刷屏?不如定个小目标,先把握住QCon上海的优惠吧!

去年10月份Apache Maven发布了3.0正式版,而在上个月的22号,Eclipse基金会宣布了Eclipse 3.7(Indigo)的发布,该版本Eclipse最大的新特性之一就是集成了Maven。下载Eclipse IDE for Java Developers版本的用户会发现,Eclipse已经能够自动识别Maven项目了。Indigo中内置的Maven版本是3.0.2,这在一定程度上说明Maven 3已经非常稳定了。不过我相信一定还有很多Maven 2用户在犹豫是否升级,本文会介绍一些Maven 3最重要的特性,旨在帮助读者扫除疑虑,尽早享受Maven 3所能带来的各种便利。

确保兼容性

在升级软件的时候,兼容性显然是首先要考虑的问题,如果原本在Maven 2下能成功构建的项目,在Maven 3下立刻就失败了,而且难以简单修复,那显然是不可接受的。 好在Maven用户大可打消这一顾虑,Maven 3自设计之初就一直考虑与Maven 2的兼容性,这不仅是指兼容Maven 2的核心,还包括大量的org.apache.maven.plugins与org.codehaus.mojo插件。虽然由于某些插件代码的特殊性,无法做到100%完全的兼容,但已经基本不会遇到问题了。

如果你还有担心,那可以先仔细阅读官方发布的Maven 3.x兼容性笔记Maven 3.x插件兼容性列表。这两份文档记录的兼容性问题主要涉及的是一些应当被弃用的特性,并且都给出了Maven 3下的解决方案。

改进性能

Maven 3的性能较之于Maven 2是有了很大的进步的,这体现在内存占用的减少和构建时间的减少两个方面。特别是Maven 3引入的并行构建特性,能够分析项目模块之间的依赖关系,然后并行地构建那些相互间没有依赖关系的模块,从而充分利用如今普遍的多核CPU资源。

以下两条命令分别表示用4个线程构建,以及根据CPU核数每个核分配1个线程进行构建:

$ mvn -T 4 clean install
$ mvn -T 1C clean install

Maven的提交者之一Anders Hammar在其文章迁移到Maven 3的十大理由中介绍了一个简单的实验,分别用Maven 2.2.1,Maven 3.0.2(单线程),和Maven 3.0.2(4线程)构建同样的包含32个模块的Maven源代码,得到了如下的结果:

Table 1. 用"mvn package"构建Maven SCM trunk(32个模块)
  时间/内存
Maven 2.2.1 3:20/53M
Maven 3.0.2(单线程) 3:15/27M
Maven 3.0.2(4线程) 2:26/28M

可以看到Maven 3下内存的占用减少了近一半!而开启并行构建后,时间的节省也是非常可观的。而项目越大,这种性能的改进就越为明显。如果你的开发环境没有充裕的内存,而你的项目又非常大,那光内存节省这一条就足以让你立刻转向Maven 3了。

 改进模块间依赖解析

Maven 2中一个比较令人头疼的问题是,当你在构建一个多模块项目的时候,为了使前面的模块能在后面模块classpath中生效,你必须将其install到本地仓库中之后,Maven才能解析使用。几乎所有Maven 2用户或早或晚都遇到了这个困惑,“为什么我已经 mvn clean package 了模块A,可构建模块B的时候还是无法看到A的更新呢?”这个问题在Maven 3中得以解决了,在构建多模块项目的时候,Maven 3会从反应堆(reactor)中解析模块间依赖,也就是说只要模块A执行了package,那模块B就能根据相对路径找到并解析使用A生成的jar文件。

提倡最佳实践

刚从Maven 2转到Maven 3的用户很可能会发现执行构建的时候命令行会打印很多如下的警告:

[WARNING] 'build.plugins.plugin.version' for org.apache.maven.plugins:maven-javadoc-plugin is missing. 
[WARNING] It is highly recommended to fix these problems because they threaten the stability of your build.

大部分如下的警告是因为用户在配置插件或者依赖的时候没有指定版本,无法保证构建的可重现性,从而为构建引入了潜在的风险。这样的警告是一种既保持兼容性,又提倡最佳实践而做出的权衡。类似的改进还包括弃用profile.xml特性、明确分离项目依赖和插件依赖等等。

改进日志输出

这是一个很微小的改进,却突显了Maven开发者对Maven用户的关怀,我个人非常喜欢这点改进。简单得来说,Maven 3的构建日志更容易阅读了。插件的输出之间都有空行隔开,每个被运行插件的版本、目标、以及所处模块的artifactId都得以清晰显示。当构建出现错误的时候,这样的输出能帮助用户更快地找到问题所在。

 站点(注意!)

站点这一特性是Maven 2的核心,但是在Maven 3中,该特性被完全移到了maven-site-plugin中,这就导致了相关的配置也需要转移。Maven 2中与站点相关的配置是在POM的reporting元素下的,如:

<project>
  ...
  <reporting>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-javadoc-plugin</artifactId>
        <version>2.7</version>
      </plugin>
    </plugins>
  </reporting>
</project>

在Maven 3中,所有站点相关的配置都应该出现在maven-site-plugin下面:

<project>
 ...
 <build>
   ...
   <plugins>
     ...
     <plugin>
       <groupId>org.apache.maven.plugins</groupId>
       <artifactId>maven-site-plugin</artifactId>
       <version>3.0-beta-3</version>
       <configuration>
         <reportPlugins>
           <plugin>
             <groupId>org.apache.maven.plugins</groupId>
             <artifactId>maven-javadoc-plugin</artifactId>
             <version>2.7</version>
           </plugin>
         </reportPlugins>
       </configuration>
     </plugin>
   </plugins>
 </build>
</project>

小结与致谢

本文从兼容性、新特性、性能改进、以及重要细节等方面全面介绍了Maven 3。Maven 3是Maven从成熟走向巅峰的标志,如果你还未升级,我强烈建议你至少尝试一下,Maven的安装是非常简单的,只需要下载一个zip包、解压、然后设置简单的环境变量即可,马上去下载吧

由于能力及精力所限,我已经很难再写更多既不重复又符合很多读者口味的Maven文章,因此暂且计划将该专栏告一段落。我衷心感谢张凯峰的策划和编辑,感谢读者的支持,另外也感谢我的家人,特别是我三岁的女儿,那些给写稿的时间本该属于她们。最后,我还是会持续关心 Maven的发展,有机会也一定会分享更多的经验和心得。

评价本文

专业度
风格

您好,朋友!

您需要 注册一个InfoQ账号 或者 才能进行评论。在您完成注册后还需要进行一些设置。

获得来自InfoQ的更多体验。

告诉我们您的想法

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

Juven 辛苦了 by 郭 雪品

Juven 的文章和他的书、博客一样,写的都很清晰、好理解,Juven 辛苦了。

Maven与持续交付 by Chen Casel

持续交付是当下的一个热点,希望Juven大哥能够出一个专题讲讲Maven如何帮助实现项目的持续交付,比如如何实现build pipeline等,谢谢!

Maven 3下如何使用FTP进行site deploy? by Chen Casel

请问Maven 3下如何使用FTP进行site deploy? 最好能给个例子,谢谢!

Re: Maven 3下如何使用FTP进行site deploy? by 伟光 严

用hudson阿。。hudson里面用maven3来编译打包,然后用tomcat的插件来部署

Re: Maven 3下如何使用FTP进行site deploy? by j sean

兄弟你这个问题要分两步走, 第一步要找一个Maven 的ftp plug-in.(类似 wagon-ftp)。利用ftp plug-in把你构建好的东西传过去。 第二步trigger你的web container去deploy。同样的你还要去找一个maven plug-in去做。不同的web container有不同的plug-in你可以google到的。(我们以前用过jboss的不是太好用)。
如果你有hudson的话, 可以下载hudson的plug-in去帮你ftp传送和deploy。只利用maven去构建。 这样会容易一点。

感谢juvenxu by 刘 东波

最早接触maven的时候一头雾水,是你的博客带我入门的,后来逐渐工作中需要的更深入更系统了,就买了你的书,我对你的书的评价是:
良心书!
我看过很多书籍,把自己的理解都写明写透的很真的不多,今天看完这个系列文章,特来发帖感谢你.
谢谢!

Re: Maven 3下如何使用FTP进行site deploy? by Chen Casel

问题解决了,用的就是wagon-ftp plugin,project site用的服务器是apache http server,在这里把脚本贴出来希望对其他人有用

<build>
<extensions>
<extension>
<groupId>org.apache.maven.wagon</groupId>
<artifactId>wagon-ftp</artifactId>
<version>1.0-beta-6</version>
</extension>
</extensions>
<build>

<distributionManagement>
<site>
<id>PROJECT_SITE</id> <url>myftpserver/home/CI/apache/htdocs/${artifactId}</url>
</site>
</distributionManagement></build></build>

Re: Maven 3下如何使用FTP进行site deploy? by Chen Casel

居然回复后无法编辑! 上面的url不知无故去掉了ftp头,应该是这个样子的:ftp : // myftpserver/home/CI/apache/htdocs/${artifactId}
去掉中间多余的空格

Re: Maven 3下如何使用FTP进行site deploy? by 许 晓斌

嗯,这个在《Maven实战》中有提到的

Re: 感谢juvenxu by 许 晓斌

非常感谢你的支持,能实现这样的效果是我写书撰文最大的意义。

Re: Maven与持续交付 by 许 晓斌

持续交付所涵盖的内容已经大大超过Maven技术的范围,不过我会关注这方面的技术,有机会一定写文章分享。谢谢。

Juven 辛苦了 by Lai Robert

很不错,我的 Maven 就是从你开始认识的。

从git上面下面的符合maven规范的项目 by Lee Lucas

您好,我从git上面下面的符合maven规范的项目, 怎么样 在eclispe中进行转换成符合maven规范的项目

写的很不错,帮助我系统理解了maven by 北 夜人

写的很不错,帮助我系统理解了maven,感谢

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

14 讨论
提供反馈
错误报告
商务合作
内容合作
Marketing
InfoQ.com及所有内容,版权所有 © 2006-2016 C4Media Inc. InfoQ.com 服务器由 Contegix提供, 我们最信赖的ISP伙伴。
北京创新网媒广告有限公司 京ICP备09022563号-7 隐私政策
BT

We notice you’re using an ad blocker

We understand why you use ad blockers. However to keep InfoQ free we need your support. InfoQ will not provide your data to third parties without individual opt-in consent. We only work with advertisers relevant to our readers. Please consider whitelisting us.