学习笔记——Maven实战(十)Maven 3,是时候升级了
去年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 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.13: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-</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的发展,有机会也一定会分享更多的经验和心得。
来源:http://www.infoq.com/cn/news/2011/07/xxb-maven-10-time-to-update
学习笔记——Maven实战(十)Maven 3,是时候升级了的更多相关文章
- mybatis学习笔记(五) -- maven+spring+mybatis从零开始搭建整合详细过程(附demo和搭建过程遇到的问题解决方法)
文章介绍结构一览 一.使用maven创建web项目 1.新建maven项目 2.修改jre版本 3.修改Project Facts,生成WebContent文件夾 4.将WebContent下的两个文 ...
- mybatis学习笔记(六) -- maven+spring+mybatis从零开始搭建整合详细过程(下)
继续 mybatis学习笔记(五) -- maven+spring+mybatis从零开始搭建整合详细过程(上) 五.使用监听器启动Spring容器 1.修改pom.xml文件,添加Spring-we ...
- Dynamic CRM 2013学习笔记(四十六)简单审批流的实现
前面介绍过自定义审批流: Dynamic CRM 2013学习笔记(十九)自定义审批流1 - 效果演示 Dynamic CRM 2013学习笔记(二十一)自定义审批流2 - 配置按钮 Dynamic ...
- 【Unity Shaders】学习笔记——SurfaceShader(十)镜面反射
[Unity Shaders]学习笔记——SurfaceShader(十)镜面反射 如果你想从零开始学习Unity Shader,那么你可以看看本系列的文章入门,你只需要稍微有点编程的概念就可以. 水 ...
- 【Java学习笔记之二十六】深入理解Java匿名内部类
在[Java学习笔记之二十五]初步认知Java内部类中对匿名内部类做了一个简单的介绍,但是内部类还存在很多其他细节问题,所以就衍生出这篇博客.在这篇博客中你可以了解到匿名内部类的使用.匿名内部类要注意 ...
- Hadoop学习笔记(8) ——实战 做个倒排索引
Hadoop学习笔记(8) ——实战 做个倒排索引 倒排索引是文档检索系统中最常用数据结构.根据单词反过来查在文档中出现的频率,而不是根据文档来,所以称倒排索引(Inverted Index).结构如 ...
- Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第二十二章:四元数(QUATERNIONS)
原文:Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第二十二章:四元数(QUATERNIONS) 学习目标 回顾复数,以及 ...
- Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第十九章:法线贴图
原文:Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第十九章:法线贴图 学习目标 理解为什么需要法线贴图: 学习法线贴图如 ...
- Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第十八章:立方体贴图
原文:Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第十八章:立方体贴图 代码工程地址: https://github.c ...
- Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第十六章:实例化和截头锥体裁切
原文:Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第十六章:实例化和截头锥体裁切 代码工程地址: https://git ...
随机推荐
- 测试管理_下属谈话[持续更新ing]
作为测试部门的管理者,在工作绩效评定.工作安排.工作问题提出等时候,都需要与下属进行面对面谈话,怎么进行有效的谈话,这是一个值得思考和锻炼的问题. 谈话的内容: 谈近阶段工作的回顾 谈工作中的困难(是 ...
- Sqlserver创建连接MySql的链接服务器
第一步:在MySql服务器上安装与系统对应的 MySql-Connector-ODBC 官方下载地址 安装过程中可能会报 缺失 msvcr100.dll 的错误,这需要你根据系统到网上下载对应的这个 ...
- IE8下解决position:flxed无效的问题
只需将文档类型声明改成如下方式即可 <!DOCTYPE html>
- Nginx为什么比Apache Httpd高效:原理篇
一.进程.线程? 进程是具有一定独立功能的,在计算机中已经运行的程序的实体.在早期系统中(如linux 2.4以前),进程是基本运作单位,在支持线程的系统中(如windows,linux2.6)中,线 ...
- MySQL的replace函数的用法
REPLACE(field,find_str,replace_str): 字段field的内容中的find_str 将被 替换为 replace_str . 例如: update short_url ...
- windows 进程管理器中的内存是什么意思?
*内存 - 工作集:私人工作集中的内存数量与进程正在使用且可以由其他进程共享的内存数量的总和. *内存 - 峰值工作集:进程所使用的工作集内存的最大数量. *内存 - 工作集增量:进程所使用的工作集内 ...
- Storm之spout,bolt编写
Storm,核心代码使用clojure书写,实用程序使用python开发,使用java开发拓扑. Nimbus节点接收到请求,对提交的拓扑进行分片,分成一个个的task,并将task和supervis ...
- [转]响应式表格jQuery插件 – Responsive tables
本文转自:http://www.shejidaren.com/responsive-tables-for-bootstrap-3.html 这个Responsive tables jQuery插件依赖 ...
- 【ASP.NET 基础】ASP.NET内置对象
准确地说,asp.net 并没有内置对象这一说,jsp 里确实把 request.response 这些当作 jsp 的内置对象,这里只不过是借用了一下 jsp 的说法而已.在 Web 中处于中心的是 ...
- 【读书笔记《Android游戏编程之从零开始》】2.Hello,World!
本人看的是PDF文档,很多都是直接都是复制粘贴的记录,简单的记录下笔记! 2.1 创建一个Android项目 Application Name: 应用名称(安装在手机上显示的名字)Project Na ...