maven學習筆記

1、mvc架構

MVC是一種設計模式(Design pattern),也就是一種解決問題的方法和思路, 是上世紀80年代提出的,到現在已經頗有歷史了。 MVC的意義在於指導開發者將數據與表現解耦,提高代碼,特別是模型部分代碼的複用性。MVC是模型(Model)、視圖(View)、控制器(Controller)3個單詞的縮寫。

具體參看:

http://www.noobyard.com/article/p-xlovyoiz-ey.html

 

2、目前的技術在開發中存在的問題(why )

  1: 一個項目就是一個工程

        如果項目非常大,就不適合繼續 使用package來劃分 模塊,最好一個模塊對應一個工程,利於分工協作。

       藉助於MAVEN就可以就一個項目拆分成多個工程。

  2:項目中需要的JAR包必須手動複製,粘貼,到WEB-INF/lib目錄下

      帶來的問題:同樣的JAR包文件重複出現在不同的項目中,一方面浪費存儲空間,另外也讓工程比較臃腫。

      藉助Maven,可以將jar包僅僅保存在「倉庫」中,有需要使用工程「引用」這個文件接口,並不需要真的把JAR包複製過來

  3:JAR包需要別人替我們準備好,或者到官網下載

       不同技術的官司網提供的JAR包下載的形式五花八門  有些技術的官司網就是通過Maven或SVN等專門的工具來下載

        如果是以不規範的方式下載的JAR包,那麼其中的內容很可能也是不規範的。 藉助於Maven可以以一種規範的方式下載JAR包,因爲所有知名框架或者第三方工具的JAR包以及按照統一的規範存放在了Maven的中央倉庫中, 以規範的方式下載的JAR包,內容也是可靠的

         Tips:"統一規範" 不僅是對IP開發領域非常重要,對於整個人類社會都是非常重要的。

 

  4:一個jar包依賴的其他JAR包

   FileUpload組件 依賴於IO組件,commons-fileupload-1.3.jar依賴於commons-io-2.0.1.jar

   如何 所有jar包之間的依賴關係都需要程序員自己非常清楚的瞭解,那麼就會極大的增加學習成功

    Maven會自動將被依賴的JAR包導入進來。

 

3、Maven是什麼(what)

    1 Maven是一款服務於Javag平臺的自動化構建工具

          make-->Ant -->Maven -->Gradle

    2 概念:以JAVA源文件,框架配置文件,JSP,HTML圖片等爲源材料去「生產」一個可以運行的項目的過程

        編譯,部署,搭建

    3 編譯:Java源文件(User.java)-->編譯-->Class字節碼文件,交給JVM執行

    4:部署:一個BS項目最終運行的並不是並態Web工程本身,而是這個動態Web工程「編譯的結果」

            開發過程中,所有的路徑或者配置文件中配置的類路徑等都是以編譯結果的目錄結構爲標準的。   

          Tips:運行時環境:是一組JAR包的引用,並沒有把JAR包本身複製到工程中,所以並不是目錄

     構建過程中的各個環節

     【1】清理:將以前編譯得到的舊的class字節碼文件刪除,爲下一次編譯做準備

     【2】編譯:將JAVA源程序編譯成class字節碼文件

     【3】測試:自動測試,自動junit程序

     【4】報告:測試程序執行的結果

     【5】打包:動態WEB工程打WAR包,JAVA工程打JAR包

     【6】安裝:Maven特定的概念--將打包得到的文件複製到「倉庫」中的指定位置

     【7】部署:將動太WEB工程生成的WAR包複製 到Servlet容器的指定目錄下,使其可以運行

4、自動化購建。

    1:檢查%JAVA_HOME%環境變量

         echo %java_home%

    2:解壓Maven核心程序的壓縮包,放在一個非中文無空格的路徑下

    3:配置Maven相關的環境變量

      【1】MAVEN_HOME或者M2_HOME

      【2】PATH

    4:執行mvn -v命令查看。

 

5、Maven的核心概念

   1:約定的目錄結構 

   2:POM

   3:座標 

   4: 依賴

   5:倉庫           

   6:生命週期/插件/目標 

   7: 繼承 

    8:聚合 

6、第一個Maven工程

      1: 創建約定的目錄結構。

       [1]【根目錄】:工程名

        [2]【src】:源碼

        [3]【pom.xml】Maven工程的核心配置文件

        [4]【main】存入主程序

        [5]【test】存放測試程序

        [6] [java] :存放JAVA源文件

        [7] [resources]:存放框架或其它工具配置文件

    2:爲什麼要遵守約定的目錄結構

         【1】Maven要負責我們這個項目的自動化構建,以編譯爲例,Maven要想自動進行編譯,那麼它必須知道java源文件保存在哪裏。

         【2】如果我們自己自定義的東西想要讓框架或工具知道

                a:以配置的形式告訴框架

                b: 遵守框架內部已經存在的約定

           約定>配置>編碼,

