扯扯maven的蛋

 

一樣是放在有道雲筆記裏,各類散亂加發黴,抽空來整理整理,分幾個部分來扯扯maven。html

1、Maven是啥求。

Maven 爲Apache 組織中的開源項目,主要服務於基於Java 平臺的項目構建依賴管理項目信息管理。這樣說你們又要問了,啥時構建,啥是依賴管理啊。構建提及來可簡單,每一個碼農都在項目中接觸過。何爲構建呢?編譯、運行單元測試、生成文檔、打包和部署等煩瑣且不起眼的工做上,這就是構建。在軟件項目過程當中,手動的構建會佔用大量的時間以及精力,因而有人用軟件的方法讓這一系列工做徹底自動化,使得軟件的構建能夠像全自動流水線同樣。java

除此以外,Maven仍是一個依賴管理工具以及項目信息管理工具。它提供了中央倉庫,能幫咱們自動下載構件。在這個開源的年代裏,幾乎任何Java應用都會借用一些第三方的開源類庫,傳統的方式固然就是手動下載開源的jar包,手動導入到項目中。隨着依賴的增多,版本不一致、版本衝突、依賴臃腫等問題都會接踵而來。手工解決這些問題是十分枯燥的,這時候就須要maven大展宏圖了。Maven經過一個座標系統能夠準確的定位到每個構建(artifact),也就是經過一組座標Maven可以找到任何一個Java 類庫(如jar文件)。apache

Maven的座標系統服務器

如上文所述,maven經過一個座標系統能夠準確的定位到每個構建。maven定義了這樣一組規則:groupId、artifactId、version、packaging、classifier五元組來表示一個惟一的構建。app

  • groupId:定義當前maven項目隸屬的實際項目。
  • artifactId:定義實際項目中的一個maven項目(模塊),推薦的作法是使用實際的項目名稱做爲artifactId的前綴。
  • version:定義maven當前所處的版本。
  • packaging:定義maven項目的打包方式,可選的(默認爲jar)
  • classifier:該元素用來幫助定義構建輸出的一些附屬構件,該屬性不能直接定義。

Maven的安裝:框架

Maven 是一個基於 Java 的工具,因此要作的第一件事情就是安裝 JDK。Maven不一樣版本對jdk的版本有不一樣的要求,Maven 3.3 要求 JDK 1.7 或以上。eclipse

從如下網址下載 Maven 3.3.9:http://maven.apache.org/download.html,解壓文件到你想要的位置來安裝 Maven 3.3.9。maven

解壓完成以後配置對應機器的環境變量,M2_HOME、PATH。ide

環境變量配置完成以後,打開控制檯,輸入mvn --version來驗證maven是否安裝成功。svn

 

 

2、Maven倉庫

在 Maven 的術語中,倉庫是一個位置(place),例如目錄,能夠存儲全部的工程 jar 文件、library jar 文件、插件或任何其餘的工程指定的文件。

Maven 倉庫有三種類型:

  • 本地:Maven 本地倉庫是機器上的一個文件夾,它在你第一次運行任何 maven 命令的時候建立,Maven 本地倉庫默認被建立在 %USER_HOME% 目錄下。
  • 中央:Maven 中央倉庫是由 Maven 社區提供的倉庫,其中包含了大量經常使用的庫。
  • 遠程:若是 Maven 在中央倉庫中也找不到依賴的庫文件,它會中止構建過程並輸出錯誤信息到控制檯。爲避免這種狀況,Maven 提供了遠程倉庫的概念,它是開發人員本身定製倉庫,包含了所須要的代碼庫或者其餘工程中用到的 jar 文件。

 

3、Maven配置

settings.xml

maven的配置文件爲settings.xml,在下面路徑中能夠找到這個文件,分別爲:

  • $M2_HOME/conf/settings.xml:全局設置,在maven的安裝目錄下;
  • ${user.home}/.m2/settings.xml:用戶設置,須要用戶手動添加,能夠將安裝目錄下的settings.xml文件拷貝過來修改。

通常而言,該文件不須要修改,可是在國內訪問maven的中央倉庫太慢了,因此最好配置mirror用於攔截maven對remote repository的相關請求,把請求裏的remote repository地址,重定向到mirror裏配置的地址。

修改maven根目錄下的conf文件夾中的settings.xml文件,內容以下:

<mirrors>
    <mirror>
      <id>alimaven</id>
      <name>aliyun maven</name>
      <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
      <mirrorOf>central</mirrorOf>        
    </mirror>
  </mirrors>

pom.xml

POM 表明工程對象模型。它是使用 Maven 工做時的基本組建,是一個 xml 文件。它被放在工程根目錄下,文件命名爲 pom.xml。

