Maven系列 4.Maven項目基礎

4. Maven項目基礎

    Maven爲其所有項目提供了約定和標準目錄佈局。如第1章所討論的,這個標準化提供了一個統一的構建接口,它也使得開發人員可以輕鬆地從一個項目跳轉到另一個項目。本章將解釋Maven項目和pom.xml文件的基礎知識。


    基礎項目組織
    理解Maven項目結構的最好方法是查看一個。圖4-1說明了一個基於Maven的Java項目。


圖4-1。 Maven Java項目結構
    現在讓我們看看項目中的每個組件:    
      gswm是項目的根文件夾。通常,項目的名稱與生成的工件的名稱匹配。
      src文件夾包含項目相關工件,您通常希望在源控制管理(SCM)系統(如SVN或Git)中進行管理。
      src / main / java文件夾包含Java源代碼。
      src / test / java文件夾包含Java單元測試代碼。
      目標文件夾保存生成的工件,例如.class文件。生成的工件通常不存儲在SCM中,因此不要將目標文件夾及其內容提交到SCM。
      每個Maven項目在項目的根目錄都有一個pom.xml文件。它保存項目和配置信息,例如依賴項和插件。
    除了src / main和src / test目錄,Maven還推薦了其他幾個目錄。表4-1列出了這些目錄及其中的內容。    
      表4-1。 Maven目錄
目錄名稱              說明
             src / main / resources
              保存需要在生成的工件中結束的資源,例如Spring配置文件和速度模板。           
              src / main / config
              保存配置文件,例如Tomcat上下文文件,James Server配置文件等。這些文件不會在生成的工件中結束。
              src / main / scripts
              保存系統管理員和開發人員對應用程序所需的任何腳本。
               src / test / resources
             保存測試所需的配置文件。
              src / main / webapp
              保存Web資源(如.jsp文件,樣式表和圖像)。
              src / it
              保存應用程序的集成測試。
              src / main / db
              保存數據庫文件,例如SQL腳本。
              src / site
              保存生成項目站點期間所需的文件。
    Maven提供了原型(如第6章所討論的)快速引導項目的概念。但是,在本章中,您將手動組合項目。使用以下說明創建項目:
    使用命令行,轉到要創建項目的文件夾。在本書中,我們假設目錄爲c:\ apress \ gswm-book \ chapter4。
      運行命令mkdir gswm。
      cd進入新創建的目錄,並創建一個空的pom.xml文件。
      創建目錄src / main / java。在gswm下創建src目錄,然後在src中創建主目錄,最後在main下創建java目錄,如圖4-2所示。

    起始項目結構應類似於圖4-2所示。


圖4-2。 Maven項目結構

瞭解pom.xml文件
    pom.xml文件是Maven項目中唯一需要的工件。正如我們在本書中討論的那樣,pom.xml文件保存了Maven所需的配置信息。清單4-1顯示了帶有基本項目信息的pom.xml文件。我們使用project元素啓動pom.xml文件。然後我們提供groupId,artifactId和版本座標。包裝元素告訴Maven它需要爲此項目創建一個JAR存檔。最後,我們添加有關正在處理此項目的開發人員的信息。
    列表4-1。 pom.xml文件配置

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">  
<modelVersion>4.0.0
</modelVersion>  
<groupId>com.apress.gswmbook
</groupId>  
<artifactId>gswm
</artifactId>  
<version>1.0.0-SNAPSHOT
</version>  
<packaging>jar
</packaging>  
<name>Getting Started with Maven
</name>  
<url>http://apress.com
</url>

