Apache Maven 插件

訪問原文:https://www.ibm.com/developerworks/cn/java/j-5things16/index.htmlhtml

掌握現代 Maven 插件的技巧java





您是否知道 Maven?

Maven 是一個面向 Java™開發人員的領先的依賴管理和構建工具,並且名副其實!它經過闡述項目的構造來標準化軟件構建流程,將它部署爲應用程序,而後與其餘項目共享它。git

Maven 採用了一組可靠的插件來提供它的全部功能。在 Maven 中,插件擁有目標,在幕後,該目標就是 Java 方法。目標執行構建任務,好比編譯項目,打包它,並將它部署到本地或遠程服務器。這些活動可完美地映射到構建生命週期的各個階段。apache

Maven 提供了本身的構建插件,這些插件已打包且可當即使用,並且預先配置了默認值。經過「約定高於配置」原則,能夠確保可以針對給定任務的複雜性來擴展配置。大部分構建任務都只需極少的配置。編程

您還能夠自定義 Maven 插件的行爲。使用 Maven 的 <configuration> 元素,很容易重寫插件默認值並定義新值。毫無疑問,大部分重寫的默認值是 compiler 插件的 <source> 和<target> 值。windows

須要證據?您有多少次將清單 1 中的 XML 添加到 POM 中,以設置正確的 JVM 版本?api

清單 1. compiler 插件中的 Java 版本配置
1
2
3
4
5
6
7
8
9
< plugin >
    < groupId >org.apache.maven.plugins</ groupId >
    < artifactId >maven-compiler-plugin</ artifactId >
    < version >3.6.1</ version >
    < configuration >
        < source >1.8</ source >
        < target >1.8</ target >
    </ configuration >
</ plugin >

執行 Maven 生命週期

每一個插件目標都映射到一個 Maven 生命週期階段。發出 mvn compile 命令會告訴 mvn 實用程序調用綁定到 compile 生命週期階段的全部目標。compiler 插件的 compile 目標被綁定到這個生命週期階段。安全

階段與目標之間是一對多的關係。多個插件目標能夠綁定到同一個階段,以造成相關任務集合。階段也是分層的,這意味着執行一個階段會致使執行它前面的全部階段

在本例中,發出 mvn compile 命令會啓動 validate 階段(Maven 的默認構建生命週期的第一個階段),並調用綁定到該階段的全部目標。

Maven 和 Google Code 網站維護着一個 Maven 插件列表。這些插件提供了各類各樣有用且省時的功能,您能夠將它們整合到構建流程中。我將介紹我發現的一些最有用的插件,並展現如何最充分地利用它們。

1.對 JAR 或 WAR 執行數字簽名

單擊下面的按鈕,下載本示例的代碼。它包含一個簡單的應用程序和一個包含已配置好的 Jarsigner 插件的 POM 文件。

對 JAR 或 WAR 執行數字簽名是一項重要任務,尤爲是在您想分發您的應用程序的時候。幸運的是,Java 平臺提供了一個名爲 jarsigner 的存檔簽名實用程序。它是一個命令行工具,可經過向它傳遞存檔文件的位置和各類參數(好比包含您的加密密鑰的密鑰庫)對存檔文件執行簽名。

能夠在 JDK 安裝的 <%JAVA_HOME%>/bin 目錄中找到 jarsigner。清單 2 展現瞭如何使用此實用程序對 JAR 執行簽名。

清單 2. 使用 jarsigner 實用程序對存檔文件執行簽名
1
2
3
4
5
6
jarsigner
     -keystore /path/to/keystore.jks
     -storepass < password >
     -keypass < key password>
     YourArchive.jar
     alias

jarsigner 是一個易於使用的命令行工具,並且開箱即用。 若是能自動化簽名流程,在構建週期的 package 階段對存檔文件執行簽名豈不是更好? 得益於包含 jarsigner 實用程序的 Maven Jarsigner 插件,您能夠實現此目標。您只須要將該插件的 sign 目標綁定到您的構建週期的 package 階段。

