写点什么

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

  • 2011-07-27
  • 本文字数:2507 字

    阅读完需:约 8 分钟

去年 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 的发展,有机会也一定会分享更多的经验和心得。

2011-07-27 08:0417216

评论

发布
暂无评论
发现更多内容

如何认证成为亚马逊云科技 DevOps 专家?

亚马逊云科技 (Amazon Web Services)

DevOps 亚马逊云科技 tutorial caree

如何批量导出PPT里的图片?

InfoQ IT百科

24小时自助洗车加盟怎么收费?

共享电单车厂家

自助洗车加盟 24小时自助洗车

Excel表格中怎么防止重复录入数据?

InfoQ IT百科

百万奖金,首届船海数据智能应用创新大赛正式开赛

科技热闻

常见的杀毒软件有哪些?

InfoQ IT百科

怎么建立无法删除的文件夹?

InfoQ IT百科

怎么转换视频的格式?

InfoQ IT百科

加盟自助洗车需要符合什么条件

共享电单车厂家

加盟自助洗车 自助洗车加盟条件

淘宝小程序体验优化:数据分析和优化实践

阿里巴巴终端技术

小程序 数据分析 体验优化 性能模型

TASKCTL 调度平台服务节点管理

敏捷调度TASKCTL

DevOps 分布式 自动化部署 Kafka ETL TASKCTL

电脑上微信聊天记录的默认保存路径是在哪里?

InfoQ IT百科

在 Amazon QuickSight 中使用 Athena 数据连接器可视化 DynamoDB 数据

亚马逊云科技 (Amazon Web Services)

DevOps 亚马逊云科技 career tutorial

如何用Excel画图?

InfoQ IT百科

浅析mysql性能优化

乌龟哥哥

4月月更

活动报名 | 如何基于开源项目 Tapdata PDK,快速完成数据源和目标的开发?

tapdata

数据库

浅识鸿蒙的Java技术栈

Bob

如何将PDF转换成Word?

InfoQ IT百科

TASKCTL 应用工程与作业类型的定义

敏捷调度TASKCTL

DevOps 敏捷开发 批量任务 ETL系统 自动化运维

自助洗车加盟!自助洗车品牌大全

共享电单车厂家

自助洗车加盟 自助洗车品牌

限时好礼 | MongoDB又有新书籍出炉啦!

MongoDB中文社区

mongodb

post接口请求测试,通俗易懂!

Liam

测试 Postman swagger 测试工具 jmetere

24小时自助洗车设备厂家哪家好?

共享电单车厂家

自助洗车机厂家 24小时自助洗车 自助洗车机设备

深入浅出 Zookeeper 中的 ZAB 协议

悟空聊架构

zookeeper ZAB 4月日更 悟空聊架构 4月月更

png、jpg这两种图片格式有什么不同?

InfoQ IT百科

自助洗车机加盟项目要怎么加盟

共享电单车厂家

自助洗车加盟 自助洗车机项目

截图快捷键是什么?

InfoQ IT百科

如何使用hardhat进行合约uups模式升级

BSN研习社

区块链

如何共享电脑上的文件?

InfoQ IT百科

如何发起 MQTT 亿级连接和千万消息吞吐性能测试

阿里巴巴云原生

怎么添加或删除电脑上的应用软件呢?

InfoQ IT百科

Maven实战(十)——Maven 3,是时候升级了_Java_许晓斌_InfoQ精选文章