POM 包含了關於工程和各類配置細節的信息,Maven 使用這些信息構建工程。POM 也包含了目標和插件。當執行一個任務或者目標時,Maven 會查找當前目錄下的 POM,從其中讀取所須要的配置信息,而後執行目標。

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/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion><!--maven2.0必須是這樣寫,如今是maven2惟一支持的版本-->
<!-- The Basics -->
<groupId>...</groupId> <!--建立項目的組織或團體的惟一 Id,例如:org.apache.maven-->
<artifactId>...</artifactId> <!--指定工程名例如:appfuse-->
<version>...</version> <!--指定版本號-->
<packaging>...</packaging> <!--打包物的擴展名,通常有 JAR,WAR,EAR 等-->
<classifier>...</classifier> <!--projects are displayed as groupId:artifactId:packaging:classifier:version-->
<name>...</name> <!--一項目的顯示名,經常使用於 Maven 生成的文檔-->
<url>...</url> <!--組織的站點,經常使用於 Maven 生成的文檔-->
<dependencies>
<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.0</version>
    <type>jar</type> <!--相應的依賴產品包形式,如jar,war-->
    <scope>test</scope>
<!--用於限制相應的依賴範圍,包括如下的幾種變量 
compile :默認範圍,使用該依賴範圍,對於編譯,測試,運行三種classpath都有效。
provided:對於編譯和測試classpath有效,但運行時無效。
test:測試依賴範圍。
system:須要外在提供相應得元素。經過systemPath來取得.
runtime:運行時依賴範圍。使用該依賴範圍,對於測試和運行classpath有效,可是編譯時無效。
-->
    <optional>true</optional>
    <!--dependency裏面的exclusions:若是X須要A,A包含B依賴,那麼X能夠聲明不要B依賴,只要在exclusions中聲明exclusion。optional是不會install或者使用B,而exclusion是將B從依賴樹中是刪除。例如appfuse不想使用hibernate,可是appfuse是集成hibernate的,因此就排除掉:-->
    <exclusions>
        <exclusion>
            <groupId>org.appfuse</groupId>
            <artifactId>appfuse-hibernate</artifactId>
        </exclusion>
    </exclusions>
    </dependency>