首先須要一個密鑰庫。若是沒有,可使用 Java 平臺的 keytool 實用程序建立它,該實用程序可在 JDK 安裝的<%JAVA_HOME%>/bin 目錄中找到。

建立一個密鑰庫

要建立一個密鑰庫,請導航到您想要放置它的位置並執行清單 3 中的命令。必定要將 KeyAlias 替換爲合適的值,好比您的域名。官方 Oracle 文檔詳細介紹了該工具接受的更多配置選項。

清單 3. 爲 jarsigner 實用程序建立一個密鑰庫
1
keytool -genkey -alias < KeyAlias > -keyalg RSA -keystore keystore.jks -keysize 2048

建立密鑰庫的過程要求您回答一系列有關您本身和您的組織的問題,並提供一個安全密碼。配置 Maven Jarsigner 插件時(接下來就會這麼作)將須要此密碼。

將 Jarsigner 添加到您的構建流程中

如今將 Maven Jarsigner 插件添加到您的構建生命週期中,而後配置它來對 package 階段中生成的 JAR 執行數字簽名。關聯到此階段是合理的,由於已構造 JAR 並將它存儲在您項目的默認輸出目錄中,該目錄一般是 target 目錄。在 POM 文件的 <plugins> 部分,添加清單 4 中所示的代碼。

清單 4. 添加 Jarsigner 插件
1
2
3
4
5
< plugin >
    < groupId >org.apache.maven.plugins</ groupId >
    < artifactId >maven-jarsigner-plugin</ artifactId >
    < version >1.4</ version >
</ plugin >

您想要在構建 JAR 後對它執行簽名,因此須要將簽名過程(包裝在 sign 目標中)鏈接到 package 生命週期階段。爲此,請將清單 5 中的代碼添加到該插件中。

清單 5. 將 sign 目標鏈接到 package 階段
1
2
3
4
5
6
7
8
9
< executions >
     < execution >
         < id >sign</ id >
         < phase >package</ phase >
         < goals >
             < goal >sign</ goal >
         </ goals >
     </ execution >
</ executions >

sign 目標須要一些配置細節才能對 JAR 執行數字簽名。因此應該在 <configuration> 元素之間添加密鑰庫位置、您想要使用的憑證的別名、密鑰庫密碼和憑證的密碼,如清單 6 所示。

清單 6. 指定安全憑證
1
2
3
4
5
6
< configuration >
    < keystore >/location/of/keystore.jks</ keystore >
    < alias >KeyAlias</ alias >
    < storepass >password</ storepass >
    < keypass >password</ keypass >
</ configuration >

這是實現 JAR 簽名特性所需的最低配置。請注意,該插件提供了大量額外的配置選項供選擇。

最後一步是構建 JAR 並驗證已對它正確執行簽名。從命令行執行 package 目標,以下所示:mvn clean package。在控制檯輸出中,會看到 JAR 正在構建,而後被簽名。圖 1 展現了您可能看到的結果

圖 1. 輸出顯示已對存檔執行簽名
輸出顯示已對存檔執行簽名

將 JAR 構建到 target 輸出目錄中,這是 Jarsigner 插件指望找到它的位置。該插件將使用您提供的憑證對 JAR 執行簽名,而後向 META-INF 目錄添加兩個額外的文件:一個具備 .SF 擴展名的簽名文件,以及一個具備 .RSA 擴展名的簽名塊文件。

如今已有一個通過數字簽名的 JAR 可供分類。

驗證數字簽名

在分類 JAR 以前,讓咱們驗證已對它進行正確簽名。可使用 Maven Jarsigner 的 verify 目標,或者使用 jarsigner 工具經過命令行來實現此操做。在清單 7 中,我使用了命令行工具並向它傳遞我想要驗證的存檔文件。

清單 7. 使用 jarsigner 實用程序驗證已簽名的 JAR
1
jarsigner -verify target/YourJavaArchive.jar

若是成功,則會收到如下消息:jar verified

對 WAR 文件執行簽名

