11 月 19 - 20 日 Apache Pulsar 社区年度盛会来啦,立即报名! 了解详情
写点什么

Maven 开始逃离 XML 阵营

  • 2015-03-26
  • 本文字数:1681 字

    阅读完需:约 6 分钟

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)关注我们,并与我们的编辑和其他读者朋友交流。

2015-03-26 07:088477
用户头像

发布了 164 篇内容, 共 98.0 次阅读, 收获喜欢 384 次。

关注

评论

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

以产业区块链提升数字化转型质量

CECBC

7款神器,让程序员幸福感暴增!

Jackpop

一文掌握Java TreeMap与HashMap

Jackpop

模块八作业-设计消息队列存储消息数据的 MySQL 表格

张大彪

区块链+游戏资产所有权,将如何激活游戏经济的发展?

CECBC

阿里P8大佬亲自教你!2021Android进阶者的新篇章

欢喜学安卓

android 程序员 面试 移动开发

MapReduce 设计构思

五分钟学大数据

7月日更

模块8作业

薛定谔的指南针

架构实战营

网络攻防学习笔记 Day71

穿过生命散发芬芳

网络攻防 7月日更

Redis - Cluster - 源码阅读(二)

旺仔大菜包

redis

Python OpenCV 之图像金字塔,高斯金字塔与拉普拉斯金字塔

梦想橡皮擦

7月日更

10条让开发者受益终生的编码原则

Jackpop

职场中的换位思考,看这篇就够了

石云升

职场经验 7月日更 换位思考

市场总局禁止虎牙斗鱼合并:抵制互联网行业垄断行为

石头IT视角

模块七作业-王者荣耀商城异地多活架构设计

张大彪

极光开发者周刊【No.0709】

极光JIGUANG

用三国杀讲分布式算法,舒适了吧?

悟空聊架构

分布式 PAXOS 7月日更 三国杀 拜占庭

架构实战训练营 - 模块八课后作业

Johnny

架构实战营

架构实战营 模块二作业

孫影

架构实战营 #架构实战营

阿里P8大佬整理!2021最新阿里Android面试流程

欢喜学安卓

android 程序员 面试 移动开发

【极光笔记】iOS 15推送新特性初探

极光JIGUANG

dubbogo 凌烟阁之 望哥

apache/dubbo-go

Spring中这么重要的AnnotationAwareAspectJAutoProxyCreator类是干嘛的?

冰河

spring aop ioc springboot Spring注解

智能重排序在推荐场景中的应用(三十四)

数据与智能

推荐系统 排序 智能

高性能架构

编号94530

Java 架构设计 高性能

【LeetCode】H 指数Java题解

Albert

算法 LeetCode 7月日更

Facebook工程经验--PCIe故障监控和修复

俞凡

架构 大厂实践

Goroutine 是如何运行的

Rayjun

调度器 Go 语言

dubbogo 凌烟阁之 方银城

apache/dubbo-go

自建开发工具系列-Webkit内存动量监控UI(三)

Tim

MVP

hdfs 中 datanode 工作机制以及数据存储

大数据技术指南

hdfs 7月日更

Maven开始逃离 XML 阵营_Java_Alex Blewitt_InfoQ精选文章