pom.xml中pom全称_摆脱pom XML…几乎

pom.xml中pom全称

介绍

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} 

用Jamal处理它,我们将得到

 <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)已发布在中央存储库中,其源代码和文档位于Github上,因此,您所需genpom.xml只是制作genpom.xml文件,煮一些果酱并启动插件。

POM文件不是唯一可以与果酱一起使用的源文件。 我可以轻松想象在产品文档中使用Jamal宏。 您所需.md.jam就是创建一个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

pom.xml中pom全称

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

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

相关文章

IntelliJ IDEA for Mac中Maven菜单用法详解

Reload project 你如果修改了 pom.xml 文件&#xff0c;可以点击这个按钮重载 Maven 项目&#xff0c;重载过程会引入新的依赖&#xff0c;会删除不需要的依赖。 Generate Sources and Update Folders 这个按钮是将 src/main/resources 和 src/test/resources 的资源文件编译…

sql 注射_只能在测试中注射吗?

sql 注射本文是关于测试设计和可测试性的一些想法。 我们与我的儿子讨论了一些问题&#xff0c;他的儿子是Java的初级开发人员&#xff0c;目前在匈牙利的EPAM&#xff08;我工作的同一家公司&#xff0c;但在另一家公司工作&#xff09;受雇并学习。 本文中的所有内容都是很好…

IntelliJ IDEA查看方法在哪里被调用(Method Usage Search/Method Call Hierarchy)

文章目录Usage SearchCall Hierarchy区别Usage Search 搜索使用的地方&#xff0c;快捷键如下&#xff1a; 你可以把光标移到方法名称处&#xff0c;然后点击右键&#xff0c;找到 Find Usages 菜单项&#xff0c;意思是“找到使用它的地方”。 例如我要查看哪些地方调用 f…

java编程学习方法_在线学习Java编程的最佳方法

java编程学习方法1.简介 Java是使用最广泛的编程语言之一。 根据Github的最新报告 &#xff0c;Java被列为仅次于JavaScript的第二大最常用的编程语言。 掌握Java的人有很多话题。 好消息是&#xff0c;您可以在线找到很多内容。 在这篇文章中&#xff0c;我们将对所有这些主题…

hibernate 标识符_Hibernate中的标识符

hibernate 标识符Hibernate中的标识符为实体的主键属性建模。 它有助于我们唯一地标识JPA实体。 每个实体都必须定义一个标识符。 同样&#xff0c;它可以是简单的也可以是复合的。 我们可以通过几种方式定义一个Hibernate标识符。 在本教程中&#xff0c;我们将学习如何做。 …

java中延迟_Java中的延迟分配

java中延迟程序员本质上是懒惰的&#xff0c;而similis simili gaudet就像程序是懒惰的一样。 您听说过延迟加载吗&#xff1f; 还是懒惰的单身人士&#xff1f; &#xff08;不过&#xff0c;我个人更喜欢单一麦芽版本。&#xff09;如果使用Scala或Kotlin&#xff08;这也是一…

camel apache_短款Apache Camel K

camel apache您可能已经看到我们在Camel K周围的Apache Camel社区中所做的工作。 Nicola于半年前在他的博客中介绍了Camel K &#xff0c; 就在几个月前&#xff0c;我们正在讨论一个新项目&#xff0c;该项目可以作为Apache Camel的一部分启动。 一个有可能改变人们处理集成方…

java 栈 队列 接口_Java队列接口

java 栈 队列 接口介绍&#xff1a; 队列是FIFO&#xff08;先进先出&#xff09;抽象数据类型&#xff08;ADT&#xff09;。 换句话说&#xff0c;按插入顺序将元素删除。 java.util.Queue是Java 中的接口&#xff0c;并且从java.util.Collection扩展。 一些常用的Queue实现…

jakarta ee_Jakarta EE 8状态

jakarta ee遵循Jakarta EE的人们可能知道即将发布的Jakarta EE 8在功能上将与Java EE 8等效。其原因是我们想证明从Oracle的传输已经完成&#xff0c;并且我们能够产生这些流程&#xff0c;规范&#xff0c;测试套件以及通过Eclipse Foundation的兼容实现。 到目前为止&#x…