對 JAR 執行簽名不是 Jarsigner 的惟一功能。該插件可對任何 Java 存檔文件執行簽名,包括 WAR 文件。要查看此操做是如何實現的,能夠將 POM 的打包類型從 JAR 更改成 WAR,添加 Maven WAR 插件(如清單 8 所示)並執行命令:mvn clean package

清單 8. 添加 Maven WAR 插件
1
2
3
4
5
< plugin >
    < groupId >org.apache.maven.plugins</ groupId >
    < artifactId >maven-war-plugin</ artifactId >
    < version >3.1.0</ version >
</ plugin >

檢查 target 目錄,您會找到已簽名的 WAR 文件。

對多個存檔文件執行簽名

若是有多個存檔文件要簽名,Jarsigner 也能應對這種狀況。清單 9 中的代碼將 JAR 的簽名位置指定爲 target/all,而且將對此目錄中的全部 JAR 執行簽名。

清單 9. 指定一個存檔目錄
1
< archiveDirectory >target/all</ archiveDirectory >

若是須要更精確地控制要簽名的存檔文件,可使用通配符來顯式包含和排除文件,如清單 10 所示。

清單 10. 包含和排除選定的存檔文件
1
2
3
4
5
6
< includes >
    < include >*1.0.jar</ include >
</ includes >
< excludes >
    < exclude >*SNAPSHOT.jar</ exclude >
</ excludes >

2.使用 Maven Cargo 部署一個受保護的 Web 應用程序

單擊下面的按鈕,下載本示例的代碼。它包含一個簡單的 Web 應用程序和一個包含已配置好的 Cargo 插件的 POM 文件。

來自 Codehaus 的 Cargo 插件 是 Cargo API 的一個包裝器。該 API 旨在配置、啓動、中止應用程序並將它部署到各類受支持的容器中,並解析、建立和合並 Java EE 模塊。

一個特別重要的特性是,Cargo 可以採用容器不可知的方式來指定服務器屬性。這些屬性包括端口、遠程安全憑證、JVM 參數,以及(咱們最感興趣的)您想部署的應用程序的用戶登陸細節。該插件支持 14 種最流行的服務器的最新版本。

Cargo 插件最好關聯到 Maven 生命週期的 package 階段中。也能夠直接引用 run 目標來獨立執行它:mvn cargo:run。獨立執行會假設該項目已打包且準備好部署。

咱們首先將 Cargo 的 run 目標關聯到 package 階段中,如清單 11 所示。

清單 11. 將 Cargo 的 run 目標關聯到 package 階段
1
2
3
4
5
6
7
8
9
10
11
12
13
< plugin >
    < groupId >org.codehaus.cargo</ groupId >
    < artifactId >cargo-maven2-plugin</ artifactId >
    < version >1.6.4</ version >
    < executions >
        < execution >
            < phase >package</ phase >
            < goals >
                < goal >run</ goal >
            </ goals >
        </ execution >
    </ executions >
</ plugin >

完成 Maven 集成後,如今須要對您但願 Cargo 部署應用程序的目標容器進行配置。Cargo 支持各類各樣的容器場景,包括部署到已在運行的本地或遠程服務器(這包括在須要時啓動該服務器)。或者,能夠配置 Cargo 來下載、安裝、部署並啓動它支持的 14 種服務器中的任意一種。

對於本示例,我將使用 IBM® WebSphere® Liberty,我已下載它並解壓到一個名爲 servers 的目錄中。

容器配置至少須要容器 ID 和所安裝服務器的主目錄位置。清單 12 給出了位於個人 servers/wlp 目錄中的 Liberty 服務器的配置。

清單 12. 容器配置
1
2
3
4
5
6
< configuration >
    < container >
        < containerId >liberty</ containerId >
        < home >\path\to\servers\wlp</ home >
    </ container >
</ configuration >

下載容器 ZIP 文件

另外一個選項是指定 IBM 網站上的 Liberty ZIP 文件的 URL,在這種狀況下,Cargo 插件會下載並安裝該服務器。清單 13 顯示了執行此操做的代碼。