<developers>   
<developer>        
<id>balaji
</id>        
<name>Balaji Varanasi
</name>        
<email>[email protected]
</email>       
<properties>          
<active>true
</active>       
</properties>   
</developer>   
<developer>      
<id>sudha
</id>      
<name>Sudha Belida
</name>      
<email>[email protected]
</email>      
<properties>          
<active>true
</active>      
</properties>   
</developer> 
</developers>
</project>
我們將在本章後面以及本書其餘部分的pom.xml文件中查看其他元素。
      MAVEN VERSIONING
      建議Maven項目使用以下約定進行版本控制:
      <major-version>。<minor-version>。<incremental-version> -qualifier
      主要,次要和增量值是數字,限定符可以具有值,例如RC,alpha,beta和SNAPSHOT。遵循該慣例的一些示例是1.0.0,2.4.5-SNAPSHOT,3.1.1-RC1等等。
      項目版本中的SNAPSHOT限定符具有特殊的含義。這表明該項目處於開發階段。當項目使用SNAPSHOT依賴項時,每次構建項目時,Maven將獲取並使用最新的SNAPSHOT工件。
      大多數存儲庫管理器只接受發佈版本一次。但是,當您在持續集成環境中開發應用程序時,您希望經常構建並將最新版本推送到存儲庫管理器。因此,最好的做法是在開發期間使用SNAPSHOT來後綴您的版本。 


    構建項目
    在我們看看構建項目之前,讓我們在src / main / java文件夾下添加HelloWorld Java類。清單4-2顯示了HelloWorld類的代碼。
    清單4-2。 HelloWorld Java類的代碼    
public class HelloWorld {public void sayHello(){

System.out.print(“Hello World”); 

}}
}}

    圖4-3顯示了添加類後的項目結構。


      圖4-3。添加了Java類的項目結構
    現在你準備好構建應用程序,讓我們從gswm運行mvn包。您應該看到類似於清單4-3所示的輸出。
    代碼4-3。用於構建應用程序的Maven軟件包命令的輸出

C:\apress\gswm-book\chapter4\gswm>mvn package
[INFO] Scanning for projects...
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building Getting Started with Maven 1.0.0-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ gswm ---
[WARNING] Using platform encoding (Cp1252 actually) to copy filtered resources,i.e. build is platform dependent!
[INFO] skip non existing resourceDirectory C:\apress\gswm-book\chapter4\gswm\src\main\resources
[INFO]
[INFO] --- maven-compiler-plugin:2.5.1:compile (default-compile) @ gswm ---

