Maven使用教程

1、Maven介紹
咱們在開發項目的過程當中,會使用一些開源框架、第三方的工具等等,這些都是以jar包的方式被項目所引用,而且有些jar包還會依賴其餘的jar包,咱們一樣須要添加到項目中,全部這些相關的jar包都會做爲項目的依賴。一般,一個Java EE項目所依賴的jar包會有不少。然而,這還並不是是主要問題,在管理這些jar包過程當中,jar包的版本每每是最使人頭疼的問題。選擇一個jar包的版本,須要考慮它所依賴的jar包是否支持這個版本,而且還須要確認依賴它的jar包能不能對這個版本兼容。因此,在過去的構建項目過程當中,整理出這麼一堆能讓項目正常運行的jar包以後,這個lib目錄就會變爲禁區。jar包版本更新了,咱們也不多會自找麻煩去觸碰它。至因而不是存在冗餘的jar包?能正常運行就行了嘛。。。。
 
Maven的出現,解決了開發過程當中的這一難題。它能夠對項目依賴的jar包進行管理,可讓你的項目保持基本的依賴,排除冗餘jar包,而且可讓你很是輕鬆的對依賴的jar包進行版本升級。而這些僅僅是Maven最基本的功能,它能夠在這基礎上對項目進行清理、編譯、測試、打包、發佈等等構建項目的工做。
 
能夠說,Maven是如今Java社區中最強大的項目管理和項目構建工具,而更加值得慶幸的是,這樣一個強大的工具,它的使用也是很是簡單的。
 
如今,JavaEE項目使用的開源軟件均可以經過Maven來獲取,而且,愈來愈多的公司也開始使用Maven來管理構建項目了。
 
2、Maven下載安裝
一、配置Java運行環境
Maven依賴Java運行環境,所以使用Maven以前須要配置Java的運行環境。下載並安裝JDK,配置JDK的環境變量:
    JAVA_HOME=D:\Dev\Tool\Java\jdk1.6.0_38
    在path中加入%JAVA_HOME%\bin;
二、安裝Maven
下載Maven最新版本的二進制zip壓縮包就能夠,如:apache-maven-3.0.5-bin.zip
下載完成後,解壓,例如咱們把解壓後的文件夾放在D:\Dev\Tool\目錄下。
而後,將Maven的bin目錄添加到path環境變量中,咱們這裏就是這個目錄:D:\Dev\Tool\apache-maven-3.0.4\bin
 
在Windows命令提示符下,輸入mvn -v測試一下,如圖:
 
這樣,maven就安裝完成了,就是這麼簡單。接下來咱們先來了解一下Maven是如何來管理項目的。
 
3、Maven依賴管理
前面講了,Maven最核心的就是對依賴jar包的管理,那麼它是經過什麼方式來進行管理的呢?
Maven要求每個jar包都必須明肯定義本身的座標,Maven就是經過這個座標來查找管理這些jar包的。
在Maven中,一個jar包的座標是由它的groupId、artifactId、version這些元素來定義的。例如:
    <groupId>org.apache.struts</groupId>
    <artifactId>struts2-core</artifactId>
    <version>2.3.8</version>
    <packaging>jar</packaging>
groupId:代表其所屬組織或公司及其所屬項目,命名規則爲組織或公司域名反轉加項目名稱。
artifactId:項目的模塊名,一般與實際項目名稱一致。模塊的命名一般爲項目名前綴加模塊名。
version:當前項目的版本號。
packaging:定義項目的打包方式,可選值有jar、war、pom。默認爲jar
注::一個組織或公司都會有不少的項目,而每一個項目下都會劃分多個模塊,在開發中咱們能夠靈活選擇依賴某個模塊。而Maven管理的jar包基本都是模塊性質的項目構建出的jar包。因此,artifactId一般都是模塊名,而不是項目名稱。項目名稱是和組織名稱組合做爲groupId來使用的。
 
上面的配置定義了一個Maven項目的座標,而若是在項目中依賴這個項目時,一樣是利用它的座標來指定依賴。例如:
<project>
    ...
    <dependencies>
        <dependency>
            <groupId>org.apache.struts</groupId>
            <artifactId>struts2-core</artifactId>
            <version>2.3.8</version>
        </dependency>
    </dependencies>
    ...
