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

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

解決這個問題有不少的作法,好比構建兩個工程,一個用於開發,一個用於版本發佈,兩個工程的pom是不一樣的,這樣看上去也更符合軟件開發的常規流程,另外,也能夠考慮禁用maven默認的deloy過程,而後直接調用deploy:deploy-file單獨部署某個文件。總之,無論怎樣,辦法確定是有的。java

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

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

<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文件,具體壓縮策略以下:maven

  • 和構建有關的元素會被刪除;
  • 和開發有關的元素默認會被刪除;
  • 只包含構件的使用者必須的一些信息;
  • 變量會被解析;
  • 上級關係會被解析,而後被壓縮刪除;
  • 構建時實際使用的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枚舉中,具體能夠看代碼,本文簡單描述以下:ui

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

具體能夠看FlattenMode的javadoc。url

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

相關文章
相關標籤/搜索