一樣是放在有道雲筆記裏,各類散亂加發黴,抽空來整理整理,分幾個部分來扯扯maven。html
Maven 爲Apache 組織中的開源項目,主要服務於基於Java 平臺的項目構建、依賴管理和項目信息管理。這樣說你們又要問了,啥時構建,啥是依賴管理啊。構建提及來可簡單,每一個碼農都在項目中接觸過。何爲構建呢?編譯、運行單元測試、生成文檔、打包和部署等煩瑣且不起眼的工做上,這就是構建。在軟件項目過程當中,手動的構建會佔用大量的時間以及精力,因而有人用軟件的方法讓這一系列工做徹底自動化,使得軟件的構建能夠像全自動流水線同樣。java
除此以外,Maven仍是一個依賴管理工具以及項目信息管理工具。它提供了中央倉庫,能幫咱們自動下載構件。在這個開源的年代裏,幾乎任何Java應用都會借用一些第三方的開源類庫,傳統的方式固然就是手動下載開源的jar包,手動導入到項目中。隨着依賴的增多,版本不一致、版本衝突、依賴臃腫等問題都會接踵而來。手工解決這些問題是十分枯燥的,這時候就須要maven大展宏圖了。Maven經過一個座標系統能夠準確的定位到每個構建(artifact),也就是經過一組座標Maven可以找到任何一個Java 類庫(如jar文件)。apache
Maven的座標系統服務器
如上文所述,maven經過一個座標系統能夠準確的定位到每個構建。maven定義了這樣一組規則:groupId、artifactId、version、packaging、classifier五元組來表示一個惟一的構建。app
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
在 Maven 的術語中,倉庫是一個位置(place),例如目錄,能夠存儲全部的工程 jar 文件、library jar 文件、插件或任何其餘的工程指定的文件。
Maven 倉庫有三種類型:
maven的配置文件爲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 包含了關於工程和各類配置細節的信息,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>
Maven強大的一個重要的緣由是它有一個十分完善的生命週期模型(lifecycle),這個生命週期能夠從兩方面來理解,第一,顧名思義,運行Maven的每一個步驟都由它來定義的,這種預約義的默認行爲使得咱們使用Maven變得簡單,相比而言,Ant的每一個步驟都要你手工去定義。第二,這個模型是一種標準,在不一樣的項目中,使用Maven的接口是同樣的,這樣就不用去仔細理解每一個項目的構建了,通常狀況下,mvn clean install 這樣的命令是通用的。我想,必定是吸取了許多項目的經驗,Maven才能定義出如此完善的模型。
Maven有三套相互獨立的生命週期,請注意這裏說的是「三套」,並且「相互獨立」,初學者容易將Maven的生命週期當作一個總體,其實否則。這三套生命週期分別是:
我再次強調一下它們是相互獨立的,你能夠僅僅調用clean來清理工做目錄,僅僅調用site來生成站點。固然你也能夠直接運行 mvn clean install site運行全部這三套生命週期。
知道了每套生命週期的大概用途和相互關係之後,來逐個詳細看一下每套生命週期,Clean和Site相對比較簡單,先解釋一下。
每套生命週期都由一組階段(Phase)組成,咱們平時在命令行輸入的命令總會對應於一個特定的階段。好比,運行mvn clean,這個的clean是Clean生命週期的一個階段。有點繞?要知道有Clean生命週期,也有clean階段。Clean生命週期一共包含了三個階段:
mvn clean中的clean就是上面的clean,在一個生命週期中,運行某個階段的時候,它以前的全部階段都會被運行,也就是說,mvn clean 等同於 mvn pre-clean clean,若是咱們運行 mvn post-clean,那麼 pre-clean,clean 都會被運行。這是Maven很重要的一個規則,能夠大大簡化命令行的輸入。
下面看一下Site生命週期的各個階段:
這裏常常用到的是site階段和site-deploy階段,用以生成和發佈Maven站點,這但是Maven至關強大的功能,Manager比較喜歡,文檔及統計數據自動生成,很好看。
最後,來看一下Maven的最重要的Default生命週期,絕大部分工做都發生在這個生命週期中,這裏,我只解釋一些比較重要和經常使用的階段:
基本上,根據名稱咱們就能猜出每一個階段的用途,關於其它階段的解釋,請參考 http://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html
記住,運行任何一個階段的時候,它前面的全部階段都會被運行,這也就是爲何咱們運行mvn install的時候,代碼會被編譯,測試,打包。
此外,Maven的插件機制是徹底依賴Maven的生命週期的,所以理解生命週期相當重要。
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();