1. 程式人生 > >專案管理工具maven

專案管理工具maven

                                   專案管理工具

                                     maven

1.1maven是什麼

       maven翻譯為“專家”,“內行”。Maven是Apache下的一個純java開發的開源專案,它是一個專案管理工具,使用maven對java專案進行構建、依賴管理。當前使用Maven的專案在持續增長。

1.2什麼是專案構建

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

1.2.1傳統專案構建過程

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

1)在eclipse中建立一個java web工程

2)在工程中編寫原始碼及配置檔案等

3)對原始碼進行編譯,java檔案編譯成class檔案

4)執行Junit單元測試

  1. 將工程打成war包部署至tomcat執行

1.2.2maven專案構建過程

       maven將專案構建的過程進行標準化,每個階段使用一個命令完成,下圖展示了構建過程的一些階段,後面章節詳細介紹每個階段,這裡先大概瞭解下:

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

清理階段對應maven的命令是clean,清理輸出的class檔案

編譯階段對應maven的命令是compile,將java程式碼編譯成class檔案。

打包階段對應maven的命令是package,java工程可以打成jar包,web工程可以打成war包。

maven工程構建的優點:

  1. 一個命令完成構建、執行,方便快捷。
  2. maven對每個構建階段進行規範,非常有利於大型團隊協作開發。

1.3什麼是依賴管理

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

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

1.3.1傳統專案的依賴管理

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

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

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

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

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

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

1.4使用maven的好處

通過上邊介紹傳統專案和maven專案在專案構建及依賴管理方面的區域,maven有如下的好處:

1、一步構建,maven對專案構建的過程進行標準化,通過一個命令即可完成構建過程。

2、依賴管理,maven工程不用手動導jar包,通過在pom.xml中定義座標從maven倉庫自動下載,方便且不易出錯。

3、maven的跨平臺,可在window、linux上使用。

4、maven遵循規範開發有利於提高大型團隊的開發效率,降低專案的維護成本,大公司都會考慮使用maven來構建專案。

  1. maven安裝

2.1下載安裝

將下載好的maven解壓到一個不含有中文和空格的目錄中,解壓後的maven包含以下的檔案目錄。

bin目錄 mvn.bat (以run方式執行專案)、 mvnDebug.bat(以debug方式執行專案 )

boot目錄 maven執行需要類載入器

conf目錄 settings.xml 整個maven工具核心配置檔案

lib目錄 maven執行依賴jar包

2.2環境變數配置

電腦上需安裝java環境,安裝JDK1.7 + 版本  (將JAVA_HOME/bin 配置環境變數path )首先需要配置 MAVEN_HOME。

接下來將 %MAVEN_HOME%/bin 加入環境變數 path 。

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

2.3 maven倉庫

2.3.1 maven倉庫的作用

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

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

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

遠端倉庫:如果本地需要外掛或者jar包,本地倉庫沒有,預設去遠端倉庫下載。遠端倉庫可以在網際網路(例如:中央倉庫,其他映象)內也可以在區域網內(私服)。

中央倉庫:在maven軟體中內建一個預設使用的遠端倉庫,倉庫地址的為http://repo1.maven.org/maven2,它是中央倉庫,服務於整個網際網路,它是由Maven團隊自己維護,裡面儲存了非常全的jar包,它包含了世界上大部分流行的開源專案構件。

2.3.2 配置本地倉庫

本課程是在無網的狀態下學習,需要配置老師提供的本地倉庫,將 “repository.rar”解壓至自己的電腦上,本教程解壓在F:\develop\maven\repository

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

2.3.3 全域性setting與使用者setting

       maven倉庫地址、私服等配置資訊需要在setting.xml檔案中配置,分為全域性配置和使用者配置。在maven安裝目錄下的有 conf/setting.xml檔案,此setting.xml檔案用於maven的所有project專案,它作為maven的全域性配置。

       如需要個性配置則需要在使用者配置中設定,使用者配置的setting.xml檔案預設的位置在:${user.dir} /.m2/settings.xml目錄中,${user.dir} 指windows 中的使用者目錄。maven會先找使用者配置,如果找到則以使用者配置檔案為準,否則使用全域性配置檔案。

  1. 專案構建
    1. 指定maven安裝目錄

我們使用的Eclipse已經集成了Maven的外掛,因此只要在Eclipse中指定本地maven的安裝目錄即可。

       找到maven的配置,新增本地的maven。

3.2指定使用者setting配置檔案

在eclipse中配置使用的maven的setting.xml檔案,使用使用者自己的setting.xml檔案。

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

3.3 maven座標

         每個maven工程都需要定義本工程的座標,座標是maven對jar包的身份定義。