IntelliJ IDEA如何查看接口的实现类以及如何查看被实现的接口

在接口的左边有个向下的小箭头&#xff0c;点击小箭头就能看到接口的实现类和方法的实现&#xff1a; 在实现类的左边有个向上的小箭头&#xff0c;可以查看被实现的接口和被覆盖重写的方法&#xff1a;

c#自定义控件资源释放问题_定义资源

c#自定义控件资源释放问题在Fielding的论文中 &#xff0c;资源描述为&#xff1a; “可以命名的任何信息”……“文档或图像&#xff0c;临时服务&#xff08;例如&#xff0c;“洛杉矶今天的天气”&#xff09;&#xff0c;其他资源的集合&#xff0c;非虚拟对象&#xff08…

MySQL数据库存入日期(java.sql.Date)数据,天数会少一天的问题

网络上给的解决办法&#xff1a; 这是数据库服务器时区的问题&#xff0c;即连接参数 serverTimezone 的问题&#xff0c;默认情况下 serverTimezoneUTC&#xff0c;改成 HongKong 或者 Asia/Shanghai 就可以了。如下所示&#xff1a; jdbc:mysql://localhost:3306/test?useU…

spring的bean范围_Spring Bean范围

spring的bean范围介绍&#xff1a; Spring核心容器实例化bean并管理其生命周期。 在定义bean时&#xff0c;我们可以提供其范围。 除非明确提供&#xff0c;否则单例是Spring容器中Bean的默认范围。 Spring提供了五种类型的bean作用域。 在本教程中&#xff0c;我们将探讨它们…

java.util.Date转换成java.sql.Date

// 获取当前的系统时间&#xff0c;以java.util.Date对象返回 Date dateUtil new Date(); // 获取当前的系统时间&#xff0c;以时间戳返回 long l System.currentTimeMillis();时间戳是指格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至现…

省编码市编码区县编码_无浪费编码

省编码市编码区县编码本文介绍了如何通过减少软件堆栈中的浪费来高效解决有意义的事件处理问题。 Java通常被视为无法在低内存环境中有效运行的内存猪。 目的是证明许多人认为不可能的事情&#xff0c;有意义的java程序几乎可以在没有内存的情况下运行。 示例流程 在Java的单…

Java日期时间字符串和毫秒相互转换的方法

参考链接&#xff1a; 1.https://www.jb51.net/article/130195.htm 2.https://blog.csdn.net/yhj19920417/article/details/73799842?locationNum10&fps1

谷歌本地不支持websocket_django开发-websocket的实现

今天介绍下如何在django中使用channels实现websocket。其实还可以使用dwebsocket实现websocket&#xff0c;这里不做介绍。首先介绍一个概念ASGI。ASGI异步网关协议接口&#xff0c;一个介于网络协议服务和Python应用之间的标准接口&#xff0c;能够处理多种通用的协议类型&…

我要正式开始《一个项目征服Java中高级体系》

在互联网上经常看到很多人说35岁危机的问题、大厂裁员、互联网寒冬这些问题。我感觉比较幸运的是&#xff0c;在之前大环境还不是很坏时候就被裁了一次&#xff0c;所以我很早就开始做持续的准备&#xff0c;现在不好说一定能怎么样&#xff0c; 至少自己在持续的探索适合自己的…

cuba 平台_CUBA 7的新功能

cuba 平台三年前&#xff0c;我们宣布了该框架的第二个公开可用的主要版本。 CUBA 6是改变游戏规则的版本–许可从专有转为Apache 2.0。 那些日子&#xff0c;我们甚至无法猜测从长远来看它将把框架带到哪里。 CUBA社区开始呈指数级增长&#xff0c;因此我们了解了开发人员如何…

java.util.Date详解

获取当前的系统时间&#xff1a; Date date new Date();获取毫秒数&#xff1a; long time date.getTime();毫秒数转成 Date 对象&#xff1a; long l 23434324324343L; Date date new Date(l);比较两个 Date 对象&#xff1a; SimpleDateFormat sdf new SimpleDateFo…