<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
        問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
        當前位置: 首頁 - 科技 - 知識百科 - 正文

        Maven小技巧

        來源:懂視網 責編:小采 時間:2020-11-09 07:32:45
        文檔

        Maven小技巧

        Maven小技巧:前言 Maven,發音是[`meivin],專家的意思。它是一個很好的項目管理工具,很早就進入了我的必備工具行列,但是這次為了把ABPM項目 完全遷移并應用maven,所以對maven進行了一些深入的學習。寫這個學習筆記的目的,一個是為了自己備忘,二則希望能夠為其他人
        推薦度:
        導讀Maven小技巧:前言 Maven,發音是[`meivin],專家的意思。它是一個很好的項目管理工具,很早就進入了我的必備工具行列,但是這次為了把ABPM項目 完全遷移并應用maven,所以對maven進行了一些深入的學習。寫這個學習筆記的目的,一個是為了自己備忘,二則希望能夠為其他人

        前言 Maven,發音是[`meivin],專家的意思。它是一個很好的項目管理工具,很早就進入了我的必備工具行列,但是這次為了把ABPM項目 完全遷移并應用maven,所以對maven進行了一些深入的學習。寫這個學習筆記的目的,一個是為了自己備忘,二則希望能夠為其他人

        前言

        Maven,發音是[`meivin],"專家"的意思。它是一個很好的項目管理工具,很早就進入了我的必備工具行列,但是這次為了把ABPM項目 完全遷移并應用maven,所以對maven進行了一些深入的學習。寫這個學習筆記的目的,一個是為了自己備忘,二則希望能夠為其他人學習使用maven 縮短一些時間。

        maven概要

        首先我把maven的概念快速的梳理一下,讓我們快速地建立起一個比較精確的maven應用場景。

        maven不是什么

        讀書時候要先限定范圍,避免一些有害的遐想。要說maven不是什么,我們可以從如下幾個要點來展開

        1. maven不是ant,也不是make。
          我們以前接觸的構建工具,需要寫一些詳細的步驟,比如: compile project1/src/*.java 等類似的語句。這些語句正是我們使用ant和make所要編寫的東西。maven采用了"約定優于配置"的方法,一些開發常用的操作和步驟已經固化在 maven中,所以使用者不再需要去編寫那些煩人的語句了。同時,maven內置了開發流程的支持,它不僅能夠編譯,同樣能夠打包、發布,也能夠一氣呵成 做完這些所有的步驟。
        2. maven不是ivy
          依賴管理是maven的功能之一,雖然很多人包括我以前都是只用它的依賴管理功能,但是要深入運用的話,我們就可以看到更多的內容。更重要的是,maven在依賴關系中加入了scope的概念,進一步細化了依賴關系的劃分。
        maven是什么

        maven將自己定位為一個項目管理工具。它負責管理項目開發過程中的幾乎所有的東西:

        1. 版本
          maven有自己的版本定義和規則
        2. 構建
          maven支持許多種的應用程序類型,對于每一種支持的應用程序類型都定義好了一組構建規則和工具集。
        3. 輸出物管理
          maven可以管理項目構建的產物,并將其加入到用戶庫中。這個功能可以用于項目組和其他部門之間的交付行為。
        4. 依賴關系
          maven對依賴關系的特性進行細致的分析和劃分,避免開發過程中的依賴混亂和相互污染行為
        5. 文檔和構建結果
          maven的site命令支持各種文檔信息的發布,包括構建過程的各種輸出,javadoc,產品文檔等。
        6. 項目關系
          一個大型的項目通常有幾個小項目或者模塊組成,用maven可以很方便地管理
        7. 移植性管理
          maven可以針對不同的開發場景,輸出不同種類的輸出結果。
        maven的生命周期

        maven把項目的構建劃分為不同的生命周期(lifecycle),在我看來,劃分的已經是非常仔細了,大家可以參考這里 。粗略一點的話,它這個過程(phase)包括:編譯、測試、打包、集成測試、驗證、部署。maven中所有的執行動作(goal)都需要指明自己在這個過程中的執行位置,然后maven執行的時候,就依照過程的發展依次調用這些goal進行各種處理。

        這個也是maven的一個基本調度機制。一般來說,位置稍后的過程都會依賴于之前的過程。當然,maven同樣提供了配置文件,可以依照用戶要求,跳過某些階段。

        maven的"約定優于配置"

        所謂的"約定優于配置",在maven中并不是完全不可以修改的,他們只是一些配置的默認值而已。但是使用者除非必要,并不需要去修改那些約定內容。maven默認的文件存放結構如下:

      1. /項目目錄
      2. pom.xml 用于maven的配置文件
      3. /src 源代碼目錄
      4. /src/main 工程源代碼目錄
      5. /src/main/java 工程java源代碼目錄
      6. /src/main/resource 工程的資源目錄
      7. /src/test 單元測試目錄
      8. /src/test/java
      9. /target 輸出目錄,所有的輸出物都存放在這個目錄下
      10. /target/classes 編譯之后的class文件
      11. 每一個階段的任務都知道怎么正確完成自己的工作,比如compile任務就知道從src/main/java下編譯所有的java文件,并把它的輸出class文件存放到target/classes中。

        對maven來說,采用"約定優于配置"的策略可以減少修改配置的工作量,也可以降低學習成本,更重要的是,給項目引入了統一的規范。

        maven的版本規范

        maven使用如下幾個要素來唯一定位某一個輸出物: groupId:artifactId:packaging:version 。比如org.springframework:spring:2.5 。每個部分的解釋如下:

      12. groupId
        團體,公司,小組,組織,項目,或者其它團體。團體標識的約定是,它以創建這個項目的組織名稱的逆向域名(reverse domain name)開頭。來自Sonatype的項目有一個以com.sonatype開頭的groupId,而Apache Software的項目有以org.apache開頭的groupId。
      13. artifactId
        在groupId下的表示一個單獨項目的唯一標識符。比如我們的tomcat, commons等。不要在artifactId中包含點號(.)。
      14. version
        一個項目的特定版本。發布的項目有一個固定的版本標識來指向該項目的某一個特定的版本。而正在開發中的項目可以用一個特殊的標識,這種標識給版本加上一個"SNAPSHOT"的標記。
        雖然項目的打包格式也是Maven坐標的重要組成部分,但是它不是項目唯一標識符的一個部分。一個項目的 groupId:artifactId:version使之成為一個獨一無二的項目;你不能同時有一個擁有同樣的groupId, artifactId和version標識的項目。
      15. packaging
        項目的類型,默認是jar,描述了項目打包后的輸出。類型為jar的項目產生一個JAR文件,類型為war的項目產生一個web應用。
      16. classifier
        很少使用的坐標,一般都可以忽略classifiers。如果你要發布同樣的代碼,但是由于技術原因需要生成兩個單獨的構件,你就要使用一個分類器 (classifier)。例如,如果你想要構建兩個單獨的構件成JAR,一個使用Java 1.4編譯器,另一個使用Java 6編譯器,你就可以使用分類器來生成兩個單獨的JAR構件,它們有同樣的groupId:artifactId:version組合。如果你的項目使用本 地擴展類庫,你可以使用分類器為每一個目標平臺生成一個構件。分類器常用于打包構件的源碼,JavaDoc或者二進制集合。
      17. maven有自己的版本規范,一般是如下定義 ..- , 比如1.2.3-beta-01。要說明的是,maven自己判斷版本的算法是major,minor,incremental部分用數字比 較,qualifier部分用字符串比較,所以要小心 alpha-2和alpha-15的比較關系,最好用 alpha-02的格式。

        maven在版本管理時候可以使用幾個特殊的字符串 SNAPSHOT ,LATEST ,RELEASE 。比如"1.0-SNAPSHOT"。各個部分的含義和處理邏輯如下說明:

      18. SNAPSHOT
        如果一個版本包含字符串"SNAPSHOT",Maven就會在安裝或發布這個組件的時候將該符號展開為一個日期和時間值,轉換為UTC時間。例 如,"1.0-SNAPSHOT"會在2010年5月5日下午2點10分發布時候變成1.0-20100505-141000-1。
        這個詞只能用于開發過程中,因為一般來說,項目組都會頻繁發布一些版本,最后實際發布的時候,會在這些snapshot版本中尋找一個穩定的,用于正式發 布,比如1.4版本發布之前,就會有一系列的1.4-SNAPSHOT,而實際發布的1.4,也是從中拿出來的一個穩定版。
      19. LATEST
        指某個特定構件的最新發布,這個發布可能是一個發布版,也可能是一個snapshot版,具體看哪個時間最后。
      20. RELEASE
        指最后一個發布版。
      21. maven的組成部分

        maven把整個maven管理的項目分為幾個部分,一個部分是源代碼,包括源代碼本身、相關的各種資源,一個部分則是單元測試用例,另外一部分則是各種maven的插件。對于這幾個部分,maven可以獨立管理他們,包括各種外部依賴關系。

        maven的依賴管理

        依賴管理一般是最吸引人使用maven的功能特性了,這個特性讓開發者只需要關注代碼的直接依賴,比如我們用了spring,就加入spring依賴說明就可以了,至于spring自己還依賴哪些外部的東西,maven幫我們搞定。

        任意一個外部依賴說明包含如下幾個要素:groupId, artifactId, version, scope, type, optional。其中前3個是必須的,各自含義如下:

      22. groupId 必須
      23. artifactId 必須
      24. version 必須。
        這里的version可以用區間表達式來表示,比如(2.0,)表示>2.0,[2.0,3.0)表示2.0<=ver<3.0;多個條件之間用逗號分隔,比如[1,3),[5,7]。
      25. scope 作用域限制
      26. type 一般在pom引用依賴時候出現,其他時候不用
      27. optional 是否可選依賴
      28. maven認為,程序對外部的依賴會隨著程序的所處階段和應用場景而變化,所以maven中的依賴關系有作用域(scope)的限制。在maven中,scope包含如下的取值:

      29. compile(編譯范圍)
        compile是默認的范圍;如果沒有提供一個范圍,那該依賴的范圍就是編譯范圍。編譯范圍依賴在所有的classpath中可用,同時它們也會被打包。
      30. provided(已提供范圍)
        provided依賴只有在當JDK或者一個容器已提供該依賴之后才使用。例如,如果你開發了一個web應用,你可能在編譯classpath中需要可用 的Servlet API來編譯一個servlet,但是你不會想要在打包好的WAR中包含這個Servlet API;這個Servlet API JAR由你的應用服務器或者servlet容器提供。已提供范圍的依賴在編譯classpath(不是運行時)可用。它們不是傳遞性的,也不會被打包。
      31. runtime(運行時范圍)
        runtime依賴在運行和測試系統的時候需要,但在編譯的時候不需要。比如,你可能在編譯的時候只需要JDBC API JAR,而只有在運行的時候才需要JDBC驅動實現。
      32. test(測試范圍)
        test范圍依賴 在一般的 編譯和運行時都不需要,它們只有在測試編譯和測試運行階段可用。測試范圍依賴在之前的???中介紹過。
      33. system(系統范圍)
        system范圍依賴與provided類似,但是你必須顯式的提供一個對于本地系統中JAR文件的路徑。這么做是為了允許基于本地對象編譯,而這些對象是系統類庫的一部分。這樣的構件應該是一直可用的,Maven也不會在倉庫中去尋找它。 如果你將一個依賴范圍設置成系統范圍,你必須同時提供一個systemPath元素 。注意該范圍是不推薦使用的(你應該一直盡量去從公共或定制的Maven倉庫中引用依賴)。
      34. 另外,代碼有代碼自己的依賴,各個maven使用的插件也可以有自己的依賴關系。依賴也可以是可選的,比如我們代碼中沒有任何cache依賴,但是hibernate可能要配置cache,所以該cache的依賴就是可選的。

        多項目管理

        maven的多項目管理也是非常強大的。一般來說,maven要求同一個工程的所有子項目都放置到同一個目錄下,每一個子目錄代表一個項目,比如

      35. 總項目/
      36. pom.xml 總項目的pom配置文件
      37. 子項目1/
      38. pom.xml 子項目1的pom文件
      39. 子項目2/
      40. pom.xml 子項目2的pom文件
      41. 按照這種格式存放,就是繼承方式,所有具體子項目的pom.xml都會繼承總項目pom的內容,取值為子項目pom內容優先。

        要設置繼承方式,首先要在總項目的pom中加入如下配置

        Xml代碼

        1. simple-weather
        2. simple-webapp

        其次在每個子項目中加入

        
         org.sonatype.mavenbook.ch06
         simple-parent
         1.0
         
        

        即可。

        當然,繼承不是唯一的配置文件共用方式,maven還支持引用方式。引用pom的方式更簡單,在依賴中加入一個type為pom的依賴即可。

        Xml代碼

        1. This is a project requiring JDBC
        2. ...
        3. ...
        4. org.sonatype.mavenbook
        5. persistence-deps
        6. 1.0
        7. pom

        屬性

        用戶可以在maven中定義一些屬性,然后在其他地方用${xxx}進行引用。比如:

        Xml代碼

        1. 4.0.0
        2. ...
        3. value1

        maven提供了三個隱式的變量,用來訪問系統環境變量、POM信息和maven的settings:

      42. env
        暴露操作系統的環境變量,比如env.PATH
      43. project
        暴露POM中的內容,用點號(.)的路徑來引用POM元素的值,比如${project.artifactId}。另外,java的系統屬性比如user.dir等,也暴露在這里。
      44. settings
        暴露maven的settings的信息,也可以用點號(.)來引用。maven把系統配置文件存放在maven的安裝目錄中,把用戶相關的配置文件存放 在~/.m2/settings.xml(unix)或者%USERPROFILE%/.m2/settings.xml(windows)中。
      45. maven的profile

        profile是maven的一個重要特性,它可以讓maven能夠自動適應外部的環境變化,比如同一個項目,在linux下編譯linux的版 本,在win下編譯win的版本等。一個項目可以設置多個profile,也可以在同一時間設置多個profile被激活(active)的。自動激活的 profile的條件可以是各種各樣的設定條件,組合放置在activation節點中,也可以通過命令行直接指定。profile包含的其他配置內容可 以覆蓋掉pom定義的相應值。如果認為profile設置比較復雜,可以將所有的profiles內容移動到專門的 profiles.xml 文件中,不過記得和pom.xml放在一起。

        activation節點中的激活條件中常見的有如下幾個:

        1. os
          判斷操作系統相關的參數,它包含如下可以自由組合的子節點元素
        2. message - 規則失敗之后顯示的消息
        3. arch - 匹配cpu結構,常見為x86
        4. family - 匹配操作系統家族,常見的取值為:dos,mac,netware,os/2,unix,windows,win9x,os/400等
        5. name - 匹配操作系統的名字
        6. version - 匹配的操作系統版本號
        7. display - 檢測到操作系統之后顯示的信息
        8. jdk
          檢查jdk版本,可以用區間表示。
        9. property
          檢查屬性值,本節點可以包含name和value兩個子節點。
        10. file
          檢查文件相關內容,包含兩個子節點:exists和missing,用于分別檢查文件存在和不存在兩種情況。

        maven的操作和使用

        maven的操作有兩種方式,一種是通過mvn命令行命令,一種是使用maven的eclipse插件。因為使用eclipse的maven插件操作起來比較容易,這里就只介紹使用mvn命令行的操作。

        maven的配置文件

        maven的主執行程序為mvn.bat,linux下為mvn.sh,這兩個程序都很簡單,它們的共同用途就是收集一些參數,然后用 java.exe來運行maven的Main函數。maven同樣需要有配置文件,名字叫做settings.xml,它放在兩個地方,一個是maven 安裝目錄的conf目錄下,對所有使用該maven的用戶都起作用,我們稱為主配置文件,另外一個放在 %USERPROFILE%/.m2/settings.xml下,我們成為用戶配置文件,只對當前用戶有效,且可以覆蓋主配置文件的參數內容。還有就是 項目級別的配置信息了,它存放在每一個maven管理的項目目錄下,叫pom.xml,主要用于配置項目相關的一些內容,當然,如果有必要,用戶也可以在 pom中寫一些配置,覆蓋住配置文件和用戶配置文件的設置參數內容。

        一般來說,settings文件配置的是比如repository庫路徑之類的全局信息,具體可以參考官方網站的文章 。

        創建新工程

        要創建一個新的maven工程,我們需要給我們的工程指定幾個必要的要素,就是maven產品坐標的幾個要素:groupId, artifactId,如果愿意,你也可以指定version和package名稱。我們先看一個簡單的創建命令:

        d:\work\temp>mvn archetype:create -DgroupId=com.abc -DartifactId=product1 -DarchetypeArtifactId=maven-archetype-webapp

        首先看這里的命令行參數的傳遞結構,怪異的 -D參數=值 的方式是 java.exe 要求的方式。這個命令創建一個web工程,目錄結構是一個標準的maven結構,如下:

        D:.
        └─mywebapp
         │ pom.xml
         │
         └─src
         └─main
         ├─resources
         └─webapp
         │ index.jsp
         │
         └─WEB-INF
         web.xml

        大家要注意,這里目錄結構的布局實際上是由參數 archetypeArtifactId 來決定的,因為這里傳入的是 maven-archetype-webapp如果我們傳入其他的就會創建不同的結構,默認值為 maven-archetype-quickstart ,有興趣的讀者可以參考更詳細的列表 ,我把部分常用的列表在這里:

        Artifact Group Version Repository Description
        maven-archetype-j2ee-simple org.apache.maven.archetypes A simple J2EE Java application
        maven-archetype-marmalade-mojo org.apache.maven.archetypes A Maven plugin development project using marmalade
        maven-archetype-plugin org.apache.maven.archetypes A Maven Java plugin development project
        maven-archetype-portlet org.apache.maven.archetypes A simple portlet application
        maven-archetype-profiles org.apache.maven.archetypes
        maven-archetype-quickstart org.apache.maven.archetypes
        maven-archetype-simple org.apache.maven.archetypes
        maven-archetype-site-simple org.apache.maven.archetypes A simple site generation project
        maven-archetype-site org.apache.maven.archetypes A more complex site project
        maven-archetype-webapp org.apache.maven.archetypes A simple Java web application
        maven-archetype-har net.sf.maven-har 0.9 Hibernate Archive
        maven-archetype-sar net.sf.maven-sar 0.9 JBoss Service Archive

        大家可以參考更詳細的 archetype:create 幫助 和 archtype參考信息 。

        maven的多項目管理

        多項目管理是maven的主要特色之一,對于一個大型工程,用maven來管理他們之間復雜的依賴關系,是再好不過了。maven的項目配置之間的關系有兩種:繼承關系和引用關系。
        maven默認根據目錄結構來設定pom的繼承關系,即下級目錄的pom默認繼承上級目錄的pom。要設定兩者之間的關系很簡單,上級pom如下設置:

        Xml代碼

        1. ABCCommon
        2. ABCCore
        3. ABCTools

        要記住的是,這里的module是目錄名,不是子工程的artifactId。子工程如下設置:

        Xml代碼

        1. com.abc.product1
        2. abc-product1
        3. 1.0.0-SNAPSHOT
        4. abc-my-module2
        5. jar

        這樣兩者就相互關聯起來了,繼承關系就設定完畢,所有父工程的配置內容都會自動在子工程中生效,除非子工程有相同的配置覆蓋。如果你不喜歡層層遞進的目錄結構來實現繼承,也可以在parent中加入 ../a-parent/pom.xml 來制定parent項目的相對目錄。繼承關系通常用在項目共同特性的抽取上,通過抽取公共特性,可以大幅度減少子項目的配置工作量。

        引用關系是另外一種復用的方式,maven中配置引用關系也很簡單,加入一個 typepom 的依賴即可。

        Xml代碼

        1. org.sonatype.mavenbook
        2. persistence-deps
        3. 1.0
        4. pom

        但是無論是父項目還是引用項目,這些工程都必須用 mvn install 或者 mvn deploy 安裝到本地庫才行,否則會報告依賴沒有找到,eclipse編譯時候也會出錯。

        需要特別提出的是復用過程中,父項目的pom中可以定義 dependencyManagement 節點,其中存放依賴關系,但是這個依賴關系只是定義,不會真的產生效果,如果子項目想要使用這個依賴關系,可以在本身的 dependency 中添加一個簡化的引用

        Xml代碼

        1. org.springframework
        2. spring

        這種方法可以避免版本號滿天飛的情況。

        安裝庫文件到maven庫中

        在maven中一般都會用到安裝庫文件的功能,一則是我們常用的hibernate要使用jmx庫,但是因為sun的license限制,所以無法將其直接包含在repository中。所以我們使用mvn命令把jar安裝到我們本地的repository中

        mvn install:install-file -DgroupId=com.sun.jdmk -DartifactId=jmxtools -Dversion=1.2.1 -Dpackaging=jar -Dfile=/path/to/file

        如果我們想把它安裝到公司的repository中,需要使用命令

        mvn deploy:deploy-file -DgroupId=com.sun.jdmk -DartifactId=jmxtools -Dversion=1.2.1 -Dpackaging=jar -Dfile=/path/to/file -Durl=http://aaa.ss.com/ss.xxx -DrepositoryId=release-repo

        對于我們的工程輸出,如果需要放置到公司的repository中的話,可以通過配置pom來實現

        Xml代碼

        1. mycompany-repository
        2. MyCompany Repository
        3. scp://repository.mycompany.com/repository/maven2

        這里使用的scp方式提交庫文件,還有其他方式可以使用,請參考faq部分。然后記得在你的settings.xml中加入這一內容

        Xml代碼

        1. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        2. xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0
        3. http://maven.apache.org/xsd/settings-1.0.0.xsd">
        4. ...
        5. mycompany-repository
        6. jvanzyl
        7. /path/to/identity
        8. my_key_passphrase
        9. ...

        maven的變量

        maven定義了很多變量屬性,參考這里 http://docs.codehaus.org/display/MAVENUSER/MavenPropertiesGuide

        1. 內置屬性
        2. ${basedir } represents the directory containing pom.xml
        3. ${version } equivalent to ${project.version } or ${pom.version }
        4. Pom/Project properties
          所有pom中的元素都可以用 project. 前綴進行引用,以下是部分常用的
        5. ${project.build.directory } results in the path to your "target" dir, this is the same as${pom.project.build.directory }
        6. ${project.build. outputD irectory } results in the path to your "target/classes" dir
        7. ${project.name } refers to the name of the project.
        8. ${project.version } refers to the version of the project.
        9. ${project.build.finalName } refers to the final name of the file created when the built project is packaged
        10. 本地用戶設定
          所有用的的 settings.xml 中的設定都可以通過 settings. 前綴進行引用
        11. ${settings.localRepository } refers to the path of the user's local repository.
        12. ${maven.repo.local } also works for backward compatibility with maven1 ??
        13. 環境變量
          系統的環境變量通過 env. 前綴引用
        14. ${env.M2_HOME } returns the Maven2 installation path.
        15. ${java.home } specifies the path to the current JRE_HOME environment use with relative paths to get for example:
          ${java.home}../bin/java.exe
        16. java系統屬性
          所有JVM中定義的java系統屬性.
        17. 用戶在pom中定義的自定義屬性

          
          ...
          
          hello
          
          ...
           
          

        18. ${my.filter.value } will result in hello if you inserted the above XML fragment in your pom.xml
        19. 上級工程的變量
          上級工程的pom中的變量用前綴 ${project.parent } 引用. 上級工程的版本也可以這樣引用: ${parent.version }.
        maven的使用

        我們已經知道maven預定義了許多的階段(phase),每個插件都依附于這些階段,并且在進入某個階段的時候,調用運行這些相關插件的功能。我們先來看完整的maven生命周期:

        生命周期 階段描述
        validate 驗證項目是否正確,以及所有為了完整構建必要的信息是否可用
        generate-sources 生成所有需要包含在編譯過程中的源代碼
        process-sources 處理源代碼,比如過濾一些值
        generate-resources 生成所有需要包含在打包過程中的資源文件
        process-resources 復制并處理資源文件至目標目錄,準備打包
        compile 編譯項目的源代碼
        process-classes 后處理編譯生成的文件,例如對Java類進行字節碼增強(bytecode enhancement)
        generate-test-sources 生成所有包含在測試編譯過程中的測試源碼
        process-test-sources 處理測試源碼,比如過濾一些值
        generate-test-resources 生成測試需要的資源文件
        process-test-resources 復制并處理測試資源文件至測試目標目錄
        test-compile 編譯測試源碼至測試目標目錄
        test 使用合適的單元測試框架運行測試。這些測試應該不需要代碼被打包或發布
        prepare-package 在真正的打包之前,執行一些準備打包必要的操作。這通常會產生一個包的展開的處理過的版本(將會在Maven 2.1+中實現)
        package 將編譯好的代碼打包成可分發的格式,如JAR,WAR,或者EAR
        pre-integration-test 執行一些在集成測試運行之前需要的動作。如建立集成測試需要的環境
        integration-test 如果有必要的話,處理包并發布至集成測試可以運行的環境
        post-integration-test 執行一些在集成測試運行之后需要的動作。如清理集成測試環境。
        verify 執行所有檢查,驗證包是有效的,符合質量規范
        install 安裝包至本地倉庫,以備本地的其它項目作為依賴使用
        deploy 復制最終的包至遠程倉庫,共享給其它開發人員和項目(通常和一次正式的發布相關)

        maven核心的插件列表可以參考 http://maven.apache.org/plugins/index.html 。這里僅列舉幾個常用的插件及其配置參數:

        1. clean插件
          只包含一個goal叫做 clean:clean ,負責清理構建時候創建的文件。 默認清理的位置是如下幾個變量指定的路徑project.build.directory, project.build.outputDirectory, project.build.testOutputDirectory, and project.reporting.outputDirectory
        2. compiler插件
          包含2個goal,分別是 compiler:compilecompiler:testCompile 。可以到這里查看兩者的具體參數設置:compile ,testCompile 。
        3. surefire插件
          運行單元測試用例的插件,并且能夠生成報表。包含一個goal為 surefire:test 。主要參數testSourceDirectory用來指定測試用例目錄,參考完整用法幫助
        4. jar
          負責將工程輸出打包到jar文件中。包含兩個goal,分別是 jar:jar , jar:test-jar 。兩個goal負責從classesDirectory或testClassesDirectory中獲取所有資源,然后輸出jar文件到outputDirectory中。
        5. war
          負責打包成war文件。常用goal有 war:war ,負責從warSourceDirectory(默認${basedir}/src/main/webapp)打包所有資源到outputDirectory中。
        6. resources
          負責復制各種資源文件,常用goal有 resources:resources ,負責將資源文件復制到outputDirectory中,默認為${project.build.outputDirectory}。
        7. install
          負責將項目輸出(install:install)或者某個指定的文件(install:install-file)加入到本機庫%USERPROFILE%/.m2/repository中??梢杂?install:help 尋求幫助。
        8. deploy
          負責將項目輸出(deploy:deploy)或者某個指定的文件(deploy:deploy-file)加入到公司庫中。
        9. site
          將工程所有文檔生成網站,生成的網站界面默認和apache的項目站點類似,但是其文檔用doxia格式寫的,目前不支持docbook,需要用其他插件配合才能支持。

        maven的使用問答

        除了以下的幾個faq條目之外,還有一些faq可以參考

        1. maven 自己的FAQ

        兄弟們如果有其他問題,歡迎跟帖提問!

        依賴關系

        問:如何增加刪除一個依賴關系?

        答:直接在pom文件中加入一個dependency節點,如果要刪除依賴,把對應的dependency節點刪除即可。

        問:如何屏蔽一個依賴關系?比如項目中使用的libA依賴某個庫的1.0版,libB以來某個庫的2.0版,現在想統一使用2.0版,如何去掉1.0版的依賴?

        答:設置exclusion即可。

        Xml代碼

        1. org.hibernate
        2. hibernate
        3. 3.2.5.ga
        4. javax.transaction
        5. jta

        問:我有一些jar文件要依賴,但是我又不想把這些jar去install到mvn的repository中去,怎么做配置?

        答:加入一個特殊的依賴關系,使用system類型,如下:

        
         	com.abc
         	my-tools
         	2.5.0
         	jar
        	 system
         ${basedir}/lib/mylib1.jar
        	
         
        

        但是要記住,發布的時候不會復制這個jar。需要手工配置,而且其他project依賴這個project的時候,會報告警告。如果沒有特殊要求,建議直接注冊發布到repository。

        問:在eclipse環境中同時使用maven builder和eclipse builder,并且設置項目依賴關系之后,為什么編譯會出現artifact找不到錯誤,但是直接使用命令行mvn構建則一切正常?

        答:在project屬性中去掉java build path中對其他 project 的依賴關系,直接在pom中設置依賴關系即可

         	
        	com.abc.project1
        	abc-project1-common
        	${project.version}
         	
         
        

        另外,保證沒有其他錯誤。

        問:我想讓輸出的jar包自動包含所有的依賴

        答:使用 assembly 插件即可。

        
         maven-assembly-plugin
         
         
         jar-with-dependencies
         
         
         
         
        

        問:我的測試用例依賴于其他工程的測試用例,如何設置?

        答:maven本身在發布的時候,可以發布單純的jar,也可以同時發布xxx-tests.jar和xxx-javadoc.jar(大家經常在repository中可以看到類似的東西)。我們自己的項目A要同時輸出test.jar可以做如下的設置

         
         org.apache.maven.plugins
         maven-jar-plugin
         
         
         
         test-jar
         
         
         
         
         
        

        然后在其他需要引用的工程B中做如下的dependency設置

        Xml代碼

        1. com.abc.XXX
        2. 工程A
        3. ${project.version}
        4. test-jar
        5. test

        變量

        問:如何使用變量替換?項目中的某個配置文件比如jdbc.properties使用了一些pom中的變量,如何在發布中使用包含真實內容的最終結果文件?

        答:使用資源過濾功能,比如:

        
         ..
         
         com.mysql.jdbc.Driver
         jdbc:mysql://localhost:3306/development_db
         dev_user
         s3cr3tw0rd
         
         ..
         
         
         
         src/main/resources
         true
         
         
         
         ..
         
         
         production
         
         oracle.jdbc.driver.OracleDriver
         jdbc:oracle:thin:@proddb01:1521:PROD
         prod_user
         s00p3rs3cr3t
         
         
         
        
         
        

        問: maven-svn-revision-number-plugin 插件說明

        答: maven-svn-revision-number-plugin 可以從 SVN 中獲取版本號,并將其變成環境變量,交由其他插件或者profile使用,詳細幫助在這里 。一般和resource的filter機制同時使用

        
         
         com.google.code.maven-svn-revision-number-plugin
         maven-svn-revision-number-plugin
         1.3
         
         
         
         revision
         
         
         
         
         
         
         prefix
         
         
         
         
         
         
        

        這段代碼負責把resource文件中的內容替換成適當內容

        repository = ${prefix.repository}
        path = ${prefix.path}
        revision = ${prefix.revision}
        mixedRevisions = ${prefix.mixedRevisions}
        committedRevision = ${prefix.committedRevision}
        status = ${prefix.status}
        specialStatus = ${prefix.specialStatus}

        編譯

        問:如何給插件指派參數?比如我要設置一些編譯參數

        答:以下內容設定編譯器編譯java1.5的代碼

        
         ...
         
         ...
         
         
         maven-compiler-plugin
         
         1.5
         1.5
         
         
         
         ...
         
         ...
        
         
        
        

        要設置其他插件的參數也可以,請參考對應插件的幫助信息

        問:我的目錄是非標準的目錄結構,如何設置讓maven支持?

        答:指定source目錄和test-source目錄即可。

        
         target
         src
         

        這個例子把源代碼設置成了src目錄,測試代碼在test目錄,所以輸出到bin目錄。這里要注意,directory如果也設置成bin目錄的 話,maven打包的時候會引起死循環,因為directory是所有工作存放的地方,默認包含outputDirectory定義的目錄在內。

        http://www.iteye.com/topic/973166

        聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

        文檔

        Maven小技巧

        Maven小技巧:前言 Maven,發音是[`meivin],專家的意思。它是一個很好的項目管理工具,很早就進入了我的必備工具行列,但是這次為了把ABPM項目 完全遷移并應用maven,所以對maven進行了一些深入的學習。寫這個學習筆記的目的,一個是為了自己備忘,二則希望能夠為其他人
        推薦度:
        標簽: 小技巧 技巧 專家
        • 熱門焦點

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: 亚洲无码精品浪潮| 最新中文字幕免费视频| 国产日产亚洲系列最新| 国产天堂亚洲国产碰碰| 日韩电影免费在线| 亚洲AⅤ男人的天堂在线观看| 精品少妇人妻AV免费久久洗澡| 亚洲欧美成人一区二区三区| 韩国日本好看电影免费看| 亚洲国产精品ⅴa在线观看| 午夜影视在线免费观看| 国产精品亚洲精品日韩电影| 日韩亚洲精品福利| 老司机精品免费视频| 亚洲人成无码网站| 最近免费中文字幕mv电影| 亚洲综合久久久久久中文字幕| 亚洲免费观看网站| 亚洲精品无码永久在线观看男男| 免费看香港一级毛片| 久久精品国产亚洲AV| 国产成人亚洲精品91专区手机| 最近免费字幕中文大全| 精品国产_亚洲人成在线高清| 在线美女免费观看网站h| 亚洲AV综合色区无码二区偷拍| 午夜dj免费在线观看| 亚洲高清免费视频| 亚洲色图黄色小说| 精品国产免费一区二区| 成人免费网站久久久| 亚洲高清在线观看| 日本黄页网站免费| 免费a级毛片无码a∨免费软件 | 在线看片免费人成视频久网下载| 久久精品亚洲一区二区三区浴池 | 激情婷婷成人亚洲综合| 亚洲国产精品无码专区影院| 99在线视频免费观看视频| 日日狠狠久久偷偷色综合免费| 亚洲AV无码成人精品区天堂|