groupId:專案名稱,定義為組織名+專案名,類似包名

artifactId:模組名稱

version:當前專案版本號,snapshot為快照版本即非正式版本,release為正式釋出版本

packaging:打包型別

jar:執行package會打成jar包

war:執行package會打成war包

pom :用於maven工程的繼承,通常父工程設定為pom

3.4構建web工程

3.4.1需求

建立一個web工程,實現入門程式的功能。

1)新增index.jsp,輸出hello world

2)新增一個servlet轉發到jsp頁面。

3.4.2第一步建立maven工程

選擇建立Maven Project。

接下來是否使用骨架建立maven工程。這裡我們不適用maven的骨架,自己手動建立工程,建立簡單工程可以跳過骨架的選擇。

當然我們也可以瞭解一下maven的骨架:

當我們不跳過骨架點選“next”會進入骨架選擇頁面,如果eclipse中配置本地倉庫正確則顯示出骨架:

3.4.2第二步定義座標

       建立的工程結構如下:

3.4.3第三步設定編譯版本

檢視上邊工程的編譯版本為1.5,本教程使用jdk1.8,需要設定編譯版本為1.8,這裡需要使用maven的外掛來設定,在pom.xml中加入:

<build>

                   <plugins>

                            <plugin>

                                     <groupId>org.apache.maven.plugins</groupId>

                                     <artifactId>maven-compiler-plugin</artifactId>

                                     <configuration>

                                               <source>1.8</source>

                                               <target>1.8</target>

                                               <encoding>UTF-8</encoding>

                                     </configuration>

                            </plugin>

                   </plugins>

         </build>

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

3.4.4第四步定義web.xml

       在src/webapp中新增WEB-INF/web.xml檔案,內容為:

<?xml version="1.0" encoding="UTF-8"?>

<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

    xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"

    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"

    id="WebApp_ID" version="2.5">

    <welcome-file-list>

        <welcome-file>index.html</welcome-file>

        <welcome-file>index.htm</welcome-file>

        <welcome-file>index.jsp</welcome-file>

        <welcome-file>default.html</welcome-file>

        <welcome-file>default.htm</welcome-file>

        <welcome-file>default.jsp</welcome-file>

    </welcome-file-list>

</web-app>

3.4.5第五步編寫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);

    }

}

3.4.6第六步編寫JSP

         在webapp下編寫index.jsp,同時建立一個jsp目錄,並在其中建立test.jsp頁面。

       test.jsp的內容如下:

<%@ page language="java" contentType="text/html; charset=utf-8"

    pageEncoding="utf-8"%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=utf-8">

<title>第一個Maven工程</title>

</head>

<body>

這是一個測試Servlet

</body>

</html>

index.jsp的內容如下:

<%@ page language="java" contentType="text/html; charset=utf-8"

    pageEncoding="utf-8"%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=utf-8">

<title>第一個Maven工程</title>

</head>

<body>

Hello world!

</body>

</html>

3.4.7第七步新增servlet/jsp的jar包

此時的工程中servlet和jsp報錯,是因為缺少servlet和jsp依賴的jar包,我們需要新增這樣的依賴。在maven工程中新增jar的方式是需要在pom.xml中新增servlet/jsp的座標,maven自動從建立下載servlet/jsp的jar包。

編輯pom.xml,如下:

<!-- 新增servlet-apijsp-api -->

    <dependencies>

        <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>

3.4.8第八步配置servlet

在web.xml中配置servlet,如下所示:

    <!-- 配置servlet -->

    <servlet>

        <servlet-name>servletTest</servlet-name>

        <servlet-class>com.igeek.servlets.ServletTest</servlet-class>

    </servlet>

    <servlet-mapping>

        <servlet-name>servletTest</servlet-name>

        <url-pattern>/test</url-pattern>

    </servlet-mapping>

3.4.9執行

3.4.9.1使用tomcat伺服器來發布

         Maven的web工程可以和之前的動態web工程一樣,使用Tomcat伺服器來發布和執行,這樣我們需要首先新增一個Tomcat伺服器。

       然後將我們的工程新增到Tomcat伺服器中。

       啟動Tomcat伺服器之後就可以訪問我們的頁面了。

       訪問test頁面。

3.4.9.1使用Maven的伺服器外掛來發布

       我們也可以使用maven的Tomcat外掛來發布工程,我們需要首先新增該外掛。可以通過配置plugin修改tomcat的訪問路徑及埠。

       在pom.xml中新增如下配置:

<!-- maven內建 tomcat7外掛 -->

