讀古今文學網 > Maven實戰 > 7.8.3 解析插件版本 >

7.8.3 解析插件版本

同樣是為了簡化插件的配置和使用,在用戶沒有提供插件版本的情況下,Maven會自動解析插件版本。

首先,Maven在超級POM中為所有核心插件設定了版本,超級POM是所有Maven項目的父POM,所有項目都繼承這個超級POM的配置,因此,即使用戶不加任何配置,Maven使用核心插件的時候,它們的版本就已經確定了。這些插件包括maven-clean-plugin、maven-compiler-plugin、maven-surefire-plugin等。

如果用戶使用某個插件時沒有設定版本,而這個插件又不屬於核心插件的範疇,Maven就會去檢查所有倉庫中可用的版本,然後做出選擇。讀者可以回顧一下第6.6節中介紹的倉庫元數據groupId/artifactId/maven-metadata.xml。以maven-compiler-plugin為例,它在中央倉庫的倉庫元數據為http://repo1.maven.org/maven2/org/apache/maven/plugins/maven-compiler-plugin/maven-metadata.xml,其內容見代碼清單7-9。

代碼清單7-9 maven-compiler-plugin的groupId/artifactId倉庫元數據

Maven遍歷本地倉庫和所有遠程插件倉庫,將該路徑下的倉庫元數據歸並後,就能計算出latest和release的值。latest表示所有倉庫中該構件的最新版本,而release表示最新的非快照版本。在Maven 2中,插件的版本會被解析至latest。也就是說,當用戶使用某個非核心插件且沒有聲明版本的時候,Maven會將版本解析為所有可用倉庫中的最新版本,而這個版本也可能是快照版。

當插件的版本為快照版本時,就會出現潛在的問題。Maven會基於更新策略,檢查並使用快照的更新。某個插件可能昨天還用得好好的,今天就出錯了,其原因就是這個快照版本的插件發生了變化。為了防止這類問題,Maven 3調整瞭解析機制,當插件沒有聲明版本的時候,不再解析至latest,而是使用release。這樣就可以避免由於快照頻繁更新而導致的插件行為不穩定。

依賴Maven解析插件版本其實是不推薦的做法,即使Maven 3將版本解析到最新的非快照版,也還是會有潛在的不穩定性。例如,可能某個插件發佈了一個新的版本,而這個版本的行為與之前的版本發生了變化,這種變化就可能導致項目構建失敗。因此,使用插件的時候,應該一直顯式地設定版本,這也解釋了Maven為什麼要在超級POM中為核心插件設定版本。