摆脱pom XML…几乎

介绍

POM文件是XML格式的文件,声明性地描述了要使用Maven构建的Java项目的构建结构。 维护大型Java项目的POM XML文件通常很麻烦。 XML是冗长的,POM的结构也需要维护冗余信息。 多次对工件进行命名是多余的,在groupIdartifactId重复名称的某些部分。 如果是多模块项目,则项目的版本应出现在许多文件中。 使用父pom中定义的属性可以减少某些重复,但是您仍然必须在每个模块pom中定义父pom版本,因为您通过工件坐标引用了POM,而不仅仅是将其称为“ pom”。在父目录中”。 依赖项和插件的参数可以在pluginManagementdependency管理的父POM中pluginManagement ,但是尽管每个模块POM通常都是相同的,但您仍然无法摆脱每个模块POM中的插件和依赖项列表。

您可能会与我争论,因为这也是您的口味问题,但是对我来说,XML格式的POM文件太多余了,很难阅读。 也许我不够细致,但是很多时候我都错过了POM文件中的某些错误,并且很难修复它们。

有一些技术可以支持其他格式,但是并未广泛使用。 一种摆脱XML的方法是Poyglot Maven 。 但是,如果您在第一个示例(即Ruby格式的POM)上查看Github页面,您仍然可以看到很多重复的信息。 这是因为Polyglot Maven插入了Maven本身,并且仅将XML格式替换为其他格式,但是无助于POM结构本身的冗余。

在本文中,我将介绍一种比其他解决方案更好的方法,POM文件在构建过程中仍然是XML,因此不需要任何新的插件或更改构建过程,而是使用这些pom.xml文件是使用Jamal宏语言从pom.xml.jam文件以及模块共享的一些其他宏文件生成的。

贾马尔

这个想法是使用基于文本的宏语言从某些源文件生成XML文件,该源文件包含相同的信息(一种简化格式)。 这是某种编程。 宏描述是一个输出详细XML格式的程序。 当宏语言足够强大时,源代码就可以具有足够的描述性,而又不会太冗长。 我的选择是贾马尔。 老实说,选择Jamal的原因之一是它是我大约20年前使用Perl开发的宏语言,而半年前我在Java中重新实现了它。

语言本身非常简单。 文本和宏混合在一起,输出是文本和宏的结果。 宏以{字符或配置的任何其他字符串开头,并以相应的}字符或配置为结束字符串的字符串结尾。 宏可以嵌套,并且可以很好地控制应评估嵌套宏的顺序。 有用户定义的内置宏。 define宏是内置宏之一,用于定义用户定义的宏。

