使用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文件,然后在install和deploy階段使用壓縮后的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的,如果要處理packaging為pom的,可將本屬性值設置為true。 |
插件預定義了若干種模式,可以滿足若干種常見的場景,這些模式定義在org.codehaus.mojo.flatten.FlattenMode枚舉中,具體可以看代碼,本文簡單描述如下:
| 模式 | 描述 |
|---|---|
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。http://www.mojohaus.org/flatten-maven-plugin/examples/example-multiple-versions.html
