1. 程式人生 > >Maven學習筆記(一)—— Maven基礎

Maven學習筆記(一)—— Maven基礎

一、Maven介紹

1.1 什麼是maven?

  Maven是apache下的一個純Java開發的開源專案,它是一個專案管理工具,使用maven對Java專案進行構建、依賴管理。

1.2 什麼是專案構建?

  專案構建是一個專案從編寫原始碼到編譯、測試、執行、打包、部署、執行的過程。

  • 傳統專案構建過程

  傳統使用eclipse構建專案的過程如下:

    

  構建過程如下:

    1. 在eclipse中建立一個javaweb工程
    2. 在工程中編寫原始碼及配置檔案等
    3. 對原始碼進行編譯,java檔案編譯成class檔案
    4. 執行Junit單元測試
    5. 將工程打包成war包部署至tomcat執行
  • maven專案構建過程  

  maven將專案構建的過程進行標準化,每個階段使用一個m命令完成,下圖展示了構建過程的一些階段:

  

  上圖中部分階段對應的命令如下:

清理階段:clean,清理輸出的class檔案
編譯階段:compile,將java程式碼編譯成class檔案
打包階段:package,java工程可以打成jar包,web工程可以打成war包

  執行一個maven工程(web工程)需要一個命令:tomcat:run

1.3 什麼是依賴管理

  什麼是依賴?一個java專案可能要使用一些第三方的jar包才可以執行,那麼我們說這個java專案依賴了這些第三方jar包。

  舉個例子:一個crm系統,它的架構是SSH框架,該crm專案依賴SSH框架,具體它依賴的是hibernate、spring、struts2。

  什麼是依賴管理?就是對專案所有依賴的jar包進行規範化管理

  • 傳統專案的依賴管理

  傳統的專案工程要管理所依賴的jar包完全靠人工進行,程式設計師從網上下載jar包新增到專案工程中,如下圖:程式設計師手工將hibernate、spring、struts2的jar包新增到工程中的WEB-INF/lib目錄下。

    

  手工拷貝jar包新增到工程中的問題是:

    1. 沒有對jar包的版本統一管理,容易導致版本衝突。
    2. 從網上找jar包非常不方便,有些jar包找不到。
    3. jar包新增到工程中導致工程過大。

      

  • maven專案的依賴管理

  maven專案管理所依賴的jar包不需要手動向工程新增jar包,只需要在pom.xml(maven工程的配置檔案)新增jar包的座標,自動從maven倉庫中下載jar包、執行,如下圖:

    

  使用maven依賴管理新增jar包的好處:

    1. 通過pom.xml檔案對jar包的版本進行統一管理,可避免版本衝突。
    2. maven團隊維護了一個非常全的maven倉庫,裡面包含了當前使用的jar包,maven工程可以自動從maven倉庫下載jar包,非常方便。
    3. 使用maven的專案工程非常小

      

1.4 使用maven的好處

  1. 一步構建:maven對專案構建的過程進行標準化,通過一個命令即可完成構建過程。
  2. 依賴管理:maven工程不用手動匯入jar包,通過在pom.xml中定義座標從maven倉庫自動下載,方便且不易出錯。
  3. 可以跨平臺:可在window、Linux上使用。
  4. 有利於提高大型團隊的開發效率,降低專案的維護成本,大公司都會考慮使用maven來構建專案。

二、maven的安裝

  安裝需要Java支援(JDK >= 1.7)

2.1 下載安裝

  • 下載壓縮包:

  官方下載地址:http://maven.apache.org/download.cgi

  

  • 解壓安裝:

  將下載好的壓縮包解壓到一個不含有中文和空格的目錄中。

  

  bin:mvn.bat(以run方式執行專案)、mvnDeug.bat(以debug方式執行專案)

  boot:maven執行需要類載入器

  conf:settings.xml,整個maven工具核心配置檔案

  lib:maven執行所依賴的jar包

2.2 配置環境變數

  計算機』-->『右鍵屬性』-->『高階系統設定』-->『環境變數』-->『系統變數』 

  

  將%MAVEN_HOME%\bin新增到path中:

  

  通過mvn -v命令檢查maven是否安裝成功,看到maven的版本為3.3.9及java版本為1.7即為安裝成功。

  

 2.3 maven倉庫

2.3.1 maven倉庫的作用

  maven的工作需要從倉庫下載一些jar包,如下圖所示,本地的專案A、專案B等都會通過maven軟體從遠端倉庫(可以理解為網際網路上的倉庫)下載jar包並存在本地倉庫,本地倉庫就是本地資料夾,當第二次需要此jar包時則不再從遠端倉庫下載,因為本地倉庫已經存在了,可以將本地倉庫理解為快取,有了本地倉庫就不用每次從遠端倉庫下載了。

  下圖描述了maven中倉庫的型別:

    

  • 本地倉庫:用來儲存從遠端倉庫或中央倉庫下載的外掛和jar包,專案使用的外掛或jar包,優先從本地倉庫查詢。預設本地倉庫位置在${user.dir}/.m2/reposity,${user.dir}表示Windows使用者目錄

        

  • 遠端倉庫:如果本地需要外掛或者jar包,本地倉庫沒有,預設去遠端倉庫下載。遠端倉庫可以在網際網路內也可以在區域網內。
  • 中央倉庫:在maven軟體中內建一個遠端倉庫地址http://repo1.maven.org/maven2,它是中央倉庫,服務於整個網際網路,它是由maven團隊自己維護的,裡面儲存了非常全的jar包,它包含了世界上大部分流行的開源專案構件。

