使用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文件,而後在install
和deploy
階段使用壓縮後的pom.xml文件,替換原來的pom.xml文件,具體壓縮策略以下:maven
在默認的壓縮邏輯下,插件如何處理各類元素,能夠看這裏。 下面會重點介紹如何經過各類參數來控制壓縮的過程:模塊化
屬性名 | 類型 | 描述 |
---|---|---|
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 的,若是要處理packaging 爲pom 的,可將本屬性值設置爲true 。 |
插件預約義了若干種模式,能夠知足若干種常見的場景,這些模式定義在org.codehaus.mojo.flatten.FlattenMode
枚舉中,具體能夠看代碼,本文簡單描述以下:ui
模式 | 描述 |
---|---|
minimum |
不推薦使用,會展開pluginRepositories 。 |
bom |
會保留dependencyManagement ,展開properties 。 |
oss |
推薦開源項目使用,會展開ciManagement 、contributors 、distributionManagement 、inceptionYear 、issueManagement 、mailingLists 、organization 、prerequisites |
ossrh |
會展開name 、description 、url 、scm 、developers |
defaults |
會展開repositories |
clean |
刪除所有可選元素 |
具體能夠看
FlattenMode
的javadoc。urlhttp://www.mojohaus.org/flatten-maven-plugin/examples/example-multiple-versions.htmlspa