清單 13. 從網絡安裝容器
1
2
3
4
5
6
7
8
9
10
11
12
< container >
    < containerId >liberty</ containerId >
    < zipUrlInstaller >
        < url >
               https://public.dhe.ibm.com/ibmdl/export/pub/
               software/websphere/wasdev/downloads/wlp/17.0.0.2/
               wlp-webProfile7-17.0.0.2.zip
        </ url >
        < downloadDir >/path/to/downloadDir</ downloadDir >
        < extractDir >/path/to/extractDir</ extractDir >
    </ zipUrlInstaller >
</ container >

第一次執行 run 目標時,會下載和解壓 ZIP 文件。在後續執行時,Maven 會檢測到該文件已下載和安裝,並跳過該任務。

您如今擁有最少的配置,能夠將該應用程序部署到您的服務器中來測試該配置。經過調用 package 階段 (mvn package) 來啓動該流程。將應用程序編譯、打包並部署到服務器中,並且可經過如下 URL 訪問它:http://localhost:8080/{artifactid}/index.html

自定義上下文根目錄

默認狀況下,使用 artifactid 來命名 Web 應用程序的上下文根目錄。在某些狀況下,您須要指定一個自定義上下文根目錄。在清單 14 中,我將上下文根目錄定義爲 home

清單 14. 自定義上下文根目錄
1
2
3
4
5
6
7
< deployables >
    < deployable >
        < properties >
            < context >home</ context >
        </ properties >
    </ deployable >
</ deployables >

部署應用程序後,可經過如下地址訪問該 Web 應用程序: localhost:8080/home/index.html

指定用戶登陸信息

您如今已有一個很是可靠的部署流程,它會下載並安裝一個服務器,將您的應用程序部署到一個自定義上下文根目錄中。對於 Cargo 插件的功能而言,這纔剛剛開始。

在咱們開始定義配置屬性時,Cargo 才真正發揮出它的實力。正如我以前提到的,這些配置屬性是容器的屬性,好比端口、協議,最重要的是用戶登陸細節。

讓咱們向示例應用程序添加一個用戶,並強制登陸到該站點。爲了保持簡單,咱們將使用基自己份驗證方法,只須要應用程序的 web.xml 文件中的極少配置。清單 15 顯示了 user-role 的規範和對 WelcomeServlet Web 資源的限制。