2.3.2 配置本地倉庫

  將準備好的本地倉庫(repository.rar)解壓到自己的電腦上

    

  在MAVEN_HOME/conf/settings.xml檔案中配置本地倉庫位置:

    

    

三、入門程式

3.1 maven的目錄結構

  使用maven建立的工程我們稱它為maven工程,maven工程具有一定的目錄規範,如下:

    

3.2 maven的常用命令

  • compile:compile是maven工程的編譯命令,作用是將src/main/java下的檔案編譯為class檔案輸出到target目錄下

  

  檢視target目錄,class檔案已生成,編譯完成。

  

  • test:test是maven工程的測試命令,會執行src/test/java下的單元測試類

  

  • clean:執行clean會刪除target目錄的內容。
  • package:package是maven工程的打包命令,對於Java工程執行package會打包成jar包,對於web工程,會打包成war包。

    

  • install:install是maven工程的安裝命令,執行install將maven打成jar或war包釋出到本地倉庫。

四、專案構建

4.1 m2e外掛安裝配置

4.1.2 eclipse與maven

  通過入門程式中命令列的方式使用maven的工作效率不高,可以在eclipse開發工具中整合maven軟體,eclipse是一個開發工具,maven是一個專案管理工具,maven有一套專案構建的規範,在eclipse中整合maven軟體,最終通過eclipse建立maven工程。

4.1.3 安裝外掛

  1.選擇3.3.9版本的maven軟體

    

  2.修改預設的本地倉庫地址

    

    注意:如果修改了settings.xml檔案,需要點選上圖的"Update Settings"按鈕對本地倉庫重建索引,點選"Reindex"。

  3.maven配置完成需要測試在eclipse中是否可以瀏覽maven的本地倉庫,如果可以正常瀏覽maven本地倉庫,則說明eclipse整合maven已經完成。

   開啟eclipse倉庫檢視

    

  找到Local respository本地倉庫項,點選Rebuild index重建索引

  

  重建索引完成後即可檢視本地倉庫內容:

  

4.2 構建web工程

  第一步:建立一個maven工程

    

    

  第二步:定義座標

    

    

 

  第三步:設定編譯版本:檢視上邊工程的編譯版本為1.5,此教程的是jdk1.7,需要設定編譯版本為1.7,這裡需要使用maven的外掛來設定。在pom.xml中加入:

<build>
        <!-- 配置了很多外掛 -->
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.5.1</version>  
                <configuration>
                    <source>1.7</source>
                    <target>1.7</target>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>
        </plugins>
    </build>

   執行update project,檢視編譯版本為1.7:

  

  第四步:定義web.xml:在src/webapp中新增WEB-INF/web.xml檔案,可以右鍵專案自動生成

    

  第五步:新增servlet/jsp的jar包,在pom.xml中新增servlet/jsp的座標

<dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.9</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>servlet-api</artifactId>
            <version>2.5</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>jsp-api</artifactId>
            <version>2.0</version>
            <scope>provided</scope>
        </dependency>
    </dependencies>

    此時會發現jar包已新增到專案中:

  第六步:編寫servlet,在src/main/java中建立ServletTest。

public class ServletTest extends HttpServlet{
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doPost(req, resp);
    }
    
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.getRequestDispatcher("/jsp/test.jsp").forward(req, resp);
    }
}

  第七步:編寫jsp

    

  第八步:在web.xml中配置servlet

 <!-- 配置servlet -->
  <servlet>
      <servlet-name>servletTest</servlet-name>
      <servlet-class>cn.itcast.maven.ServletTest</servlet-class>
  </servlet>
  <servlet-mapping>
      <servlet-name>servletTest</servlet-name>
    <url-pattern>/test</url-pattern>      
  </servlet-mapping>

  第九步:啟動專案:右擊專案---run as –maven build ….

    

  測試:

    

五、依賴管理

5.1 新增依賴

5.1.1 dependency

  在pom.xml中新增dependency標籤:

<dependency>
   <groupId>junit</groupId>
   <artifactId>junit</artifactId>
   <version>4.9</version>
   <scope>test</scope>
</dependency>

5.1.2 查詢座標

  新增依賴需要指定依賴jar包的座標,但是很多情況下我們是不知道jar包的座標,可以通過如下方式查詢:

    

    

     

  • 方式二:使用maven外掛的索引功能

    如果在本地倉庫中有我們要的jar包,可以在pom.xml中右鍵新增依賴

    

    

5.2 依賴範圍

   A依賴B,需要在A的pom.xml檔案中新增B的座標,新增座標時需要指定依賴範圍,依賴範圍包括:

  • compile:編譯範圍,指A在編譯時依賴B,此範圍為預設依賴範圍。編譯範圍的依賴會用在編譯、測試、執行,由於執行時需要,所以編譯範圍的依賴會被打包。
  • provided:provided依賴只有在當JDK或者一個容器已提供該依賴之後才使用,provided依賴在編譯和測試時需要,在執行時不需要(防止和tomcat下的jar包衝突),比如:servlet api被tomcat容器提供。
  • runtime:runtime依賴在執行和測試系統的時候需要,但在編譯的時候不需要。比如jdbc的驅動包,由於執行時需要,所以runtime範圍的依賴會被打包。
  • test:test範圍依賴在編譯和執行的時候都不需要,它們只有在測試編譯和測試執行階段可用。比如:junit,由於執行時不需要,所以test範圍的依賴不會被打包
  • system:system範圍依賴與provided類似,但是你必須顯示的提供一個對於本地系統中JAR檔案的路徑,需要指定systemPath磁碟路徑,system依賴不推薦使用。

    

    依賴範圍由強到弱的順序是:compile>provided>runtime>test