maven

一、不用maven自動化構建工具,項目所存在問題
(1)一個項目就是一個工程
        若是項目很是大,就不適合用package來劃分模塊。最好是一個模塊對應一個工程,利於分工。
        藉助Maven,就能夠將一個項目拆分紅多個工程
(2)項目中所須要的jar包必須手動複製粘貼到WEB-INF/lib目錄下
        帶來的問題是一樣的jar包文件重複出如今不一樣的項目工程中,一方面浪費存儲空間,另外也讓項目比較            臃腫
        藉助Maven,能夠將jar包僅僅保存在倉庫中,有須要的項目「引用」這個文件接口,並不須要真的將jar
        包複製過來
(3)jar包須要別人爲咱們準本好,或者到官網下載
        藉助maven能夠以一種規範的方式下載jar包,由於全部知名框架或第三方jar包以一種規範的方式放在了
        maven的中央倉庫中
(4)一個jar包依賴的其餘jar包須要本身手動加入到項目中
        jar包之間的依賴關係都須要程序員本身瞭解清楚,那麼極大的增長學習成本。
        藉助maven,maven會自動的將jar包倒入進來
 
二、maven是什麼
        (1)maven是一款服務於 java平臺的的自動化構建工具
         發展歷程:make—>Ant—>Maven—>gradle
         <1>構建:
            【1】概念:以「java原文件」、「jsp」、「HTML」、「圖片」等資源爲原材料,去「生產」一                個 能夠運行的項目的過程
                ·編譯
                ·部署
                ·搭建
            【2】編譯:java原文件——>編譯——>class字節碼文件——>JVM執行
            【3】部署:一個bs項目最終運行的並非動態web項目自己而是這個動態web項目"編譯的結果"
        <2>構建過程當中的各個環節
            【1】清理:將之前編譯獲得的舊的class字節碼文件刪除,爲下一次編譯作準備
            【2】編譯:java源文件—>class字節碼文件
            【3】測試:自動測試,自動調用junit程序
            【4】報告:測試程序執行的結果
            【5】打包:動態web工程打war包,java工程打jar包
            【6】安裝:maven特定的概念,將打包獲得的文件複製到「倉庫」中的指定位置
            【7】部署:將動態web工程生成的war包複製到servlet容器的指定目錄下,使其能夠運行
        <3>自動化構建
三、maven的下載安裝
(1)在apache-maven-3.2.2\conf\settings.xml文件中修改默認的本地倉庫的位置
<localRepository>D:\maven\RepMaven</localRepository>
 
(2)在apache-maven-3.2.2\conf\settings.xml文件中修改創建maven工程時,默認的jdk版本
  <profiles>   
   <profile>
        <id>jdk-1.7</id>
        
        <activation>
            <activeByDefault>true</activeByDefault>
            <jdk>1.7</jdk>
        </activation>
        
        <properties>
            < maven.compiler.source>1.7</ maven.compiler.source>
            < maven.compiler.target>1.7</ maven.compiler.target>
        </properties>
    </profile>
    
  </profiles>
 
 
 
 
四、maven的核心概念
(1)約定的目錄
(2)POM
(3)座標
(4)依賴
(5)倉庫
(6)生命週期/插件/目標
(7)繼承
(8)聚合
五、第一個maven工程
 
(1)建立約定的目錄結構
    | 根目錄:工程名
    |---|---|src目錄:源碼
    |---|---|---|main目錄:存放主程序
    |---|---|---|---|java:存放java源文件
    |---|---|---|---|resources:存放框架或其餘的配置文件
    |---|---|---|test目錄:存放測試程序
    |---|---|---|---|java:存放java源文件
    |---|---|---|---|resources:存放框架或其餘的配置文件
    |---|---|pom.xml:Maven的核心配置文件
六、經常使用的Maven命令
    (1)、注意:執行與構建過程相關的Maven命令,必須進入pom.xml所在的目錄
            與構建過程相關:編譯,測試,打包,部署
    (2)、經常使用的命令:
            【1】mvn clear:清理
            【2】mvn compile:編譯主程序
            【3】mvn test-compile:編譯測試程序
            【4】mvn test:執行測試
            【5】mvn package:打包
            【6】mvn install :安裝
            【7】mvn site:生成站點
   (3)關於聯網的問題
            【1】maven的核心程序中僅僅定義了抽象的生命週期,可是具體的工做必須有特定的插件完成,
                插件自己不包含在Maven的核心程序中。
            【2】當咱們執行Maven的命令須要用到某些插件時,Maven首先會到本地倉庫中查找
            【3】本地倉庫的默認位置:c:\users\[登陸當前系統的用戶名]\.m2\repository
            【4】Maven核心程序若是在本地找不到須要的插件,那麼會自動鏈接外網,到中央倉庫下載
            【5】若是此時沒法鏈接外網,則構建失敗
            【6】修改默認的本地倉庫位置:
                找到Maven的解壓目錄\conf\settings.xml
                在settings.xml文件中找到localRepository
                將標籤體內的內容修改成已經準備好的Maven倉庫目錄