<build>

    <plugins>

       <plugin>

           <groupId>org.apache.tomcat.maven</groupId>

           <artifactId>tomcat7-maven-plugin</artifactId>

           <version>2.2</version>

           <configuration>

              <!-- 可以靈活配置工程路徑 -->

              <path>/maven01</path>

              <!-- 可以靈活配置埠號 -->

              <port>8089</port>

           </configuration>

       </plugin>

    </plugins>

    </build>

       在啟動tomcat外掛釋出工程前,需要首先對工程進行編譯和打包,我們使用命令package。

       接下來就可以啟動服務了,我們使用tomcat:run命令。

       伺服器啟動完成,接下來就可以訪問頁面了。

       訪問test.jsp頁面。

  1. Maven專案結構

4.1Java專案的專案結構

src   (原始碼目錄)

  |--main  (主目錄,最終會被打包到專案部署檔案中)

                   |--java  (java源程式)

                   |--resource  (預設放置所有配置檔案)

  |--test  (測試目錄,最終不會被打包到專案的部署檔案中)

                   |--java  (測試源程式)

                   |--resource  (測試使用的配置檔案)

4.2WEB專案的目錄結構

除過和java工程相同的目錄以外還會多一個wenapp的目錄,這個目錄就是web工程的根目錄。

  1. Maven的命令和週期

4.1Maven的常用命令

       Maven的常用命令包含以下幾個,我們需要熟練使用。

4.1.1 compile

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

4.1.2 test

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

4.1.3 clean

       clean是maven工程的清理命令,執行 clean會刪除target目錄的內容。

4.1.4 package

       package是maven工程的打包命令,對於java工程執行package打成jar包,對於web工程打成war包。

4.1.5 install

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

4.2Maven的生命週期

4.2.1三套生命週期

    maven對專案構建過程分為三套相互獨立的生命週期,請注意這裡說的是“三套”,而且“相互獨立”,這三套生命週期分別是:

  1. Clean Lifecycle 在進行真正的構建之前進行一些清理工作。
  2. Default Lifecycle 構建的核心部分,編譯,測試,打包,部署等等。
  3. Site Lifecycle 生成專案報告,站點,釋出站點。

4.2.2生命週期的階段

每個生命週期都有很多階段,每個階段對應一個執行命令。

4.2.2.1如下是clean生命週期的階段

  1. pre-clean 執行一些需要在clean之前完成的工作
  2. clean 移除所有上一次構建生成的檔案
  3. post-clean 執行一些需要在clean之後立刻完成的工作

4.2.2.2如下是default週期的內容:

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     將最終的包複製到遠端的倉庫,以讓其它開發人員與專案共享。

4.2.2.3如下是site生命週期的階段

pre-site 執行一些需要在生成站點文件之前完成的工作

site 生成專案的站點文件

post-site 執行一些需要在生成站點文件之後完成的工作,並且為部署做準備

site-deploy 將生成的站點文件部署到特定的伺服器上

4.2.3命令與生命週期的階段

   每個maven命令對應生命週期的某個階段,例如:mvn clean 命令對應clean生命週期的clean階段, mvn test 命令對應default生命週期的test階段。

   執行命令會將該命令在的在生命週期當中之前的階段自動執行,比如:執行mvn clean 命令會自動執行pre-clean和clean兩個階段,mvn test命令會自動執行validate、compile、test等階段。執行某個生命週期的某個階段不會影響其它的生命週期!

       如果要同時執行多個生命週期的階段可在命令列輸入多個命令,中間以空格隔開,例如:

clean package 該命令執行clean生命週期的clean階段和default生命週期的package階段。

  1. 依賴管理

座標  定位專案在倉庫中所在的位置的。

在同一組織ID下的工程:通過artifactId區分。

統一工程的不同版本號表現形式:

5.1新增依賴

      1. dependency

在pom.xml中新增dependency標籤,如下:

<dependency>

    <groupId><groupId>

    <artifactId></artifactId>

    <version></version>

</dependency>

如果要新增Junit4.9的依賴在web工程的pom.xml中新增dependency

    <dependencies>

        <!-- 新增junit4.9依賴 -->

        <dependency>

            <groupId>junit</groupId>

            <artifactId>junit</artifactId>

            <version>4.9</version>

        </dependency>

    </dependencies>

5.1.2查詢座標

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

  1. 方法一:從網際網路搜尋

                        http://search.maven.org/

                        http://mvnrepository.com/

網站搜尋示例:

  1. 方法二:使用maven外掛的索引功能

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

5.2依賴範圍

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

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

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

  1. maven工程執行除錯

6.1端口占用處理

重新執行tomcat:run命令重啟工程,重啟之前需手動停止 tomcat,否則