</dependencies>
<build>
    <resource>
        <directory>src/main/plexus</directory>
        <includes>
          <include>configuration.xml</include>
        </includes>
        <excludes>
          <exclude>**/*.java</exclude>
          <exclude>**/.svn/*</exclude>
        </excludes>
    </resource>
    <!--
    includes:指定包含文件的patterns,符合樣式而且在directory目錄下的文件將會是包含進project的資源文件
    excludes:指定不包含在內的patterns,若是includes與excludes有衝突,那麼excludes勝利,那些符合衝突樣式的文件仍是不會包含進來的  
    -->    
    <plugins>
        <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-jar-plugin</artifactId>
        <version>2.0</version>
        <extensions>false</extensions>
        <inherited>true</inherited>
        <configuration>
          <classifier>test</classifier>
        </configuration>
        <dependencies>...</dependencies>
        <executions>...</executions>
        </plugin>
    </plugins> 
</build>
</project>

 

3、Maven生命週期

Maven強大的一個重要的緣由是它有一個十分完善的生命週期模型(lifecycle),這個生命週期能夠從兩方面來理解,第一,顧名思義,運行Maven的每一個步驟都由它來定義的,這種預約義的默認行爲使得咱們使用Maven變得簡單,相比而言,Ant的每一個步驟都要你手工去定義。第二,這個模型是一種標準,在不一樣的項目中,使用Maven的接口是同樣的,這樣就不用去仔細理解每一個項目的構建了,通常狀況下,mvn clean install 這樣的命令是通用的。我想,必定是吸取了許多項目的經驗,Maven才能定義出如此完善的模型。

Maven有三套相互獨立的生命週期,請注意這裏說的是「三套」,並且「相互獨立」,初學者容易將Maven的生命週期當作一個總體,其實否則。這三套生命週期分別是:

  • Clean Lifecycle 在進行真正的構建以前進行一些清理工做。
  • Default Lifecycle 構建的核心部分,編譯,測試,打包,部署等等。
  • Site Lifecycle 生成項目報告,站點,發佈站點。

我再次強調一下它們是相互獨立的,你能夠僅僅調用clean來清理工做目錄,僅僅調用site來生成站點。固然你也能夠直接運行 mvn clean install site運行全部這三套生命週期。

知道了每套生命週期的大概用途和相互關係之後,來逐個詳細看一下每套生命週期,Clean和Site相對比較簡單,先解釋一下。

每套生命週期都由一組階段(Phase)組成,咱們平時在命令行輸入的命令總會對應於一個特定的階段。好比,運行mvn clean,這個的clean是Clean生命週期的一個階段。有點繞?要知道有Clean生命週期,也有clean階段。Clean生命週期一共包含了三個階段:

  • pre-clean  執行一些須要在clean以前完成的工做
  • clean  移除全部上一次構建生成的文件
  • post-clean  執行一些須要在clean以後馬上完成的工做

mvn clean中的clean就是上面的clean,在一個生命週期中,運行某個階段的時候,它以前的全部階段都會被運行,也就是說,mvn clean 等同於 mvn pre-clean clean,若是咱們運行 mvn post-clean,那麼 pre-clean,clean 都會被運行。這是Maven很重要的一個規則,能夠大大簡化命令行的輸入。

下面看一下Site生命週期的各個階段:

  • pre-site     執行一些須要在生成站點文檔以前完成的工做
  • site    生成項目的站點文檔
  • post-site     執行一些須要在生成站點文檔以後完成的工做,而且爲部署作準備
  • site-deploy     將生成的站點文檔部署到特定的服務器上

這裏常常用到的是site階段和site-deploy階段,用以生成和發佈Maven站點,這但是Maven至關強大的功能,Manager比較喜歡,文檔及統計數據自動生成,很好看。

最後,來看一下Maven的最重要的Default生命週期,絕大部分工做都發生在這個生命週期中,這裏,我只解釋一些比較重要和經常使用的階段:

  • validate
  • generate-sources
  • process-sources
  • generate-resources
  • process-resources     複製並處理資源文件,至目標目錄,準備打包。
  • compile     編譯項目的源代碼。
  • process-classes
  • generate-test-sources 
  • process-test-sources 
  • generate-test-resources
  • process-test-resources     複製並處理資源文件,至目標測試目錄。
  • test-compile     編譯測試源代碼。
  • process-test-classes
  • test     使用合適的單元測試框架運行測試。這些測試代碼不會被打包或部署。
  • prepare-package
  • package     接受編譯好的代碼,打包成可發佈的格式,如 JAR
  • pre-integration-test
  • integration-test
  • post-integration-test
  • verify
  • install     將包安裝至本地倉庫,以讓其它項目依賴。
  • deploy     將最終的包複製到遠程的倉庫,以讓其它開發人員與項目共享。

基本上,根據名稱咱們就能猜出每一個階段的用途,關於其它階段的解釋,請參考 http://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html

記住,運行任何一個階段的時候,它前面的全部階段都會被運行,這也就是爲何咱們運行mvn install的時候,代碼會被編譯,測試,打包。

此外,Maven的插件機制是徹底依賴Maven的生命週期的,所以理解生命週期相當重要。

4、Maven常見命令

maven常見命令以下:

mvn archetype:create :建立 Maven 項目
mvn compile :編譯源代碼
mvn test-compile :編譯測試代碼
mvn test : 運行應用程序中的單元測試
mvn site : 生成項目相關信息的網站
mvn clean :清除目標目錄中的生成結果
mvn package : 依據項目生成 jar 文件
mvn install :在本地 Repository 中安裝 jar
mvn eclipse:eclipse :生成 Eclipse 項目文件

5、Maven && Eclipse

 

6、Maven之亂七八糟

實驗室有時候須要把某一個包安裝到artifactory的內部倉庫裏,便於開發與部署。

當用「mvn install」命令的時候,Maven僅僅打包和安裝構件到本地倉庫,要把它安裝到Artifactory內部倉庫中,咱們須要使用deploy命令。若是直接使用deploy,可能會遇到 Error code 401, User anonymous is not permitted to deploy 的問題,緣由是你沒有權限訪問本地的maven庫。

這時候就須要在settings.xml中添加一條額外的配置

<servers>
<server>  
<id>free4lab</id>  
<username>admin</username>
<password>password</password>  
</server>
</servers>

配置完settings.xml以後,若是直接執行deploy命令可能還會報錯:Deployment failed: repository element was not specified in the POM inside distributionManagement element or in -DaltDeploymentRepository=id::layout::url parameter -> [Help 1]

這時候還須要配置對應maven工程的pom.xml文件,增長以下配置:

<!--用於配置分發管理,配置相應的產品發佈信息,主要用於發佈,在執行mvn deploy後表示要發佈的位置 -->
<
distributionManagement> <repository> <id>free4lab</id> <name>Free4lab Repository</name> <url>http://maven.free4lab.com/artifactory/libs-snapshot-local</url> </repository> </distributionManagement>

 

Maven項目獲取classpath和資源文件路徑:

在maven項目中,配置文件放在maven工程的src/main/resources資源文件夾下,java文件在src/main/java下,如何在java文件中加載配置文件。使用以下代碼:

MyClass.class.getClassLoder().getResource(FILE_NAME).getPath();
相關文章
相關標籤/搜索