七、項目對象模型
    (1)POM含義:Project  Object  Model項目對象模型
    (2)pom.xml對於maven是核心配置文件,與構建過程相關的一切設置都在這個文件中進行配置。
            重要程度至關於web工程的web.xml
八、座標
    (1)數學中的座標
            【1】在平面上,使用x、y兩個向量惟必定位平面中任何一個點
            【2】在空間上,使用x、y、z三個向量惟必定位空間中任何一個點
    (2)Maven的座標
                使用下面三個向量在倉庫中定位一個項目
            【1】groupid:公司或組織域名倒敘+項目名
                    <groupid>com.wl.naruto</groupid>
            【2】artifactid:模塊的名稱
                    <artifactid>maven</artifactid>
            【3】version:版本
                    <version>1.1.1</version>
    (3)Maven工程的座標與倉庫中路徑對應的關係 
 
  <groupId>aopalliance</groupId>
  <artifactId>aopalliance</artifactId>
  <name>AOP alliance</name>
  <version>1.0</version>
aopalliance\aopalliance\1.0\aopalliance-1.0.jar
九、倉庫
倉庫的分類:
(1)、本地倉庫:本地電腦上部署的倉庫目錄,爲當前電腦上的 全部Maven項目服務
(2)、遠程倉庫
        【1】、私服: 搭建在局域網環境中,爲局域網範圍內的Maven項目服務
        【2】、中央倉庫:架設在Internet上,爲全部的Maven工程服務
        【3】、中央倉庫的鏡像:爲了分擔中央倉庫的流量,提高用戶的訪問速度
倉庫中包含的內容:
(1)、Maven自身所須要的插件
(2)、第三方框架或工具所須要的jar包
(3)、咱們本身所開發的Maven工程
 
十、依賴
(1)、Maven解析依賴信息時會到本地倉庫中查找被依賴的jar包。
        對於咱們本身開發的Maven項目,使用Maven install 命令安裝後就能夠進入Maven倉庫
(2)依賴的範圍
        【1】compile:
                對主程序是否有效:有效
                對測試程序是否有效:有效
                是否參與打包:參與
                是否參與部署:參與
        【2】test:
                對主程序是否有效:無效
                對測試程序是否有效:有效
                是否參與打包:不參與
                是否參與部署:不參與
                典型的例子:junit
        【3】provided:
                對主程序是否有效:有效
                對測試程序是否有效:有效
                是否參與打包:不參與
                是否參與部署:不參與
                典型的例子:servlet-api.jar
 
十一、生命週期
    (1)各個構建環節的這行順序:不能打亂順序,不需按照既定的正確順序執行
    (2)Maven的核心程序中定義了抽象的生命週期,生命週期中各個階段的具體任務室友插件來完成的
    (3) Maven 有三套相互獨立的生命週期, 分別是:
            【1】Clean Lifecycle 在進行真正的構建以前進行一些清理工做。
            【2】Default Lifecycle 構建的核心部分,編譯,測試,打包,安裝,部署等等。
            【3】Site Lifecycle 生成項目報告,站點,發佈站點
 
              它們是相互獨立的,你能夠僅僅調用 clean 來清理工做目錄,僅僅調用 site 來生成站點。 固然你也能夠直接運行 mvn clean install site 運行全部這三套生命週期 , 每套生命週期都由一組階段(Phase)組成,咱們平時在命令行輸入的命令總會對應於一個特定的階段。好比,運行 mvn clean,這個 clean 是 Clean 生命週期的一個階段。有 Clean 生命週期,也有 clean 階段
    (4)、 Clean 生命週期
            Clean 生命週期一共包含了三個階段:
            【1】pre-clean 執行一些須要在 clean 以前完成的工做
            【2】clean 移除全部上一次構建生成的文件
            【3】post-clean 執行一些須要在 clean 以後馬上完成的工
    (5)、 Site 生命週期
            ①pre-site 執行一些須要在生成站點文檔以前完成的工做
            ②site 生成項目的站點文檔
            ③post-site 執行一些須要在生成站點文檔以後完成的工做,而且爲部署作準備
            ④site-deploy 將生成的站點文檔部署到特定的服務器上
 
            這裏常常用到的是 site 階段和 site-deploy 階段,用以生成和發佈 Maven 站點,這但是 Maven 至關強大的功能
     (6)、 Default 生命週期
            Default 生命週期是 Maven 生命週期中最重要的一個,絕大部分工做都發生在這個生命週期中。這裏,只解釋一些比較重要和經常使用的階段:
            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 將最終的包複製到遠程的倉庫,以讓其它開發人員與項目共享或部署到服務器上運行
    (7)、 生命週期與自動化構建
             運行任何一個階段的時候,它前面的全部階段都會被運行, 例如咱們運行 mvn install 的時候,代碼會被編譯,測試,打包。 這就是 Maven 爲何可以自動執行構建過程的各個環節的緣由。此外, Maven 的插件機制是徹底依賴 Maven 的生命週期的,所以理解生命週期相當重要
      (8) 插件和目標
            【1】Maven 的核心僅僅定義了抽象的生命週期,具體的任務都是交由插件完成的。
            【2】每一個插件都能實現多個功能,每一個功能就是一個插件目標。
            【3】Maven 的生命週期與插件目標相互綁定,以完成某個具體的構建任務。