[WARNING] File encoding has not been set, using platform encoding Cp1252, i.e. build is platform dependent!
[INFO] Compiling 1 source file to C:\apress\gswm-book\chapter4\gswm\target\classes
[INFO]
[INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ gswm ---
[WARNING] Using platform encoding (Cp1252 actually) to copy filtered resources,i.e. build is platform dependent!
[INFO] skip non existing resourceDirectory C:\apress\gswm-book\chapter4\gswm\src\test\resources
[INFO]
[INFO] --- maven-compiler-plugin:2.5.1:testCompile (default-testCompile) @ gswm---
[INFO] No sources to compile
[INFO]
[INFO] --- maven-surefire-plugin:2.12.4:test (default-test) @ gswm ---
[INFO] No tests to run.
[INFO]
[INFO] --- maven-jar-plugin:2.4:jar (default-jar) @ gswm ---
[INFO] Building jar: C:\apress\gswm-book\chapter4\gswm\target\gswm-1.0.0-SNAPSHOT.jar
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 1.269s
[INFO] Finished at: Mon Oct 13 21:40:44 MDT 2014
[INFO] Final Memory: 9M/23M
[INFO] ------------------------------------------------------------------------
注意如果這是你第一次運行Maven,它將下載它運行所需的插件和依賴關係。因此,您的第一次構建可能需要比預期更長的時間。
        mvn命令之後的包後綴是一個Maven階段,用於編譯Java代碼並將其打包到JAR文件中。打包的JAR文件出現在gswm \ target文件夾中,如圖4-4所示。

圖4-4。位於目標文件夾下的打包JAR
    
    測試項目
    現在您已經完成了項目構建,讓我們添加一個測試sayHello()方法的JUnit測試。讓我們通過將JUnit依賴項添加到pom.xml文件來開始此過程。您可以通過使用dependencies元素來完成此任務。代碼清單4-4顯示了具有JUnit依賴關係的更新的pom.xml文件。
    代碼4-4。使用JUnit依賴關係更新了POM

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">  
<modelVersion>4.0.0
</modelVersion>  
<groupId>com.apress.gswmbook
</groupId>  
<artifactId>gswm
</artifactId>  
<version>1.0.0-SNAPSHOT
</version>

<packaging>jar
</packaging>  
<name>Getting Started with Maven
</name>  
<url>http://apress.com
</url>  
<developers>   
<developer>        
<id>balaji
</id>        
<name>Balaji Varanasi
</name>        
<email>[email protected]
</email>       
<properties>          
<active>true
</active>       
</properties>   
</developer>   
<developer>      
<id>sudha
</id>      
<name>Sudha Belida
</name>      
<email>[email protected]
</email>      
<properties>          
<active>true
</active>      
</properties>   
</developer> 
</developers>   
<dependencies>        
<dependency>                
<groupId>junit
</groupId>                
<artifactId>junit
</artifactId>                
<version>4.11
</version>                
<scope>test
</scope>        
</dependency>
</dependencies>
</project>
      

    請注意,您已使用範圍測試,指示僅在測試階段需要JUnit .jar。讓我們通過在命令行中運行mvn dependency:tree來確保這個依賴關係已經成功添加。清單4-5顯示了此操作的輸出。
    清單4-5。 Maven樹命令輸出    
C:\apress\gswm-book\chapter4\gswm>mvn dependency:tree
[INFO] Scanning for projects...
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building Getting Started with Maven 1.0.0-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] --- maven-dependency-plugin:2.8:tree (default-cli) @ gswm ---
[INFO] com.apress.gswmbook:gswm:jar:1.0.0-SNAPSHOT
[INFO] \- junit:junit:jar:4.11:test
[INFO]    \- org.hamcrest:hamcrest-core:jar:1.3:test
[INFO] ----------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ----------------------------------------------------------
[INFO] Total time: 1.646s
[INFO] Finished at: Mon Oct 13 21:54:24 MDT 2014
[INFO] Final Memory: 7M/19M
[INFO] ----------------------------------------------------------
    依賴性插件中的樹目標將項目的依賴項顯示爲樹。請注意,JUnit依賴項在一個名爲hamcrest的傳遞依賴項中,它是一個開源項目,可以很容易地編寫匹配器對象。
現在你在類路徑中有JUnit依賴項,讓我們向項目中添加一個單元測試HelloWorldTest.java。 在src下創建文件夾test / java,並在它下面添加HelloWorldTest.java。 更新的項目結構如圖4-5所示。

       圖4-5。 Maven結構與測試類
     HelloWorldTest的源代碼如清單4-6所示。
    清單4-6。 HelloWorldTest Java類的代碼
import java.io.ByteArrayOutputStream;import java.io.PrintStream;import org.junit.After;import org.junit.Assert;import org.junit.Before;import org.junit.Test;public class HelloWorldTest 
{
private final ByteArrayOutputStream outStream = new ByteArrayOutputStream();        @Before        public void setUp() 
{            System.setOut(new PrintStream(outStream));        
}        @Test        public void testSayHello() 
{                HelloWorld hw = new HelloWorld();                hw.sayHello();                Assert.assertEquals("Hello World", outStream.toString());        
}        @After        public void cleanUp() 
{            System.setOut(null);        
}
}

     您現在已經在此項目中設置了所有內容,因此您可以再次運行mvn軟件包。 運行它之後,您將看到類似於清單4-7所示的輸出。
     列表4-7。 用於構建項目的Maven命令的輸出

C:\apress\gswm-book\chapter4\gswm>mvn package
[INFO] Scanning for projects...
[INFO]
[INFO] ---------------------------------------------------------------
[INFO] Building Getting Started with Maven 1.0.0-SNAPSHOT