7、常用Maven命令

    1:注意:執行與構建過程相關的Maven命令,必須進入pom.xml所在的目錄

    2:常命令

       [1]mvn clean:清理

       [2]mvn compile:編譯

       [3]mvn  test-compile:編譯測試程序

       [4]mvn test:執行測試

       [5]mvn package:打包

        [6]  mvn install:安裝

         [7]mvn site:生成站點

 

8、 關於聯網的問題

   1:Maven的核心程序中僅僅定義了抽象的生命週期,但是具體的工作必須由特定的插件來完成。而插件本身並不包含在Maven核心程序中

   2:當我們執行的Maven偏偏需要到某些插件時,Maven核心程序會首先到本地倉庫中查找

   3:本地倉庫的默認位置,系統中當前用戶的家目錄(C:\Users\登陸用戶名)\.m2\repository

   4:Maven核心程序如果在本地倉庫中找不到需要的插件,那麼它會自動連接外網,到中央倉庫下載。

    5:如果此時無法連接外網,則構建失敗

    6:修改默認本地倉庫的位置,可以讓Maven核心程序到我們事行準備好的目錄下查找插件

        1:找到Maven解壓目錄\conf\settings.xml

        2:  在settings.xml文件中找到localRepository標籤

        3:將<localRepository>/poth/to/local/rep<localRepository>從註釋中取出

       4:將標籤內容修改爲已經準備好的maven倉庫目錄

 

9、POM

    1:含義:project Object Model 項目對象模型 

    2:pom.xml對於maven工程是核心配置文件,與構建過程相關的一切設置都在這個文件中進行配置,重要程度相當於web.xml對於動術web工程。

 

10、座標

   1:數據中的座標:

       【1】在平面上,使用x,y兩個向量可以唯一的定位平面中的任何一個點

        【2】在空間中,使用x,y,z三個向量可以唯一定位空間中的任何一個點

      2:Maven的座標

          使用下面三個向量在倉庫中唯一定位一個Maven工程

           【1】groupid:公司或者組織域名倒序+項目名

            <groupid>com.atguigu.maven</groupid>

           【2】artifactied:模塊名

            <artifactied>Hello</artifactid>

            【3】version:t版本

<version>1.0.0</version>

gav 座標

     3:Maven工程的座標與倉庫中的路徑的對應關係

 

11、倉庫:

     1:倉庫的分類 

       【1】:本地倉庫:當前電腦上部署的倉庫目錄,爲當前電腦上所有Maven工程服務

        【2】:遠程

               a私服:搭建在局域網環境下,爲當前局域網範圍內的所有Maven工程服務

               b:中央倉庫:架設在Internet上,爲全世界所有Maven工程服務

               c:中央倉庫鏡像:爲了分擔中央倉庫的流量,提升用戶俯衝速度。

2:倉庫中保存存的內容:Maven工程

   【1】Maven自身所需要的插件

    【2】第三方框架或工具的jar包

    【3】我們自己開發的Maven工程。

     

12、依賴

   1:Maven解析依賴住處時會到本地倉庫中查找被依賴的jar包。

        對於我們自己開發的Maven工程,使用Mvn install命令安裝後可以進入倉庫

   2:依賴的範圍

      【1】compile:

          對主程序是否有效:有效

          對測試程序是否有效:有效

          是否參於打包:參與

       【2】test範圍的依賴

           對主程序是否有效:無效

           對測試程序是否有效:有效

           是否參與打包:不參與

          典型的例子就是junit.jar

        【3】provided範圍依賴

          對主程序是否有效:有效

          對測試程序是否有效:有效

          是否參與打包:不參與

        典型的例子就是servlet-api.jar

 

 

13、生命週期

      1:各個構建環節執行的順序:不能打亂順序,必須按照既定順序來執行

      2:Maven的核心程序定義了抽象的生命 週期,生命週期中的各個階段是的具體任務是由插件來完成的,有三套生命週期

      3:maven核心程序爲了更好的實現自動化構建按照這一的特點執行生命週期中的各個階段:不論現在要執行生命週期中的哪一個階段,都是從生命週期中的哪一個階段,都是從這個生命週期中最開始的位置執行。

     4:插件和目標

           【1】生命週期的各個階段僅僅定義了要執行的任務是什麼

          【2】各個階段和插件的目標是對應的

          【3】相信的目標由特定的插件來完成

          【4】:可以將目標看作「調用插件功能的命令」

 

14、在Eclipse中使用Maven

    1:Maven插件:Eclipse設置

    2:Maven插件的設置

             【1】installations:手寫Maven核心程序的位置,不建議使用插件自帶的Maven程序,而應該使用我們自己解壓的那個。

             【2】user settings:指定conf/settings.xml的位置,進而獲取本地倉庫的位置

      3:基本操作

          [1]:創建 Maven版的Java工程

         【2】:創建 Maven版的web工程

        【3】:執行Maven命令

