專案管理工具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單元測試
- 將工程打成war包部署至tomcat執行
1.2.2maven專案構建過程
maven將專案構建的過程進行標準化,每個階段使用一個命令完成,下圖展示了構建過程的一些階段,後面章節詳細介紹每個階段,這裡先大概瞭解下:
上圖中部分階段對應命令如下:
清理階段對應maven的命令是clean,清理輸出的class檔案
編譯階段對應maven的命令是compile,將java程式碼編譯成class檔案。
打包階段對應maven的命令是package,java工程可以打成jar包,web工程可以打成war包。
maven工程構建的優點:
- 一個命令完成構建、執行,方便快捷。
- maven對每個構建階段進行規範,非常有利於大型團隊協作開發。
1.3什麼是依賴管理
什麼是依賴?一個java專案可能要使用一些第三方的jar包才可以執行,那麼我們說這個java專案依賴了這些第三方的jar包。
什麼是依賴管理?就是對專案所有依賴的jar包進行規範化管理。
1.3.1傳統專案的依賴管理
傳統的專案工程要管理所依賴的jar包完全靠人工進行,程式設計師從網上下載jar包新增到專案工程中,如下圖:程式設計師手工將jar新增到工程中的WEB-INF/lib目錄下。
手工拷貝jar包新增到工程中的問題是:
- 沒有對jar包的版本統一管理,容易導致版本衝突。
- 從網上找jar包非常不方便,有些jar找不到。
- jar包新增到工程中導致工程過大。
-
- maven專案的依賴管理
-
maven專案管理所依賴的jar包不需要手動向工程新增jar包,只需要在pom.xml(maven工程的配置檔案)新增jar包的座標,自動從maven倉庫中下載jar包、執行。
使用maven依賴管理新增jar的好處:
- 通過pom.xml檔案對jar包的版本進行統一管理,可避免版本衝突。
- 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來構建專案。
- 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會先找使用者配置,如果找到則以使用者配置檔案為準,否則使用全域性配置檔案。
- 專案構建
- 指定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-api,jsp-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頁面。
- Maven專案結構
4.1Java專案的專案結構
src (原始碼目錄)
|--main (主目錄,最終會被打包到專案部署檔案中)
|--java (java源程式)
|--resource (預設放置所有配置檔案)
|--test (測試目錄,最終不會被打包到專案的部署檔案中)
|--java (測試源程式)
|--resource (測試使用的配置檔案)
4.2WEB專案的目錄結構
除過和java工程相同的目錄以外還會多一個wenapp的目錄,這個目錄就是web工程的根目錄。
-
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對專案構建過程分為三套相互獨立的生命週期,請注意這裡說的是“三套”,而且“相互獨立”,這三套生命週期分別是:
- Clean Lifecycle 在進行真正的構建之前進行一些清理工作。
- Default Lifecycle 構建的核心部分,編譯,測試,打包,部署等等。
- Site Lifecycle 生成專案報告,站點,釋出站點。
4.2.2生命週期的階段
每個生命週期都有很多階段,每個階段對應一個執行命令。
4.2.2.1如下是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階段。
-
依賴管理
座標 定位專案在倉庫中所在的位置的。
在同一組織ID下的工程:通過artifactId區分。
統一工程的不同版本號表現形式:
5.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包的的座標,可以通過如下方式查詢:
- 方法一:從網際網路搜尋
http://search.maven.org/
http://mvnrepository.com/
網站搜尋示例:
- 方法二:使用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
- maven工程執行除錯
6.1端口占用處理
重新執行tomcat:run命令重啟工程,重啟之前需手動停止 tomcat,否則