[INFO] ---------------------------------------------------------------
[INFO]
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ gswm ---
[WARNING] Using platform encoding (Cp1252 actually) to copy filtered resources,i.e. build is platform dependent!
[INFO] skip non existing resourceDirectory C:\apress\gswm-book\chapter4\gswm\src\main\resources
[INFO]
[INFO] --- maven-compiler-plugin:2.5.1:compile (default-compile) @ gswm ---
[INFO] Nothing to compile - all classes are up to date
[INFO]
[INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ gswm --------------------------------------------------------
[INFO] Surefire report directory: C:\apress\gswm-book\chapter4\gswm\target\surefire-reports------------------------------------------------------- T E S T S-------------------------------------------------------Running HelloWorldTestTests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.038 secResults :Tests run: 1, Failures: 0, Errors: 0, Skipped: 0
[INFO]
[INFO] --- maven-jar-plugin:2.4:jar (default-jar) @ gswm ---
[INFO] Building jar: C:\apress\gswmbook\chapter4\gswm\target\gswm-1.0.0-SNAPSHOT.jar
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 1.807s
[INFO] Finished at: Mon Oct 13 21:59:57 MDT 2014
[INFO] Final Memory: 9M/22M
[INFO] --------------------------------------------------------------------
注意代碼4-7中的Tests部分。它顯示Maven已運行測試,並已成功完成。

      圖4-6。具有測試類的目標文件夾

    圖4-6顯示了更新的目標文件夾。您可以看到現在有一​​個test-classes文件夾及其在該文件夾中的關聯報告。


    pom.xml中的屬性
    Maven允許您使用<properties />元素在pom.xml文件中聲明屬性。這些屬性對於聲明依賴關係版本非常有用。代碼清單4-8顯示了更新的pom.xml文件,其中JUnit版本聲明爲屬性。注意在JUnit依賴關係的版本元素中使用$ {}語法。這在pom.xml有很多依賴項並且需要知道或更改特定依賴項的版本時尤其有用。
    代碼4-8。 pom.xml帶有屬性的文件

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">  
<modelVersion>4.0.0
</modelVersion>  
<groupId>com.apress.gswmbook
</groupId>  
<artifactId>gswm
</artifactId>  
<version>1.0.0-SNAPSHOT
</version>  
<packaging>jar
</packaging>  
<name>Getting Started with Maven
</name>  
<url>http://apress.com
</url>  
<properties>   
<junit.version>4.11
</junit.version>  
</properties>  
<developers>   
<developer>        
<id>balaji
</id>        
<name>Balaji Varanasi
</name>        
<email>[email protected]
</email>       
<properties>          
<active>true
</active>       
</properties>   
</developer>   
<developer>      
<id>sudha
</id>      
<name>Sudha Belida
</name>      
<email>[email protected]
</email>      
<properties>          
<active>true
</active>      
</properties> 
</developer> 
</developers>   
<dependencies>        
<dependency>                
<groupId>junit
</groupId>                
<artifactId>junit
</artifactId>                
<version>${junit.version}
</version>                
<scope>test
</scope>        
</dependency>
</dependencies>
</project>

排除依賴關係
     第3章討論了傳遞依賴和偶爾需要排除一個特定的傳遞依賴。 pom.xml文件中的exclude元素允許您排除依賴關係。
     清單4-9顯示了排除hamcrest傳遞依賴關係的JUnit的更新依賴關係元素。 如您所見,排除元素採用您想要排除的依賴關係的groupId和artifactId座標。
     代碼4-9。 JUnit依賴與排除
<dependencies>        
<dependency>                
<groupId>junit
</groupId>                
<artifactId>junit
</artifactId>                
<version>${junit.version}
</version>                
<scope>test
</scope>                
<exclusions>                        
<exclusion> 
<groupId> org.hamcrest
</groupId>                                
<artifactId>hamcrest
</artifactId>                        
</exclusion>                
</exclusions>        
</dependency>
</dependencies>


總結
     Maven的CoC爲其所有項目規定了標準目錄佈局。 它提供了幾個敏感的目錄,如src \ main \ java和src \ it,以及對每個目錄的內容的建議。 您學習了強制性的pom.xml文件及其一些元素,用於配置Maven項目的行爲。


     在下一章中,您將看到Maven的生命週期,插件,構建階段,目標以及如何有效地利用它們。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章