15、依賴[高級]

     1:依賴的傳遞性、

        【1】好處:可以傳遞的依賴不必在每個模塊工程中都重複聲明 ,在」最下面「的工程中依賴一次即可

        【2】注意:非compile範圍的依賴不能傳遞,所以在各個工程模塊中,如果有需要就得重複聲明 依賴

     2:依賴的排除

         【1】:需要設置依賴排除的場合

       【2】依賴排除的設置方式

      【3】依賴的原則

    3:依賴原則

               【1】作用:解決模塊工程之間的jar包衝突問題

              【2】情景設定1:驗證路徑最短者優先原則

              【3】情景設定2:驗證路徑相同時先聲明者優先 ,  先聲明指的是dependency標籤的聲明 順序

    【4】統一管理依賴的版本

             1:情景舉例

           這裏對spring 各個jar包的依賴版本都是4.0.0

           如果統一升級爲4.1.1,怎麼辦?手動逐一修改不可靠

                 2:建議配置方式

                    i.使用properties標籤內使用自定義標籤統一聲明 版本

                    ii.在需要統一版本的位置,使用${自定義標籤}統一聲明版本號

             【3】   其實properties標籤配合自定義標籤聲明數據的配置並不是只能用於聲明依賴的版本號,凡是需要統一聲明 再引用的場合都可以使用。

16 繼承:

      1:現狀:

                Hello依賴的junit 4.0

                HelloFriend依賴的junit4.0

               MakeFriends依賴的junit:4.9

              由於test範圍內依賴不能傳遞,所以必然會分散在各個模塊工程中,很容易造成版本不一致。

      2:需求:統一管理各個模塊工程中對junit依賴的版本。

      3:解決思路:將junit依賴統一提取到」父「工程中,在子工程中聲明 junit依賴時不指定版本,以父工程中統一設定的爲準。同時也便於修改。

      4:操作步驟:

          【1】創建一個Maven工程作爲父工程。注意:打包的方式爲pom

             [2] 在子工程中聲明 對父工程的引用

           【3】將子工程的座標中與父工程座標中重複的內容刪除

            【4】在父工程中統一管理junit的依賴

            【5】注意:配置繼承後,執行安裝命令時要先安裝父工程。

17、聚合

    1:作用:一鍵安裝各個模塊工程

    2:配置方式,在一個」總的聚合工程「中配置各個參與聚合的模塊

    3:使用方式,在聚合工程的pom.xml上右鍵->run as -->maven install

18:cargo是一種專門從事啓動Servlet容器的

cargo的網址:https://codehaus-cargo.github.io/cargo/Home.html

    1:配置內容

<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.0http://maven.apache.org/xsd/maven-4.0.0.xsd">

  <modelVersion>4.0.0</modelVersion>

  <groupId>com.practice.test</groupId>

  <artifactId>JavaProject02</artifactId>

  <version>0.0.1-SNAPSHOT</version>

  <packaging>war</packaging>

  <dependencies>

   <dependency>

              <groupId>javax.servlet</groupId>

              <artifactId>servlet-api</artifactId>

              <version>2.5</version>

              <scope>provided</scope>

       </dependency>

              <dependency>

                     <groupId>javax.servlet.jsp</groupId>

                     <artifactId>jsp-api</artifactId>

                     <version>2.1.3-b06</version>

                     <scope>provided</scope>

              </dependency>

                     <dependency>

                           <groupId>log4j</groupId>

                           <artifactId>log4j</artifactId>

                           <version>1.2.14</version>

                     </dependency>

  </dependencies>

 

  <build>

       <finalName>AtguiguWeb</finalName>

       <plugins>

              <plugin>

                  <!-- cargo是一種專門從事啓動Servlet容器的 -->

                     <groupId>org.codehaus.cargo</groupId>

                     <artifactId>cargo-maven2-plugin</artifactId>

                     <version>1.4.12</version>

                     <!-- 針對插件進行配置 -->

                     <configuration>

                           <container>

                                  <containerId>tomcat7x</containerId>

                                  <home>E:\tomcat\apache-tomcat-7.0.65\apache-tomcat-7.0.65</home>

                           </container>

                           

                           

                           <configuration>

                                  <type>existing</type>

                                   <home>E:\tomcat\apache-tomcat-7.0.65\apache-tomcat-7.0.65</home>

                                  <!--

                                  <properties>

                                         <cargo.servlet.port>8989</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>

</project>

 

  2:deploy報錯

Failed to execute goal org.codehaus.cargo:cargo-maven2-plugin:1.2.3:run (default-cli) on project Maven_WebTest: Execution default-cli of goal org.codehaus.cargo:cargo-maven2-plugin:1.2.3:run failed: C

解決辦法:修改一下版本號

 <groupId>org.codehaus.cargo</groupId>

     <artifactId>cargo-maven2-plugin</artifactId>

     <version>1.4.12</version> <!--原本是使用1.2.3-->

 

19:maven插件地址

http://mvnrepository.com