清單 15. 聲明用戶角色
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
< web-app version = "3.1" ...>
 
    < security-constraint >
        < web-resource-collection >
            < web-resource-name >Welcome Servlet</ web-resource-name >
            < url-pattern >/WelcomeServlet/*</ url-pattern >
            < http-method >GET</ http-method >
        </ web-resource-collection >
 
        < auth-constraint >
            < role-name >user-role</ role-name >
        </ auth-constraint >
    </ security-constraint >
 
    < login-config >
        < auth-method >BASIC</ auth-method >
        < realm-name >file</ realm-name >
    </ login-config >
 
    < security-role >
        < role-name >user-role</ role-name >
    </ security-role >
 
</ web-app >

能夠配置 Cargo 插件來爲 user-role 建立一個用戶,這能夠在部署時動態完成。 清單 16 給出了爲 user-role 定義的用戶名和密碼。用戶名爲 user,密碼爲 user123!

清單 16. 定義用戶名和密碼
1
2
3
4
5
6
7
< configuration >
    < properties >
       < cargo.servlet.users >
          user:user1234!:user-role
       </ cargo.servlet.users >
    </ properties >
</ configuration >

<cargo.servlet.users> 屬性的格式爲 username:password:role。經過使用豎線符號分隔屬性集合,能夠在一個屬性中爲同一個和不一樣的角色聲明多個用戶:

1
username1:password1:role11,...,role1N|username2:password2:role21,...,role2N|...

將用戶名和密碼分配給用戶角色後,如今能夠打包和部署應用程序了。只需使用一個命令 (mvn clean package),就會將您的 Web 應用程序編譯、打包並部署到 Liberty 容器。該服務器也會啓動。

若是導航到 URL http://localhost:8080/home/WelcomeServlet,將會看到一個登陸框,如圖 2 所示。輸入在 Cargo 插件中配置的用戶名和密碼,單擊 Log In 進入該應用程序。

圖 2. 登陸框
登陸框

3.將一個自定義 JAR 安裝到您的本地存儲庫中

將 JAR 包含在項目中的傳統方式是,在項目中建立一個目錄並確保它位於類路徑上。藉助 Maven,您不須要這樣作。不須要將 JAR 和項目放在一塊兒,Maven 將它們存儲在一個隔離的本地存儲庫中。而後,您的項目必須指定對這些 JAR 的依賴關係。

該本地存儲庫中填充了從中央 Maven 存儲庫下載的依賴項。這就像一艘 Maven 航母,包含數千個流行和通用的 JAR。可是若是您想要使用的 JAR 不在 Maven 中央存儲庫中,該怎麼辦?固然,您能夠依靠傳統解決方案,將 JAR 直接包含在項目中,但您將沒法從 Maven 的依賴管理中獲益。

可使用 maven install plugin 將 JAR 安裝到本地 Maven 存儲庫中。首先,您須要下載該插件,而後能夠執行它的 install-file 目標。這個示例與前面的示例稍有不一樣,由於您不會將該目標與一個 Maven 生命週期階段關聯。您會在 Maven 命令行工具中指定該目標。

install-file 目標須要 5 個參數來指定 JAR 文件的位置、groupartifactid、它的版本號和包類型。清單 17 給出了該 Maven 命令的結構。

清單 17. 將 JAR 安裝在本地 Maven 存儲庫中
1
2
3
4
5
6
mvn install:install-file
     -Dfile=PATH/TO/YOUR-JAR.jar
     -DgroupId=GROUP-ID
     -DartifactId=ARTIFACT-ID
     -Dversion=VERSION
     -Dpackaging=jar

對於您但願安裝的 JAR,須要指定上面所顯示參數的值。您能夠將它們指定爲您想要的任何值。執行該操做後,您能夠親眼看到新文件存儲在本地 Maven 存儲庫中。導航到存儲庫目錄 /.m2/repository,找到名爲 GROUP-ID 的文件夾。若是 groupId值是一個反向域名,好比 com.readlearncode,能夠搜索 com 目錄,而後導航到 readlearncode 目錄。您能夠在這裏找到一個文件夾,其中包含已安裝在該文件夾中的工件和 JAR 的版本號。JAR 的位置可能相似於:/.m2/repository/com/readlearncode/4.0/MyJar.jar

您的 JAR 如今可供您的全部項目使用。您能夠像日常同樣將它做爲依賴項添加到您的 POM 中,如清單 18 所示。

清單 18. 將您的 JAR 指定爲依賴項
1
2
3
4
5
< dependency >
    < groupId >GROUP-ID</ groupId >
    < artifactId >ARTIFACT-ID</ artifactId >
    < version >VERSION</ version >
</ dependency >

4.建立基於 GitHub 的 Maven 存儲庫

單擊下面的按鈕,下載本示例的代碼。它包含一個簡單的應用程序和一個已配置好 site-maven-plugin 的 POM 文件。

將 Maven 存儲庫託管在 GitHub 上有許多理由,包括許可問題、隱私和商業託管成本。不管您爲何選擇託管基於 GitHub 的 Maven 存儲庫,設置一個存儲庫都很容易。

首先,在現有 GitHub 存儲庫中建立一個分支,將項目的工件直接安裝到該分支中。這將綁定到 Maven 生命週期的 deploy 階段,以便在部署項目時,能夠自動刷新遠程存儲庫。

添加 GitHub 憑證

在 GitHub 存儲庫中建立 Maven 分支後,須要將您的 GitHub 存儲庫憑證添加到 Maven 的 settings.xml 文件中。此文件一般可在 .m2 目錄中找到。在 settings.xml 的 <servers> 元素之間,須要定義一個新服務器並指定您的用戶名和密碼。清單 19 演示了此過程(請注意,我將個人新服務器命名爲 github)。

清單 19. 將一個 github 存儲庫配置爲服務器
1
2
3
4
5
6
7
< servers >
    < server >
        < id >github</ id >
        < username >USERNAME_OR_EMAIL</ username >
        < password >PASSWORD</ password >
    </ server >
</ servers >

雙因素身份驗證

若是啓用了雙因素身份驗證,則須要經過 GitHub Settings 建立一個 Personal Access Token。將該令牌直接複製並粘貼到 <password> 元素中。要實現額外的安全保護,可按照 Maven 網站上的說明來加密密碼。

Maven site 插件

在 Maven POM 中,您將使用 GitHub 的 site-maven-plugin。您須要作的第一件事是設置一個從中提交文件的基本目錄。首先建立一個臨時目錄,並將它放在項目的 target 目錄中,如清單 20 所示。對於本示例,我將該目錄命名爲 repo-stage

接下來,由於您想將此插件關聯到 deploy 階段,因此必須在 maven-deploy-plugin 的 <altDeploymentRepository> 中指定存儲庫位置。清單 20 中的代碼片斷展現瞭如何指定存儲庫位置。

清單 20. 指定備選的本地存儲庫
1
2
3
4
5
6
7
8
9
10
< plugin >
    < artifactId >maven-deploy-plugin</ artifactId >
    < version >2.8.2</ version >
    < configuration >
        < altDeploymentRepository >
               Repo.stage::default::file://
               ${project.build.directory}/repo-stage
        </ altDeploymentRepository >
    </ configuration >
</ plugin >

最後,須要配置 site-maven-plugin 並將它關聯到 deploy 階段。爲此,請向該插件傳遞以前建立的 GitHub 服務器的 id。還須要向它傳遞存儲庫名稱和全部者、您將項目工件提交到的分支,以及針對該提交的註釋。您還須要關閉 Jekyll,讓它不會認爲本身須要生成 GitHub 頁面。

清單 21 給出了 site-maven-plugin 的完整配置。請注意,存儲庫名稱是 dependency(若是該分支不存在,GitHub 將建立它)。

清單 21. 配置 site 插件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
< plugin >
    < groupId >com.github.github</ groupId >
    < artifactId >site-maven-plugin</ artifactId >
    < version >0.12</ version >
    < configuration >
        <!-- Github settings -->
        < server >github</ server >
        < repositoryName >MavenSampler</ repositoryName >
        < repositoryOwner >atheedom</ repositoryOwner >
        < branch >refs/heads/dependency</ branch >
        < message >
          Artifacts for
          ${project.name}/${project.artifactId}/${project.version}
        </ message >
        < noJekyll >true</ noJekyll >
        <!-- Deployment values -->
        < outputDirectory >
               ${project.build.directory}/repo-stage
        </ outputDirectory >
        < includes >
            < include >**/*</ include >
        </ includes >
    </ configuration >
    < executions >
        < execution >
            < phase >deploy</ phase >
            < goals >
                < goal >site</ goal >
            </ goals >
        </ execution >
    </ executions >
</ plugin >

如今只剩下運行命令 mvn clean deploy 了。在控制檯中,您會看到該插件將存儲庫文件上傳到您的 GitHub 賬戶,建立提交,並將該提交推送到依賴項分支。控制檯輸出應相似於圖 3。

圖 3. 一次成功提交的控制檯輸出
成功提交的控制檯輸出

要驗證全部步驟都按預期進行,請訪問您的 GitHub 存儲庫並選擇 dependency 分支。您會看到項目的全部工件,如圖 4 所示。

圖 4. GitHub 中的 Maven 存儲庫的屏幕截圖
GitHub 中的 Maven 存儲庫的屏幕截圖

確認您的工件已安全提交到您的 GitHub Maven 存儲庫後,您可能想與但願依靠您項目的其餘人共享新的存儲庫。

添加 GitHub 做爲存儲庫

要將 GitHub Maven 存儲庫指定爲他們本身的項目的遠程存儲庫,訂閱者須要在他們的 POM 中聲明該存儲庫,如清單 22 所示。而後,將按正常方式指定您的項目的工件,如清單 23 所示。

清單 22. 將 GitHub 指定爲遠程存儲庫
1
2
3
4
5
6
7
8
9
10
11
12
13
< repositories >
    < repository >
        < id >PROJECT_NAME-dependency</ id >
        < url >
               https://raw.github.com/
               GITHUB_USERNAME/PROJECT_NAME/dependency
        </ url >
        < snapshots >
            < enabled >true</ enabled >
            < updatePolicy >always</ updatePolicy >
        </ snapshots >
    </ repository >
