maven學習--基礎篇

2016-01-5 16:13:43java

 發現一些錯誤,文章修改中……linux

 

(部分圖片截取自其餘地方,不是很清楚)spring

1、 maven的項目建立和基本命令apache

maven是一個項目管理工具,包含了一個項目對象模型POM,一組標準集合,一個項目生命週期,一個依賴管理系統,和用來運行定義在生命週期階段中插件目標的邏輯。windows

maven遵循約定因爲配置的原則,是指maven雖然支持配置方式,但若是有約定好的默認值,好比約定好的目錄結構,就使用約定的。api

maven的安裝再也不介紹,驗證maven是否安裝成功:緩存

  

安裝成功後,maven下有四個目錄:服務器

bin:包含運行命令mvn、mvnDebug等,既有在windows下運行的,也有在linux/unix下運行的;框架

boot:有maven本身開發的類加載器;eclipse

lib:maven運行所須要的一些jar包,剛安裝maven時,它實際上是很是小的,它只安裝了本身必須的jar包。對於之後在工做中所須要的插件、jar包,他會根據你的須要不斷的進行下載。

conf:配置文件setting.xml,若是在裏面改變配置參數的話,它會對全部的系統用戶都生效,但咱們一般並不但願這件事情發生,咱們但願配置只對當前用戶生效,因此一般會把settings.xml粘貼到到c盤的.m2下。

 

 具體的項目建立:

博客http://blog.csdn.net/edward0830ly/article/details/8748986中介紹的很清楚

 

經常使用的命令:

mvn compile :會對src/main目錄底下的資源和類進行編譯處理,src/main/resources目錄中的全部文件及子目錄,會複製到target/classes目錄中,爲之後的打包提供了方便。

mvn test-compile :只對測試目錄底下的類和資源進行處理,但由於測試依賴於main下面的資源和類,因此會先對這些進行處理。src/test/resources目錄中的全部文件及子目錄,會複製到target/test-classes目錄中,爲後續的測試作準備。

mvn test : 執行測試的一個命令,默認狀況是把工程全部的testcase都執行一遍。若是須要執行某一個 testcase類,能夠經過-Dtest參數。

mvn clean  :把target目錄給清理掉了,不少緩存輸出在target文件夾中。

(mvn claen instal l能夠避免一些錯誤的發生,若是不執行clean,而直接install的話,其過程當中生成的如.class文件就會覆蓋原來的文件,這在通常狀況下是沒有問題的。可是,好比你在源文件刪除了一個java,結果沒有clean,則它依然存在與target中,可能會對最終的結果形成影響。)

mvn package :在target目錄下打包;

mvn exec:能夠執行項目中的main函數。

(二)maven的生命週期

http://juvenshun.iteye.com/blog/213959

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

Clean Lifecycle 在進行真正的構建以前進行一些清理工做;

Default Lifecycle 構建的核心部分,編譯,測試,打包,部署等等;

Site Lifecycle 生成項目報告,站點,發佈站點。

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

每套生命週期都由一組階段(Phase)組成,mvn clean ,這個clean是Clean生命週期的一個階段。Clean生命週期一共包含了三個階段:

pre-clean  執行一些須要在clean以前完成的工做;

clean  移除全部上一次構建生成的文件;

post-clean  執行一些須要在clean以後馬上完成的工做。

注意:

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

Site生命週期的各個階段:

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

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

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

(三)POM (project object model)

Pom其實就是一個xml文件,寫在節點<project></project>裏面

<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.test.maven</groupId>
  <artifactId>test1</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>jar</packaging>

  <name>test1</name>
  <url>http://maven.apache.org</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
  </dependencies>
</project>

其中,modelVersion:maven的默認版本

groupId:建立組織的標識符,通常是域名的倒寫

artifactId:定義了項目在所屬組織下的惟一標識,一個組織下能夠有多個項目

version:當前項目的版本,SNAPSHOT,表示是快照版本,在開發中

url:這個項目所在的網頁地址

properties:指定這個工程在建立或編譯的時候所使用的編碼格式

dependencies:這裏添加了對junit的依賴

scope:肯定junit在什麼範圍內生效。

      complie:默認使用該依賴,對編譯、測試、運行三種classpath都有效;

      test:只對測試時有效,如這裏的junit;

      provided:在運行時無效,對編譯和測試有效,如servlet-api;

      runtime:如jdbc,對測試和運行有效,在編譯時無效。

 

除了在上述pom.xml中配置依賴,使須要的jar包加載到本地倉庫中,還能夠手動加載,使用前面提過的mvn install命令,下面的例子能夠參考

 

