BT

如何利用碎片时间提升技术认知与能力? 点击获取答案

Maven开始逃离 XML 阵营

| 作者 Alex Blewitt 关注 4 他的粉丝 ,译者 徐川 关注 10 他的粉丝 发布于 2015年3月27日. 估计阅读时间: 6 分钟 | Google、Facebook、Pinterest、阿里、腾讯 等顶尖技术团队的上百个可供参考的架构实例!

Maven,这个过去数十来年 Java 应用构建工具的事实标准,已经学会了处理非 XML 写成的构建文件。我们熟知的 polyglot maven,可以通过使用插件来将它的 pom.xml 构建文件的表达方式替换为另一种语言。polyglot-maven-examples 这个示例源码包含了替换为AtomScalaGroovyYAML 版本的构建文件。基于 YAML 的构建文件如下

modelVersion: 4.0.0
groupId: io.takari.polyglot
artifactId: yaml-project
version: 0.0.1-SNAPSHOT
name: 'YAML Maven Love'

properties: {sisuInjectVersion: 0.0.0.M2a, teslaVersion: 3.1.0}

每一种语言都能提供它们自己的解析和处理机制,在使用 Scala 或 Groovy插件的时候,还可以编写能在构建时运行的内联代码。因此,每个独立项目都可以在构建文件中编写自己的内联代码片段,而原本这些逻辑由于过于简单,并不适合作为插件来实现,但又无法简单地采用内嵌的 Ant 脚本来实现。另外,你还可以采用那些支持特定语言语法的编辑器来编辑这些文件。这样做既包含了 Maven 1 的灵活性(支持使用Jelly 来编写内联代码),又包含了 Maven 2 的扩展(这一版本以插件形式来支持内联代码)。更多的支持正在计划中,如无需 pom.xml 文件,就能直接从 Manifest.MF 构建 OSGi bundles的能力。

实现 ployglot maven 功能的代码已经存在了一段时间,但是一直以来,要使用该功能却并不简单,因为需要为 Maven 的标准安装添加补丁才能支持其它的 pom.xml 文件。而在 Maven 3.3 版本中,支持这些扩展功能的钩子函数允许你即使在没有特定 pom.xml 文件的情况下,便可将对扩展的变更添加到项目中。在 Maven 3.3 发布之后,如 Spring Hateoas 这些项目就将它们的 pom 文件转换成了 Groovy 版本

一般来说,插件是被添加到 pom.xml 文件中的,但如果一开始没有 pom.xml 文件该怎么办呢?这便是 Maven 带来的一个关键更新 - 对核心扩展的添加。通过将一个 .mvn 文件夹添加到项目根目录下,你边能对开箱即用的 Maven 的运行机制进行调整。比如,你可以创建一个extensions.xml,允许将插件添加到构建时(采用核心扩展特性),然后依次通过插件来调用构建过程。如要让上面的 YAML 构建生效,你的.mvn/extensions.xml 需要像下面这样:

<?xml version="1.0" encoding="UTF-8"?>
<extensions>
  <extension>
    <groupId>io.takari.polyglot</groupId>
    <artifactId>polyglot-yaml</artifactId>
    <version>0.1.5</version>
  </extension>
</extensions>

这段代码将触发对 YAML 文件的加载,然后构造 Maven 项目模型以便构建能够开始。可以采用任何工具来处理构建文件的内容;在对 JRuby 的处理中,会执行 Ruby 程序来计算依赖并设置需要的构建插件。

通过将构建过程委派给知道如何产生内容的工具,从而能导出编译内容的结果(以及生成的 pom.xml 文件),这个 pom.xml 文件可以简化为只用来代表项目的运行时依赖,从而兼容其它知道如何从这个被上传到仓库中的 pom.xml 中解析出依赖的工具。这样它在给予 Gradle 或 Ant 以灵活性的同时,还能支持将标准处理工具导出到插件扩展。

另外,还能用核心扩展来为 Maven 命令行添加默认选项。比如,如果 Maven 项目需要比默认配置更大的堆,你无须在每个调用过程中指定 -Xmx(或让用户设置MAVENOPTS 或 JAVAOPTIONS 变量),你可以在项目根目录添加 .mvn/jvm.config 文件,指定 JVM 需要的参数。

-Xmx2048m -Xverify:none -Djava.awt.headless=true

另外你还可以为 Maven 命令行选项设置参数,比如添加下面的代码到.mvn/maven.config,你便可以非常简洁地来调用多线程构建:

--threads 2C --quiet

当你每次从命令行运行 Maven 的时候,这些参数将被添加到所有参数的前面,这样你能让开发者们(以及服务器)的每次构建过程都保持一致。

Polyglot 和核心扩展特性需要 Maven 3.3.1 或以上版本,现已可以从maven.apache.org 网站上下载

查看英文原文:Maven Escapes from XML


感谢赵震一对本文的审校。

给InfoQ中文站投稿或者参与内容翻译工作,请邮件至editors@cn.infoq.com。也欢迎大家通过新浪微博(@InfoQ@丁晓昀),微信(InfoQ)关注我们,并与我们的编辑和其他读者朋友交流。

评价本文

专业度
风格

您好,朋友!

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

获得来自InfoQ的更多体验。

告诉我们您的想法

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

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

那我为什么不直接用gradle? by Zeng Abrams

RT

换成YAML也是换汤不换药 by He Jonathan

使用Gradle

允许的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通知我

2 讨论

登陆InfoQ,与你最关心的话题互动。


找回密码....

Follow

关注你最喜爱的话题和作者

快速浏览网站内你所感兴趣话题的精选内容。

Like

内容自由定制

选择想要阅读的主题和喜爱的作者定制自己的新闻源。

Notifications

获取更新

设置通知机制以获取内容更新对您而言是否重要

BT