pom.xml中pom全称_摆脱pom XML…几乎
pom.xml中pom全稱
介紹
POM文件是XML格式的文件,聲明性地描述了要使用Maven構建的Java項目的構建結構。 維護大型Java項目的POM XML文件通常很麻煩。 XML是冗長的,POM的結構也需要維護冗余信息。 多次對工件進行命名是多余的,在groupId和artifactId重復名稱的某些部分。 如果是多模塊項目,則項目的版本應出現在許多文件中。 使用父pom中定義的屬性可以減少某些重復,但是您仍然必須在每個模塊pom中定義父pom版本,因為您通過工件坐標引用了POM,而不僅僅是將其稱為“ pom”。在父目錄中”。 依賴項和插件的參數可以在pluginManagement和dependency管理的父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宏還可以省略groupId , artifactId或version ,因此
{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導入或包含的文件)。 其中包含宏的定義,例如GAV , dependencies , dependency和許多其他定義。 您可以從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全稱
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的pom.xml中pom全称_摆脱pom XML…几乎的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: cassandra数据备份_Cassan
- 下一篇: xml json 比较_JSON和XML