(四)在Eclipse中的應用

將上述POM文件中提到的test1導入到eclipse裏:

首先執行命令mvn eclipse:eclipse ,生成 Eclipse 項目文件。將test1轉成一個eclipse工程後,咱們會發現test1裏多了兩個文件,一個是.classpath文件,一個是.project文件;

而後在eclipse中導入項目,file—import—exsiting……。

成功將test1導入eclipse後,若是想在這個工程中繼續添加對其餘的包的依賴,直接打開pom.xml文件進行編輯便可。但若是想刪除某一依賴的話,由於在作mvn eclipse:eclipse時都已經添加到classpath中去了,須要在修改pom.xml文件後,再在eclipse中刷新一下,這樣工程對包的依賴就改變了。

mvn eclipse:clean  刪除增長的.classspath和.project文件,即清除掉eclipse的一些系統設置。

若是開發工具是intelliJ,使用mvn idea:idea,將工程改形成intellij工程。一樣的可使用 mvn idea:clean 來把這個intelliJ工程的信息給刪除掉。

(五)maven本地倉庫轉移

本地倉庫repository放在c盤實際上是不太好的,由於若是要從新安裝操做系統的話,倉庫就會被格式化掉。

完成倉庫的轉移:

一、拷貝repository到其餘盤下,如D盤;

二、打開.m2下的setting.xml文件(從maven的conf目錄下拷貝過去的),找到

 <!-- localRepository
   | The path to the local repository maven will use to store artifacts.
   |
   | Default: ${user.home}/.m2/repository
  <localRepository>/path/to/local/repo</localRepository>
  -->

刪除註釋,改成<localRepository>D:\repository\</localRepository>

(六)maven插件 

在eclipse上安裝maven插件,windows—preference-maven-installation中默認的maven是embedded的,

若是想使用本地maven的話,須要add添加進來。還要注意user settings的文件 ,這裏使用的是.m2目錄下的settings.xml。

在修改setting後,必定要update setting,並reindex,不然eclipse沒法知道對maven的更改,這樣在eclipse中使用maven插件會出問題的。

在pom中,可能會有提示功能,例如輸入一個尖括號<,會自動出現能夠匹配的文本,這是。由於maven插件安裝時在xml catalog中加載進了maven 的xml catalog ,以下 

(七)超級pom

若是工程須要對spring-beans這個包添加依賴,但本地倉庫中沒有這個jar包,咱們執行編譯等命令時可能並無錯誤,由於它自動從一個位置下載下來了。

Maven怎麼知道從哪下載jar包呢,由於maven有一個超級pom,這個pom是全部pom的父pom。

找到maven的安裝目錄,在lib底下有這麼一個jar包 

打開這個包,能夠看到pom-4.0.0.xml 

在這個文件裏就規定了默認倉庫的位置的,規定了java工程的目錄結構,規定了plugin核心插件的版本(由於要保證maven3.3正常運行,就要保證這些插件的版本和它是匹配的)等等。

最後生效的超級pom和自定義pom疊加產生的有效的pom,即effctive pom,它的內容比咱們自定義的pom多的多。

執行命令mvn help:effective-pom能夠在命令行中查看effective pom,也能夠很方便的在eclipse中查看,下面以hello-world工程爲例進行展現:

 

裏面有repositories和PluginRepositories,你還能夠在pom中添加本身的repository,將它放在中央倉庫的上面。

下面是build構建,這是maven最核心的部分了,

其中包括源代碼的目錄,測試源代碼的目錄,輸出目錄、資源文件的目錄等,咱們的工程結構就是來自於這個地方。

如何將一個已有的項目(其工程結構並不符合maven工程要求)歸入到maven管理中去呢?顯然,移動相應的類、包使他符合maven工程的結構並不現實,一個有效的方法就是自定義pom文件。

再下面是<PluginManagement>,PluginManagement表示插件聲明,即你在項目中的PluginManagement下聲明瞭插件,maven不會加載該插件,pluginManagement聲明能夠被繼承。
一個使用案例是當有父子項目的時候,父項目中能夠利用PluginManagement聲明子項目中須要用到的插件。以後,當子項目須要加載該插件的時候,就能夠在子項目中plugins節點只配置 groupId 和 artifactId就能夠完成插件的引用。
pluginManagement主要是爲了統一管理插件,確保全部子項目使用的插件版本保持一致,相似的仍是dependencies和dependencyManagement。 

 

…… 

<plugins>中的plugin是給當前工程用的,是當前工程即將要使用到的plugin,會告訴你使用的是哪個plugin,版本是多少以及要執行的階段、目標。

相關文章
相關標籤/搜索