一个例子说得更好。 让我们看一下下面的test.txt.jam文件。

 {@define GAV(_groupId,_artifactId,_version)= { #if |_groupId|<groupId>_groupId</groupId>} { #if |_artifactId|<artifactId>_artifactId</artifactId>} { #if |_version|<version>_version</version>}  }  {GAV :com.javax0.geci:javageci-parent:1.1.2-SNAPSHOT} 

用贾马尔处理它,我们将得到

 <groupId>com.javax0.geci< /groupId > <artifactId>javageci-parent< /artifactId > <version>1.1.2-SNAPSHOT< /version > 

尽管出于排版原因,我还是手动删除了空行,但是您有一个大致的了解。 GAV是使用内置宏define 。 它具有三个名为_groupId_artifactId_version 。 使用宏时,宏主体中的格式参数名称将替换为实际值,并在文本中替换用户定义的宏。 define内置宏本身的文本是一个空字符串。 何时在内置宏前面使用@以及何时使用#有特殊含义,但是在本文中,我无法深入探讨这一细节。

if宏还可以省略groupIdartifactIdversion ,因此

 {GAV :com.javax0.geci:javageci-parent:} 

也可以并且会产生

 <groupId>com.javax0.geci< /groupId > <artifactId>javageci-parent< /artifactId > 

如果您觉得宏的定义中仍然有很多冗余之处,那就对了。 这是定义GAV的简单方法,但是您可以走极端:

 { #define GAV(_groupId,_artifactId,_version)= {@ for z in (groupId,artifactId,version)= { #if |_z|<z>_z</z>} }  }{GAV :com.javax0.geci:javageci-parent:} 

请注意,这需要对宏观评估顺序有一个疯狂的了解,但是作为示例,它表明了这种力量。 关于Jamal的更多信息https://github.com/verhas/jamal

让我们回到原始主题:如何使用Jamal维护POM文件。

烹饪pom果酱

可以有很多方法,每种方法都可能很好。 在这里,我描述了用于Java :: Geci项目的第一种方法。 我创建一个pom.jim文件( jim代表Jamal导入或包含的文件)。 它包含宏的定义,例如GAVdependenciesdependency和许多其他定义。 您可以从Java :: Geci源代码存储库下载该文件: https : pom.jim文件对于所有项目都可以相同,其中没有任何特定的项目。 还有一个version.jim文件,其中包含一个宏,该宏在一个地方定义了项目版本,我在项目中使用的Java版本以及项目的groupId。 当我将发行版号从-SNAPSHOT到下一个发行版或从发行版扩展到下一个-SNAPSHOT这是唯一需要更改它的地方,并且该宏可用于引用顶级POM中的项目版本? 而且在模块POM中引用父对象。

在每个目录中都应该有一个pom.xml文件的地方,我创建了一个pom.xml.jam文件。 该文件导入pom.jim文件,因此可以在其中使用定义的宏。 作为示例,Java :: Geci javageci-engine模块pom.xml.jam文件如下:

 {@ import .. /pom .jim}  {project |jar| {GAV ::javageci-engine:{VERSION}} {parent :javageci-parent} {name|javageci engine} {description|Javageci macro library execution engine} {@include .. /plugins .jim} {dependencies # {@ for MODULE in (api,tools,core)= {dependency :com.javax0.geci:javageci-MODULE:}} {@ for MODULE in (api,engine)= {dependency :org.junit.jupiter:junit-jupiter-MODULE:}} }  } 

我认为这是相当可读的,至少对我而言,它比原始pom.xml更具可读性:

<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://maven.apache.org/POM/4.0.0"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><packaging>jar</packaging><artifactId>javageci-engine</artifactId><version>1.1.1-SNAPSHOT</version><parent><groupId>com.javax0.geci</groupId><artifactId>javageci-parent</artifactId><version>1.1.1-SNAPSHOT</version></parent><name>javageci engine</name><description>Javageci macro library execution engine</description><build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-surefire-plugin</artifactId></plugin><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-source-plugin</artifactId></plugin><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-javadoc-plugin</artifactId></plugin></plugins></build><dependencies><dependency><groupId>com.javax0.geci</groupId><artifactId>javageci-api</artifactId></dependency><dependency><groupId>com.javax0.geci</groupId><artifactId>javageci-tools</artifactId></dependency><dependency><groupId>com.javax0.geci</groupId><artifactId>javageci-core</artifactId></dependency><dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter-api</artifactId></dependency><dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter-engine</artifactId></dependency></dependencies>
</project>

要启动Jamal,我可以使用Jamal Maven插件。 为此,最简单的方法是在根目录中包含genpom.xml POM文件,其内容为:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://maven.apache.org/POM/4.0.0"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.javax0.jamal</groupId><artifactId>pom.xml_files</artifactId><version>out_of_pom.xml.jam_files</version><build><plugins><plugin><groupId>com.javax0.jamal</groupId><artifactId>jamal-maven-plugin</artifactId><version>1.0.2</version><executions><execution><id>execution</id><phase>clean</phase><goals><goal>jamal</goal></goals><configuration><transformFrom>\.jam$</transformFrom><transformTo></transformTo><filePattern>.*pom\.xml\.jam$</filePattern><exclude>target|\.iml$|\.java$|\.xml$</exclude><sourceDirectory>.</sourceDirectory><targetDirectory>.</targetDirectory><macroOpen>{</macroOpen><macroClose>}</macroClose></configuration></execution></executions></plugin></plugins></build>
</project>

有了这个,我可以使用命令行mvn -f genpom.xml clear启动Maven。 这不仅会创建所有POM文件,而且会清除项目的先前编译结果,这在更改POM文件时可能是个好主意。 当目录中还没有pom.xml时,或者由于果酱煮熟的POM文件中可能存在某些错误而导致文件无效时,也可以执行该命令。 不幸的是,所有递归都必须在某处结束,尽管将genpom.xml为果酱熟的POM文件是可行的,但这是不可行的。

摘要

我所描述的是一种使用宏语言作为源而不是原始编辑pom.xml文件的方法。 优点是项目定义更短,更简单。 缺点是需要额外的POM生成步骤,这是手动操作,而不是构建过程的一部分。 您还失去了直接使用Maven版本插件的可能性,因为该插件会修改POM文件。 我自己在使用该插件时总是遇到问题,但这可能是我的错误,而不是该插件的错误。 另外,您必须学习一些Jamal,但是如果您碰巧喜欢它,那也可能是一个优势。 简而言之:如果您愿意,可以尝试一下。 由于该工具(Jamal)已发布在中央genpom.xml ,因此启动非常容易,因此源代码和文档均位于Github上,因此,您所需genpom.xml只是制作genpom.xml文件,煮一些果酱并启动插件。

POM文件不是可以随果酱一起提供的唯一源文件。 我可以轻松想象在产品文档中使用Jamal宏。 您需要做的是创建一个documentationfile.md.jam文件作为源文件,并修改主POM以在将.md.jam转换为生成的宏处理的降价文档的生成过程中运行Jamal。 您也可以像本文中一样设置单独的POM,以防您严格执行转换。 如果您想为Java文件准备一个预处理器,甚至可以拥有java.jam文件,但是我请您不要这样做。 我不想因为给你贾马尔而在地狱里燃烧着永恒的火焰。 不是为了这个目的。

Jamal还有其他许多可能的用途。 它是一种功能强大的宏语言,易于嵌入到应用程序中,并且易于使用Java编写的宏进行扩展。 Java :: Geci还具有一个1.0版本的模块,该模块支持Jamal来简化代码生成,但仍然缺少一些计划通过反射实现Java代码结构的内置宏。 我也在考虑开发一些简单的宏来读取Java源文件并将其包含在文档中。 当我在其中取得一些结果时,我会写。

如果您有任何想法可以使用该技术,请随时与我联系。

翻译自: https://www.javacodegeeks.com/2019/03/get-rid-pom-xml-almost.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/342876.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

无线网状网、Zigbee、RFID三种技术分析

而今&#xff0c;网络技术的发展让这一预想有机会得以实现&#xff1a;无线网状网&#xff08;又称为自组织网络&#xff09;可以构建多点对多点的网络架构、ZigBee技术完成定位感知系统、RFID技术则负责部署网络的信息节点&#xff0c;这三者的融合将实现一个无所不在的信息网…

基于CSMA/CA无线传感器网络的MAC层研究

1、无线传感器网络简介及发展现状 无线传感器网络是嵌入式系统、无线通信技术、网络技术及微机电系统等学科互相融合、渗透而产生的新技术&#xff0c;广泛使用在军事国防领域、环境监测、交通管理、医疗健康、工商服务、反恐抗灾等诸多领域&#xff0c;几乎涵盖了生活中的方方…

什么是ERPS?ERPS有什么作用?

ERPS&#xff08;Ethernet Ring Protection Switching&#xff0c;以太环保护切换协议&#xff09;为ITU 开发的一种环网保护协议&#xff0c;也称G.8032。它是一个专门应用于以太环网的链路层协议。它在以太环网完整时能够防止数据环路引起的广播风暴&#xff0c;而当以太环网…

王者体验服服务器注册人数已满,王者荣耀体验服注册人数达到上限怎么回事?体验服测试最新申请方法...

王者荣耀体验服测试资格申请已经改版了&#xff0c;不知各位玩家有没有注意到&#xff0c;在体验服申请官网上已经去掉了上期体验服申请时间吗&#xff0c;官方不再是不定期的开启测试资格申请&#xff0c;而是更改为可实时申请了&#xff0c;对于一直都没有体验服号的玩家来说…

电源模块的安全设计和热设计

1 标准要求 电源模块在保险丝、保护地、开关处必须按照安规要求明确标志规格和符号&#xff0c;能够触及的危险电压和能量贴危险警告标识。 2 材料要求 电源模块设计输入的L、N、FG连接线分别使用褐色、蓝色和黄绿色导线。属于依靠基本绝缘加保护地防电击的设备&#xff08;Ⅰ类…

jsonp解决ajax跨域问题,用JSONP解决ajax跨域问题

JSONP:JSON With Padding要点&#xff1a;1.script标签2.用script标签加载资源是没有跨域问题的概要&#xff1a;在资源加载进来之前先定义一个函数&#xff0c;这个函数接受一个参数(数据)&#xff0c;函数里面利用这个参数做一些事情。然后在需要的时候通过script标签加载对应…

[渝粤教育] 广东-国家-开放大学 21秋期末考试社会学概论10082k1

1、社会问题是由多种因素复合而成的&#xff0c;这体现了社会问题的&#xff08;&#xff09;。&#xff08;4 分&#xff09; A&#xff0e;复杂性 B&#xff0e;时空性 C&#xff0e;破坏性 D&#xff0e;普遍性 2、从&#xff08;&#xff09;角度出发可以将社会关系划分为血…

AC-DC电源模块设计原理及10个常见疑问

01 输入和输出-地 输入接地&#xff1a;AC-DC模块电源输入端一般有3个引脚&#xff0c;火线L、零线N、保护地FG&#xff0c;FG通常和设备的机壳或电网中的地线连接。 输出接地&#xff1a;隔离型模块的输入地和输出地是不能直接相连&#xff0c;这样会失去隔离模块的意义&#…

java 8 新功能详解_Java 8的8个新功能

java 8 新功能详解注意&#xff1a;确保还检查了我们的详细教程Java 8 Features – ULTIMATE Guide 。 Jdk 1.8&#xff08;又名Java 8&#xff09;今天发布&#xff0c;这意味着它的通用发布版本已经公开发售&#xff0c;开发人员可以从早期版本转换为经过测试的版本以用于生…

什么是串口服务器?串口服务器都用在哪些领域?

我们知道串口服务器在实际应用中是很广泛的&#xff0c;那么&#xff0c;你知道什么是串口服务器吗&#xff1f;串口服务器该如何使用呢&#xff1f;今天&#xff0c;就由飞畅科技的小编来为大家详细介绍下什么是串口服务器以及串口服务器怎么使用&#xff1f;一起来看看吧 一…

[渝粤教育] 广东-国家-开放大学 互联网营销概论

1、品牌最基本的含义是品牌代表着特定的&#xff08;&#xff09;。&#xff08;2 分&#xff09; A&#xff0e;消费者类型 B&#xff0e;商品属性 C&#xff0e;利益 D&#xff0e;文化 2、网上竞价模式主要有&#xff08; &#xff09;。&#xff08;2 分&#xff09; A&…

超全超详细AC-DC电源模块测试教程!

一、 AC-DC电源模块典型应用电路 *备注&#xff1a;我司产品内部EMC相关电路&#xff0c;用户无需在外设额外增加器件&#xff0c;应用简单。 二、AC-DC电源模块基本测试方法 基本性能测试 测试仪器-参考&#xff1a;输入电压范围足够大的交流可调稳压电源&#xff0c;电流表A&…

fate服务器维护,活动维护公告(2020年4月1日 14时)

我们将于以下时间&#xff0c;对游戏服务器实施临时维护&#xff0c;在维护期间&#xff0c;将暂时无法进行游戏。因此给各位御主带来不便&#xff0c;敬请谅解。今后也请继续支持「Fate/Grand Order」。【维护时间】2020年4月1日 14:00 &#xff5e; 4月1日 19:00(预计)【维护…

HDMI切换器的各种版本能不能互通?

近几年来&#xff0c;随着高清技术的发展&#xff0c;HDMI渐渐被人们所熟知&#xff0c;受到青睐&#xff0c;许多电子产品都用到了HDMI接口&#xff0c;对于HDMI版本的更新&#xff0c;烨然很多人产生这样的疑问&#xff0c;HDMI切换器的版本能不能互通。接下来我们就跟随飞畅…

【渝粤教育】 广东开放大学21秋期末考试劳动和社会保障法10682k2

1、《集体合同规定》第3条的规定&#xff0c;集体合同是指用人单位与本单位职工根据法律、法规、规章的规定&#xff0c;就劳动报酬、工作时间、休息休假、劳动安全卫生、职业培训、保险福利等事项通过集体协商签订的书&#xff08;&#xff09;。 &#xff08;3 分&#xff09…

AC-DC电源模块怎么选择?有哪些注意事项?

一、AC-DC电源模块产品选型 首先确定电源的规格&#xff0c;根据实际需求的指标进行筛选&#xff0c;确定使用标准电源模块还是非标&#xff0c;非标电源可按需求定制生产。 *备注&#xff1a;选型框架图会随成都亿佰特电子科技有限公司的持续发展并更新 01 、选择输入电压类型…

Java equals()和hashCode()

介绍&#xff1a; Java Object类提供了方法的基本实现– hashCode&#xff08;&#xff09;和equals&#xff08;&#xff09;。 这些方法非常有用&#xff0c;尤其是在使用Collection框架时。 哈希表实现依赖于这些方法来存储和检索数据。 在本教程中&#xff0c;我们将学习h…

基于CSMA -CA协议的无线星型网络的应用案例介绍

1、CSMA/CA特点 在无线网络通信中&#xff0c;一种被称为CSMA/CA的协议解决了上诉数据冲突问题&#xff0c;CSMA&#xff08;Carrier Sense Multiple Access&#xff09;&#xff0c;中文为冲突避免的载波侦听多路访问&#xff0c;具体工作方式为&#xff0c;发送数据前&#x…

4G物联网网关和工业路由器的区别

网关和路由器是数据通信行业被广泛使用的通信设备&#xff0c;它们都是网络连接的组成部分。那么&#xff0c;4G物联网网关和传统工业路由器有哪些区别呢&#xff1f;接下来飞畅科技的小编就来为大家详细介绍下4G物联网网关和工业路由器的区别&#xff0c;一起来看看吧&#xf…

服务器系统日志有哪些centos,CentOS 分析服务器日志命令

# 分析日志文件下 2012-05-04 访问页面最高 的前20个 URL 并排序cataccess.log |grep 04/May/2012| awk {print $11}|sort|uniq -c|sort -nr|head -20# 查询受访问页面的URL地址中 含有 www.abc.com 网址的 IP 地址cataccess_log | awk ($11~/www.abc.com/){print $1}|sort|uni…