使用flatten-maven-plugin對發布的POM進行精簡


使用maven開發的模塊化應用,可以發布出去供他人使用,比如各種開源庫,使用時,要么是繼承,要么是以依賴的形式引入。但我們看各種庫的pom.xml文件,通常都比較簡單,一般只有一些必要的依賴信息,作為開發者,通常認為使用者也就需要這些信息。但是真正開發時,對應模塊的pom可能比較復雜,可能要使用各種插件,引用各種依賴,組件間有繼承關系,甚至根據不同的參數走不同的分支,即使用profile機制等,maven默認在部署時,會保留對應模塊中的pom的所有信息,不會做改動。這樣就給模塊的發布帶來了一定的麻煩,如果直接發布這樣的pom.xml,是可能給使用者造成干擾的,出了問題又很難進行定位。

解決這個問題有很多的做法,比如構建兩個工程,一個用於開發,一個用於版本發布,兩個工程的pom是不同的,這樣看上去也更符合軟件開發的常規流程,另外,也可以考慮禁用maven默認的deloy過程,然后直接調用deploy:deploy-file單獨部署某個文件。總之,不管怎樣,辦法肯定是有的。

而本文的目的,是想介紹一種新的方式,來優雅地解決這個問題,也許實際開發中並不需要這樣做。

具體做法是,使用社區專門針對這個問題開發的插件,即Maven Flatten Plugin,這個插件使用起來非常簡單,如下:

<plugins> <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>flatten-maven-plugin</artifactId> <version>1.0.0</version> <configuration> </configuration> <executions> <execution> <id>flatten</id> <phase>process-resources</phase> <goals> <goal>flatten</goal> </goals> </execution> </executions> </plugin> </plugins> 

這個插件的作用是,生成一個壓縮版的pom.xml文件,然后在installdeploy階段使用壓縮后的pom.xml文件,替換原來的pom.xml文件,具體壓縮策略如下:

  • 和構建有關的元素會被刪除;
  • 和開發有關的元素默認會被刪除;
  • 只包含構件的使用者必須的一些信息;
  • 變量會被解析;
  • 上級關系會被解析,然后被壓縮刪除;
  • 構建時實際使用的profile會被評估,視情況處理;
  • 由JDK或者OS驅動的profile會被保留,需要時可以動態地控制依賴。

在默認的壓縮邏輯下,插件如何處理各種元素,可以看這里。 下面會重點介紹如何通過各種參數來控制壓縮的過程:

屬性名 類型 描述
embedBuildProfileDependencies Boolean 由OS或者JDK的不同而觸發的profile,可能根據環境的不同而產生不同的依賴,但是由屬性等觸發的profile,就不確定了,如果屬性設置為true,profile中的依賴會直接寫入生成的pom中,如果設置為false,所有的profile信息都會保留,默認是false
flattenMode FlattenMode 插件預定義了若干種壓縮模式,下面會詳述。
flattenedPomFilename String 生成的壓縮后的pom.xml文件的文件名,默認為.flattened-pom.xml
outputDirectory File 生成的壓縮后的pom.xml文件的存放位置,默認為${project.basedir}
pomElements FlattenDescriptor 該元素定義了如何處理額外的元素,如果可能,盡量使用flattenMode,這個元素僅僅用於進一步提高靈活性,它可以控制具體的某個元素是保留還是刪除,比如要指定刪除repositories,可以這樣:<pomElements><repositories>flatten</repositories></pomElements>
updatePomFile Boolean 插件默認只會處理packaging屬性為非pom的,如果要處理packagingpom的,可將本屬性值設置為true

插件預定義了若干種模式,可以滿足若干種常見的場景,這些模式定義在org.codehaus.mojo.flatten.FlattenMode枚舉中,具體可以看代碼,本文簡單描述如下:

模式 描述
minimum 不推薦使用,會展開pluginRepositories
bom 會保留dependencyManagement,展開properties
oss 推薦開源項目使用,會展開ciManagementcontributorsdistributionManagementinceptionYearissueManagementmailingListsorganizationprerequisites
ossrh 會展開namedescriptionurlscmdevelopers
defaults 會展開repositories
clean 刪除全部可選元素

具體可以看FlattenMode的javadoc。

http://www.mojohaus.org/flatten-maven-plugin/examples/example-multiple-versions.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM