讀古今文學網 > Java程序員修煉之道 > A.3 構建java7developer >

A.3 構建java7developer

這一節會從幾個一次性步驟開始,為構建做好準備1。這包括手動安裝類庫、重命名屬性文件並編輯它,指向Java 7的本地安裝。

1 儘管Maven構建工具最近有改進,並且也支持多語言編程,但還是有些差距。

然後就是最常見的Maven構建週期目標(cleancompiletest)。第一個構建期目標(clean)用來清理上一次構建遺留下來的工件。

Maven的構建腳本是POM(Project Object Model,項目對像模型)文件。這些POM文件就是XML文件,每個Maven項目或模塊都有一個對應的pom.xml文件。POM文件即將會對備選語言提供支持,滿足你所需要的更強的靈活性(很像Gradle)。

要用Maven執行構建,可以讓它執行一個或幾個表示特定任務(比如編譯源碼、運行測試等)的目標。目標全部都是綁定到默認構建週期中的,所以如果要求Maven運行一些測試(如mvn test),它會在試圖運行測試之前把主源碼和用於測試的源碼都編譯一下。簡言之,它會迫使你遵循正確的構建週期。

讓我們從一個一次性的準備任務開始吧。

A.3.1 一次性的構建準備工作

要成功運行構建,需要先重命名屬性文件並編輯。如果在讀12.2節時你沒這麼做,請轉到$BOOK_CODE目錄下,將sample_<os>_build.properties文件(os是你的操作系統)另存為 build.properties,修改jdk.javac.fullpath屬性,將其值指向Java 7的本地安裝。這可以保證Maven構建Java代碼時能選擇正確的JDK。

準備工作做好了,可以運行clean目標了,執行構建時應該總是把它包括在內。

A.3.2 clean

clean目標僅僅是把target目錄刪掉。要看實際效果,請切換到$BOOK_CODE目錄並執行clean目標。

cd $BOOK_CODE
mvn clean
  

這時候,你會看到控制台中滿是Maven下載各種插件和第三方類庫的輸出信息。Maven需要這些插件和類庫運行目標,它默認從Maven Central(這些工件的主要在線資源庫)下載。java7developer項目還配置了另外一個資源庫,以便可以下載asm-4.0.jar文件。

注意 Maven偶爾也會為其他目標執行這個任務,所以在執行其他目標時看到它「下載互聯網」不要大驚小怪。這些東西它只會下載一次。

除了「正在下載……」的信息,應該還能在控制台中看到類似下面這種信息:

[INFO] ----------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ----------------------------------------------------------------
[INFO] Total time: 1.703s
[INFO] Finished at: Fri Jun 24 13:51:58 BST 2011
[INFO] Final Memory: 6M/16M
[INFO] ----------------------------------------------------------------
  

如果clean目標失敗了,很可能是代理服務器阻止你訪問Maven Central,使你無法下載插件和第三方類庫。要解決這個問題,只需修改$HOME/.m2/settings.xml文件,加上下面這些配置,為各種元素填上恰當的值。

<proxies>
  <proxy>
    <active>true</active>
    <protocol></protocol>
    <username></username>
    <password></password>
    <host></host>
    <port></port>
  </proxy>
</proxies>
  

重新運行這個目標,BUILD SUCCESS消息如期而至。

提示 跟其他Maven構建週期目標不同,clean不會自動調用。如果你想清除上一次構建產生的工件,必須把clean目標包括在內。

現在已經把以前構建的殘留物都清除掉了,一般接下來要執行的構建週期目標是編譯代碼。

A.3.3 compile

compile目標用pom.xml文件中的compiler插件配置編譯在src/main/java、src/main/scala和src/main/groovy目錄下的源碼。這實際上是將compile-scoped的依賴項加到CLASSPATH上執行Java、Scala和Groovy編譯器(javacscalacgroovyc)。Maven也會處理src/main/resources下的資源,確保它們出現在編譯時的CLASSPATH中。

編譯好的類會放到target/classes目錄下。要看實際效果,請執行下面的目標:

mvn compile
  

compile目標執行起來應該很快,控制台的輸出看起來應該像下面這樣。

...
[INFO] [compiler:compile {execution: default-compile}]
[INFO] Compiling 119 source files to
    C:Projectsworkspace3.6codetrunktargetclasses
[INFO] [scala:compile {execution: default}]
[INFO] Checking for multiple versions of scala
[INFO] includes = [**/*.scala,**/*.java,]
[INFO] excludes = 
[INFO] C:Projectsworkspace3.6codetrunksrcmainjava:-1: info: compiling
[INFO] C:Projectsworkspace3.6codetrunktargetgenerated-sourcesgroovystubsmain:-1:         info: compiling                       
[INFO] C:Projectsworkspace3.6codetrunksrcmaingroovy:-1: info: compiling
[INFO] C:Projectsworkspace3.6codetrunksrcmainscala:-1: info: compiling
[INFO] Compiling 143 source files to
    C:Projectsworkspace3.6codetrunktargetclasses at 1312716331031
[INFO] prepare-compile in 0 s
[INFO] compile in 12 s
[INFO] [groovy:compile {execution: default}]
[INFO] Compiled 26 Groovy classes
[INFO]------------------------------------------------------------------
[INFO] BUILD SUCCESSFUL
[INFO] -----------------------------------------------------------------
[INFO] Total time: 43 seconds
[INFO] Finished at: Sun Aug 07 12:25:44 BST 2011
[INFO] Final Memory: 33M/79M
[INFO] -----------------------------------------------------------------
 

在這一階段,在src/test/java、src/test/scala和src/test/groovy目錄下的測試類還沒有編譯。儘管針對它們有專門的test-compile目標,但更典型的方式是讓Maven運行test目標。

A.3.4 test

運行test目標能看到Maven的構建週期的真實效果。在要求Maven測試時,它知道自己需要把之前的構建週期目標全都執行過之後才能成功運行test目標(包括compiletest-compile,還有很多其他的)。

Maven會通過Surefire插件,用pom.xml中配置為test-scoped依賴項的測試提供者(此處為JUnit)運行測試。Maven不僅運行測試,還會生成報告文件,供以後進行分析,調研失敗測試並收集測試指標。

要看實際效果,執行如下目標:

mvn clean test
  

Maven一旦完成測試類的編譯和運行,就應該能看到類似下面這種輸出的報告。

...
Running com.java7developer.chapter11.listing_11_3.TicketRevenueTest
Tests run: 5, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0 sec
Running com.java7developer.chapter11.listing_11_4.TicketRevenueTest
Tests run: 5, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0 sec
Running com.java7developer.chapter11.listing_11_5.TicketTest
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.015 sec

Results :

Tests run: 20, Failures: 0, Errors: 0, Skipped: 0
[INFO]------------------------------------------------------------------
[INFO] BUILD SUCCESSFUL
[INFO]------------------------------------------------------------------
[INFO] Total time: 16 seconds
[INFO] Finished at: Wed Jul 06 13:50:07 BST 2011
[INFO] Final Memory: 24M/58M
[INFO]------------------------------------------------------------------
  

測試結果保存在target/surefire-reports裡。你現在可以去看看這個文本文件,能看到測試成功通過了。