例如: compile 就是插件 maven-compiler-plugin 的一個目標; pre-clean 是插件 maven-clean-plugin 的一個目
 
十二、依賴【高級】
    
   (1)、依賴的傳遞性
        【1】好處:能夠傳遞的依賴沒必要再每一個模塊工程中都重複聲明,只須要在最下面的工程中依賴一次
        【2】注意:非compile範圍內的依賴不能傳遞,因此在各個工程模塊中,若是須要就得重複聲明 
 
    (2)、依賴的排除
        【1】依賴排除的設置方式
 
<!-- 依賴的排除 -->
         <exclusions>
             <exclusion>
                 <groupId>commons-logging</groupId>
                 <artifactId>commons-logging</artifactId>
             </exclusion>
         </exclusions>
(3)、依賴的原則(內部機制)--解決模塊工程之間jar包衝突
        【1】、路徑最短者優先
 
 
 
 
        【2】、先聲明者 優先
 
(4)統一管理依賴的版本號
    【1】在<properties>內自定義標籤名,內容爲版本號
 
 <properties>
      <com.naruto.spring.version>4.0.0.RELEASE</com.naruto.spring.version>
  </properties>
    【2】 引用前面聲明的版本號
 
<dependencies>
   <dependency>
      <groupId>org.springframework</groupId>
      <artifactid>spring-core<artifactid>
     <version>${com.naruto.spring.version}</version>
   </dependency>
</dependencies>
 
 
13.繼承
    (1)爲何須要繼承機制?
        因爲非 compile 範圍的依賴信息是不能在「依賴鏈」中傳遞的, 因此有須要的工程只能單獨配置。
    (2)開發步驟
            【1】 在父工程中管理依賴( 建立父工程和建立通常的 Java 工程操做一致,惟一須要注意的是: 打包方式處要設置爲 pom)
 
<!-- 統一配置依賴的管理-->
  <dependencyManagement>
    <dependencies>
         <dependency>
             <groupId>junit</groupId>
             <artifactId>junit</artifactId>
             <version>4.9</version>
             <scope>test</scope>
         </dependency>
    </dependencies>
  </dependencyManagement>
 
            【2】 在子工程中引用父工程
 
 <!-- 子工程聲明父工程 -->
  <parent>
    <groupId>com.naruto.maven</groupId>
    <artifactId>Parent</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <!-- 以當前文件爲基準 的父工程 的的pom.xml的相對路徑 -->
    <relativePath>../Parent/pom.xml</relativePath>
  </parent>
            【3】 在子項目中從新指定須要的依賴,刪除範圍和版本號
 
<dependency>
   <groupId>junit</groupId>
   <artifactId>junit</artifactId>
   <scope>test</scope>
</dependency>
1七、聚合
    (1)做用:一鍵安裝各個模塊工程
    (2)配置方式:在一個總的聚合工程中配置參與聚合的各個模塊
 
<!-- 配置聚合 -->
  <modules>
    <!-- 指定各個子工程的相對路徑 -->
    <module>../Hello</module>
    <module>../HelloFriend</module>
    <module>../MakeFriend</module>
  </modules>
1八、web工程的部署
    
 
    <!-- 配置構建工程中須要使用的插件 -->
    <build>
         <!-- 部署項目時的名稱 -->
         <finalName>NarutoWeb</finalName>
         <plugins>
             <plugin>
                 <!-- cargo是一家專門從事啓動servlet容器的組織 -->
                 <groupId>org.codehaus.cargo</groupId>
                 <artifactId>cargo-maven2-plugin</artifactId>
                 <version>1.2.3</version>
                 <!-- 針對插件作的配置 -->
                 <configuration>
                      <!-- 配置當前系統中容器的位置 -->
                      <container>
                          <containerId>tomcat7x</containerId>
                          <home>D:\Tomcat\apache-tomcat-7.0.82</home>
                      </container>
                      <configuration>
                          <type>existing</type>
                          <home>D:\Tomcat\apache-tomcat-7.0.82</home>
                          <!-- 若是Tomcat端口爲默認值8080則沒必要設置該屬性 -->
                          <!-- <properties>
                              <cargo.servlet.port>8080</cargo.servlet.port>
                          </properties> -->
                      </configuration>
                 </configuration>
                 <!-- 配置插件在什麼狀況下執行 -->
                 <executions> 
                      <execution> 
                          <id>cargo-run</id>
                          <!-- 生命週期的階段 -->
                          <phase>install</phase> 
                          <goals>
                               <!-- 插件的目標 --> 
                               <goal>run</goal> 
                          </goals> 
                      </execution> 
                 </executions>
             </plugin>
         </plugins>
    </build>
相關文章
相關標籤/搜索