</project>
 
Maven的配置文件中dependencies元素包含了全部依賴的jar包,每個jar包依賴使用dependency元素定義。
在聲明一個jar包依賴時,除了指定groupId、artifactId、version這三項基本座標外,還可使用使用如下元素進行配置:
scope元素:指定依賴的範圍
exclusions元素:排除傳遞性依賴
 
Maven有如下幾種依賴範圍:
compile:編譯依賴範圍(默認值),依賴在編譯、測試、運行期間都有效。
test:測試依賴範圍,只對測試的classpath有效,在編譯或運行時沒法使用指定爲test的依賴包。
provided:已提供的依賴範圍,只對編譯和測試的classpath有效,運行期間不會使用這個依賴。例如servlet-api,在運行時容器已經提供,不須要再重複引入。
runtime:運行時依賴範圍,編譯時無效,只在測試和運行時使用這個依賴。
system:系統依賴範圍,和provided範圍一致,可是provided是使用容器提供依賴,system是使用系統提供依賴,須要指定依賴文件路徑。
 
傳遞性依賴,是指依賴包對其餘包的依賴,好比,咱們依賴struts2-core,而strtus2-core須要依賴xwork-core、ognl等,Maven會將這些傳遞性依賴同時引入項目之中。這也是Maven的一大優勢,簡化了咱們對jar包依賴的管理。而有時咱們但願替換某個傳遞性依賴時,就須要使用exclusions排除掉這個傳遞性依賴,而後再添加咱們本身要替換的依賴包。
 
例如,以下一個Maven的配置文件,pom.xml:
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <project xmlns="http://maven.apache.org/POM/4.0.0"  
  3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  4.     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">  
  5.   
  6.     <modelVersion>4.0.0</modelVersion>  
  7.     <groupId>com.boya.spring</groupId>  
  8.     <artifactId>spring_ioc</artifactId>  
  9.     <packaging>jar</packaging>  
  10.     <version>1.0.0</version>  
  11.   
  12.     <name>${project.artifactId}</name>  
  13.     <description>Spring Ioc Sample</description>  
  14.   
  15.     <dependencies>  
  16.         <!-- spring start -->  
  17.         <dependency>  
  18.             <groupId>org.springframework</groupId>  
  19.             <artifactId>spring-core</artifactId>  
  20.             <version>3.2.0.RELEASE</version>  
  21.             <exclusions>  
  22.                 <exclusion>  
  23.                     <groupId>commons-logging</groupId>  
  24.                     <artifactId>commons-logging</artifactId>  
  25.                 </exclusion>  
  26.             </exclusions>  
  27.         </dependency>  
  28.         <dependency>  
  29.             <groupId>org.springframework</groupId>  
  30.             <artifactId>spring-beans</artifactId>  
  31.             <version>3.2.0.RELEASE</version>  
  32.         </dependency>  
  33.         <dependency>  
  34.             <groupId>org.springframework</groupId>  
  35.             <artifactId>spring-context</artifactId>  
  36.             <version>3.2.0.RELEASE</version>  
  37.         </dependency>  
  38.   
  39.         <!-- logging start -->  
  40.         <dependency>  
  41.             <groupId>org.slf4j</groupId>  
  42.             <artifactId>slf4j-api</artifactId>  
  43.             <version>1.6.4</version>  
  44.         </dependency>  
  45.         <dependency>  
  46.             <groupId>org.slf4j</groupId>  
  47.             <artifactId>slf4j-log4j12</artifactId>  
  48.             <version>1.6.4</version>  
  49.         </dependency>  
  50.         <dependency>  
  51.             <groupId>org.slf4j</groupId>  
  52.             <artifactId>jcl-over-slf4j</artifactId>  
  53.             <version>1.6.4</version>  
  54.         </dependency>  
  55.         <dependency>  
  56.             <groupId>log4j</groupId>  
  57.             <artifactId>log4j</artifactId>  
  58.             <version>1.2.16</version>  
  59.         </dependency>  
  60.         <dependency>  
  61.             <groupId>log4jdbc</groupId>  
  62.             <artifactId>log4jdbc4</artifactId>  
  63.             <version>1.2</version>  
  64.         </dependency>  
  65.   
  66.         <!--Test start-->  
  67.         <dependency>  
  68.             <groupId>junit</groupId>  
  69.             <artifactId>junit</artifactId>  
  70.             <version>4.10</version>  
  71.             <scope>test</scope>  
  72.         </dependency>  
  73.     </dependencies>  
  74. </project>  
 
