Maven,这个过去数十来年 Java 应用构建工具的事实标准,已经学会了处理非 XML 写成的构建文件。我们熟知的 polyglot maven ,可以通过使用插件来将它的 pom.xml 构建文件的表达方式替换为另一种语言。 polyglot-maven-examples 这个示例源码包含了替换为 Atom 、 Scala 、 Groovy 和 YAML 版本的构建文件。基于 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(或让用户设置MAVEN_OPTS 或 JAVA_OPTIONS 变量),你可以在项目根目录添加 .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)关注我们,并与我们的编辑和其他读者朋友交流。
评论