讀古今文學網 > Maven實戰 > 14.1 Maven屬性 >

14.1 Maven屬性

前面的章節已經簡單介紹過Maven屬性的使用,例如在5.9.2節有如代碼清單14-1所示的代碼。

代碼清單14-1 使用Maven屬性歸類依賴

這可能是最常見的使用Maven屬性的方式,通過<properties>元素用戶可以自定義一個或多個Maven屬性,然後在POM的其他地方使用${屬性名稱}的方式引用該屬性,這種做法的最大意義在於消除重複。例如,代碼清單14-1中本來需要在多個地方重複聲明同樣的SpringFramework版本,現在只在一個地方聲明就可以,重複越多,好處就越明顯。因為這樣不僅減少了日後升級版本的工作量,也能降低錯誤發生的概率。

這不是Maven屬性的全部,事實上這只是6類Maven屬性中的一類而已。這6類屬性分別為:

·內置屬性:主要有兩個常用內置屬性——${basedir}表示項目根目錄,即包含pom.xml文件的目錄;${version}表示項目版本。

·POM屬性:用戶可以使用該類屬性引用POM文件中對應元素的值。例如${project.artifactId}就對應了<project><artifactId>元素的值,常用的POM屬性包括:

■${project.build.sourceDirectory}:項目的主源碼目錄,默認為src/main/java/。

■${project.build.testSourceDirectory}:項目的測試源碼目錄,默認為src/test/java/。

■${project.build.directory}:項目構建輸出目錄,默認為target/。

■${project.outputDirectory}:項目主代碼編譯輸出目錄,默認為target/classes/。

■${project.testOutputDirectory}:項目測試代碼編譯輸出目錄,默認為target/test-classes/。

■${project.groupId}:項目的groupId。

■${project.artifactId}:項目的artifactId。

■${project.version}:項目的version,與${version}等價。

■${project.build.finalName}:項目打包輸出文件的名稱,默認為${project.artifactId}-${project.version}。

這些屬性都對應了一個POM元素,它們中一些屬性的默認值都是在超級POM中定義的,可以參考8.5節。

·自定義屬性:用戶可以在POM的<properties>元素下自定義Maven屬性。例如:

然後在POM中其他地方使用${my.prop}的時候會被替換成hello。

·Settings屬性:與POM屬性同理,用戶使用以settings.開頭的屬性引用settings.xml文件中XML元素的值,如常用的${settings.localRepository}指向用戶本地倉庫的地址。

·Java系統屬性:所有Java系統屬性都可以使用Maven屬性引用,例如${user.home}指向了用戶目錄。用戶可以使用mvn help:system查看所有的Java系統屬性。

·環境變量屬性:所有環境變量都可以使用以env.開頭的Maven屬性引用。例如${env.JAVA_HOME}指代了JAVA_HOME環境變量的值。用戶可以使用mvn help:system查看所有的環境變量。

正確使用這些Maven屬性可以幫助我們簡化POM的配置和維護工作,下面列舉幾個常見的Maven屬性使用樣例。

在一個多模塊項目中,模塊之間的依賴比較常見,這些模塊通常會使用同樣的groupId和version。因此這個時候就可以使用POM屬性,如代碼清單14-2所示。

代碼清單14-2 使用POM屬性配置依賴

在代碼清單14-2中,當前的模塊依賴於account-email和account-persist,這三個模塊使用同樣的groupId和version,因此可以在依賴配置中使用POM屬性${project.groupId}和${project.version},表示這兩個依賴的groupId和version與當前模塊一致。這樣,當項目版本升級的時候,就不再需要更改依賴的版本了。

大量的Maven插件用到了Maven屬性,這意味著在配置插件的時候同樣可以使用Maven屬性來方便地自定義插件行為。例如從10.6節我們知道,maven-surefire-plugin運行後默認的測試報告目錄為target/surefire-reports,這實際上就是${project.build.directory}/surefire-reports,如果查閱該插件的文檔,會發現該插件提供了reportsDirectory參數來配置測試報告目錄。因此如果想要改變測試報告目錄,例如改成target/test-reports,就可以像代碼清單14-3這樣配置。

代碼清單14-3 使用Maven屬性配置插件

從上面的內容中可以看到,Maven屬性能讓我們在POM中方便地引用項目環境和構建環境的各種十分有用的值,這是創建靈活構建的基礎。下面將會結合profile和資源過濾,展示Maven能夠為構建提供的更多的可能性。