</ repositories >
清單 23. 項目依賴項
1
2
3
4
5
< dependency >
    < groupId >com.readlearncode</ groupId >
    < artifactId >maven-sampler</ artifactId >
    < version >1.0</ version >
</ dependency >

如今,您擁有一個簡單的公共 Maven 存儲庫,用於部署您的依賴項並與全世界共享它們。

5.更多省時技巧和訣竅

Apache Maven 的應用如此普遍,以致於查找未知的技巧和訣竅就像勘探金礦同樣。因此我決定最後提供一些我發現很是有用的消息。在其中,您能找到一些節省時間和避免受挫的寶貴技巧。

未使用依賴項的「Roomba」

開發工做既有趣又使人興奮,尤爲是在您使用新 API 和技術時。Maven 也能快速、輕鬆地引入新技術:您只須要將依賴項複製並粘貼到您的 POM 文件中,而後就大功告成了。可是,做爲開發人員,咱們有時會被激情衝昏了頭腦,忘記刪除未使用的依賴項;或者咱們懶得這麼作。隨着時間的推移,這種壞習慣可能讓您的 POM 不斷變大並減緩您的部署。

因此個人第一條技巧是,Maven 就像機器人真空吸塵器 Roomba。只需運行清單 24 中的命令,Maven 就會分析您的項目代碼,查找未使用的依賴項並確認它們。

清單 24. 確認未使用的依賴項
1
dependency:analyze

清潔本地存儲庫

您須要時常清潔您的 Maven 存儲庫—也許是由於誤用,或者由於您的 IDE 索引速度很是慢。不管何種緣由,均可以執行清單 25 中的代碼來刪除全部污染物。

清單 25. 清潔本地存儲庫
1
mvn dependency:purge-local-repository

這將清潔當前項目,而後自動下載其全部依賴項。您的項目將得到重生,並準備好再次超越自我。

添加時間戳!

向構建週期添加時間戳可能很是有用。Maven 2 引入了構建變量 maven.build.timestamp,它表示構建的開始時間。可經過變量 ${maven.build.timestamp},在 POM 中的任何地方使用此變量。

可使用 Java SimpleDateFormat 類來格式化時間戳,並使用屬性 <maven.build.timestamp.format> 來聲明它。清單 26 給出了一個實現此過程的示例。

清單 26. 時間戳格式
1
2
3
4
5
< properties >
     < maven.build.timestamp.format >
         yyyy-MM-dd'T'HH:mm:ss'Z'
     </ maven.build.timestamp.format >
</ properties >

回顯屬性

您是否曾經想知道某個 Maven 屬性值?不用猜想,您可使用 maven-antrun-plugin 得到明確的答案。這個小巧的工具會將您傳遞給它的任何屬性回顯到控制檯。

在清單 27 中,將 antrun 的 run 目標關聯到 Maven 的 validate 階段中(第一個默認生命週期階段),使用 configuration 部分的 <echo> 元素來輸出屬性值。

清單 27. 將屬性回顯到控制檯
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
< plugin >
    < groupId >org.apache.maven.plugins</ groupId >
    < artifactId >maven-antrun-plugin</ artifactId >
    < version >1.1</ version >
    <
相關文章
相關標籤/搜索