4、Maven倉庫
Maven經過項目定義的座標來管理這些依賴,而這些依賴的物理文件是經過Maven的倉庫來統一管理的。
對於一個依賴座標,它會按照以下方式反映到Maven的倉庫中。
一、將groupId轉化爲路徑:將groupId中的包名分隔符(.)轉換成路徑分隔符(/)。對於上面的例子就是 org.apache.struts -> org/apache/struts/
二、將artifactId轉化爲路徑:在groupId轉化的路徑基礎上鍊接artifactId。生成路徑爲: org/apache/struts/struts2-core/
三、將verion轉化爲路徑:在artifactId轉化的路徑基礎上鍊接version。生成路徑爲: org/apache/struts/struts2-core/2.3.8/
四、根據artifactId和version生成依賴包文件名:上例就是 struts2-core-2.3.8
五、根據依賴的打包方式肯定文件的擴展名。對於上例它的擴展名就是.jar
 
這樣根據路徑和文件名就找到了這個物理文件在倉庫中的位置:org/apache/struts/struts2-core/2.3.8/struts2-core-2.3.8.jar
 
Maven的倉庫分爲本地倉庫和遠程倉庫。
本地倉庫:是Maven在咱們本機設置的倉庫目錄,默認目錄爲當前用戶目錄下的.m2/repository.
遠程倉庫包括中央倉庫、私服、其餘公共倉庫。
中央倉庫是Maven提供的遠程倉庫,地址是: http://repo.maven.apache.org/maven2
私服是咱們爲了節省帶寬和時間,提高效率,在局域網架設的私有Maven倉庫。
其餘公共庫有Java.net的maven庫( http://download.java.net/maven/2/)和JBoss Maven庫( http://repository.jboss.com/)等。
 
Maven在根據依賴座標查找依賴時,首先會從本地倉庫查找該依賴包,當本地倉庫中沒有這個依賴包時,Maven會從中央倉庫查找依賴,並下載到本地倉庫。最後,在咱們項目的classpath中引用本地倉庫的依賴包路徑。
例如,當項目只依賴strtus2-core這個依賴包時,會生成這樣的classpath文件:
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <classpath>  
  3.   <classpathentry kind="src" path="src/main/java" output="/src/main/webapp/WEB-INF/classes" including="**/*.java"/>  
  4.   <classpathentry kind="src" path="src/main/resources" output="/src/main/webapp/WEB-INF/classes" excluding="**/*.java"/>  
  5.   <classpathentry kind="output" path="src/main/webapp/WEB-INF/classes"/>  
  6.   <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>  
  7.   <classpathentry kind="con" path="com.genuitec.eclipse.j2eedt.core.J2EE14_CONTAINER"/>  
  8.   <classpathentry kind="var" path="M2_REPO/org/apache/struts/struts2-core/2.3.8/struts2-core-2.3.8.jar" />  
  9.   <classpathentry kind="var" path="M2_REPO/org/apache/struts/xwork/xwork-core/2.3.8/xwork-core-2.3.8.jar" />  
  10.   <classpathentry kind="var" path="M2_REPO/org/apache/commons/commons-lang3/3.1/commons-lang3-3.1.jar" />  
  11.   <classpathentry kind="var" path="M2_REPO/ognl/ognl/3.0.6/ognl-3.0.6.jar" />  
  12.   <classpathentry kind="var" path="M2_REPO/javassist/javassist/3.11.0.GA/javassist-3.11.0.GA.jar" />  
  13.   <classpathentry kind="var" path="M2_REPO/asm/asm/3.3/asm-3.3.jar"/>  
  14.   <classpathentry kind="var" path="M2_REPO/asm/asm-commons/3.3/asm-commons-3.3.jar"/>  
  15.   <classpathentry kind="var" path="M2_REPO/asm/asm-tree/3.3/asm-tree-3.3.jar"/>  
  16.   <classpathentry kind="var" path="M2_REPO/org/freemarker/freemarker/2.3.19/freemarker-2.3.19.jar" />  
  17.   <classpathentry kind="var" path="M2_REPO/commons-fileupload/commons-fileupload/1.2.2/commons-fileupload-1.2.2.jar" />  
  18.   <classpathentry kind="var" path="M2_REPO/commons-io/commons-io/2.3/commons-io-2.3.jar" />  
  19. </classpath>  
其中,本地倉庫目錄會使用M2_REPO變量表示,所以IDE環境未配置該變量時,需在IDE中添加這個變量的classpath。
 
5、聚合與繼承
一個項目一般存在多個模塊,每一個模塊都是做爲一個獨立的工程存在。經過Maven配置文件能夠把多個模塊聚合在一塊兒進行編譯發佈,而且它的聚合很是簡單隻須要使用<modules>元素添加模塊就能夠完成聚合。咱們參考struts2的pom.xml文件來看一下聚合的配置方式:
  1. <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/maven-v4_0_0.xsd">  
  2.     <modelVersion>4.0.0</modelVersion>  
  3.     <parent>  
  4.         <groupId>org.apache.struts</groupId>  
  5.         <artifactId>struts2-parent</artifactId>  
  6.         <version>2.3.8</version>  
  7.     </parent>  
  8.     <groupId>org.apache.struts</groupId>  
  9.     <artifactId>struts2-apps</artifactId>  
  10.     <packaging>pom</packaging>  
  11.     <name>Webapps</name>  
  12.     <modules>  
  13.         <module>blank</module>  
  14.         <module>mailreader</module>  
  15.         <module>portlet</module>  
  16.         <module>showcase</module>  
  17.         <module>rest-showcase</module>  
  18.     </modules>  
  19. ....  
  20. </project>  
另外,在這個項目的個各模塊間一般是存在引用關係,而且每一個模塊會引用一些相同的依賴,Maven也提供了繼承的機制來管理這些共同的依賴。你能夠編寫一個pom.xml文件做爲父級pom配置,各個模塊在本身的pom.xml中繼承父級pom文件,就像上面的示例那樣,使用<parent>元素標識繼承的父級pom文件。
 
父級pom文件的編寫:
一、父級pom文件的packaging必須是pom,它須要做爲pom文件發佈以便子pom繼承
二、在父級pom可使用<dependencyManagement>配置依賴管理。在<dependencyManagement>下的依賴聲明不會引入實際依賴,可是可讓子模塊繼承依賴配置。例如,在子模塊中咱們只標識依賴的groupId和artifactId,它就能夠根據父類的依賴管理獲取這個依賴的version及exclussions等配置。
三、在父級pom中可使用<pluginManagement>配置插件管理。做用和<dependencyManagement>相似,只不過一個管理依賴一個管理插件。
 
子模塊pom文件的編寫:
一、須要使用<parent>元素標識繼承的父pom
二、可使用<relativePath>標識父級pom的物理路徑,子模塊會直接從指定的路徑加載父級pom文件,未指定該元素時,子模塊將根據父級pom的座標從Maven倉庫查找
三、子模塊pom能夠繼承父級pom中除artifactId以外的大部分配置,所以子模塊的groupId、version以及依賴的version均可以省略。
 
6、Maven腳本使用
如今大部分IDE都有插件支持Maven,使用插件能夠方便的構建Maven項目,若是IDE不支持Maven插件或未安裝Maven插件也可使用一個簡單的批處理腳原本完成Maven項目的構建。
例如,保存下面內容,存儲爲bat格式的批處理文件
cd  % ~dp0
call mvn eclipse:clean eclipse:eclipse

pause
運行該文件,就會自動根據該目錄下的pom.xml生成該項目的eclipse開發環境配置。
 
在後面的教程及示例中我都是使用Maven來構建的,pom.xml的示例能夠參考我後面的教程和代碼示例。
相關文章
相關標籤/搜索