目錄
一、項目開發中遇到的問題
1、都是同樣的代碼,爲什麼在我的機器上可以編譯執行,而在他的機器上就不行?
2、爲什麼在我的機器上可以正常打包,而配置管理員卻打不出來?
3、項目組加入了新的人員,我要給他說明編譯環境如何設置,但是讓我撓頭的是,有些細節我也記不清楚了。
4、我的項目依賴一些jar包,我應該把他們放哪裏?放源碼庫裏?
5、這是我開發的第二個項目,還是需要上面的那些jar包,再把它們複製到我當前項目的svn庫裏吧
6、現在是第三次,再複製一次吧 ----- 這樣真的好嗎?
7、我寫了一個數據庫相關的通用類,並且推薦給了其他項目組,現在已經有五個項目組在使用它了,今天我發現了一個 bug,並修正了它,我會把jar包通過郵件發給其他項目組
-----這不是一個好的分發機制,太多的環節可能導致出現bug
8、項目進入測試階段,每天都要向測試服務器部署一版。每次都手動部署,太麻煩了。
maven就可以解決以上的各種問題
二、Maven 簡介
Maven是基於項目對象模型(POM),可以通過一小段描述信息來管理項目的構建,報告和文檔的軟件項目管理工具。
Maven是跨平臺的項目管理工具。主要服務於基於Java平臺的項目構建,依賴管理和項目信息管理。
Maven主要有兩個功能:
- 項目構建(打包(jar,war),部署)
- 依賴管理(做好配置,自定下載依賴)
三、Maven的安裝
1、Maven的安裝
第一步:安裝jdk,要求1.6或以上版本。
第二步:把maven解壓縮,解壓目錄最好不要有中文。
第三步:配置環境變量MAVEN_HOME
第四步:配置環境變量PATH,將%MAVEN_HOME%\bin加入Path中,在Windows中一定要注意要用分號;與其他值隔開。
第五步:驗證是否安裝成功,打開cmd窗口,輸入mvn–v
2、Maven的配置
Maven有兩個settings.xml配置文件,一個是全局配置文件,一個是用戶配置文件。
3、全局配置(默認)
%MAVEN_HOME%/conf/settings.xml是maven全局的配置文件。
該配置文件中配置了本地倉庫(依賴)的路徑,默認就是:~/.m2/repository。其中~表示當前用戶路徑C:\Users\[UserName]。
localRepository:用戶倉庫,用於檢索依賴包路徑
4、用戶配置(如果這裏設置不了的話,可以在全局配置中設置)
~/.m2/settings.xml是用戶的配置文件(默認沒有該文件,需要將全局配置文件拷貝過來在進行修改)
注意:一般本地倉庫的地址不使用默認配置,通常情況下需要在用戶配置中,配置新的倉庫地址。
配置步驟如下:
第一步:創建一個本地倉庫目錄,比如E://repository/maven。
第二步:複製maven的全局配置文件(.settings)到~/.m2目錄下,即創建用戶配置文件
第三步:修改maven的用戶配置文件。
注意:
用戶級別的倉庫在全局配置中一旦設置,全局配置將不再生效,轉用用戶所設置的倉庫,否則使用全局配置文件中的默認路徑倉庫(全局:maven/conf/settings.xml用戶:用戶:~/.m2/settings.xml)
四、創建Maven 工程
Project
| -src
| |-main
| |-java ——存放項目的.java文件
| |-resources ——存放項目資源文件,如spring, hibernate配置文件
| |-webapp———存放jsp,html,web.xml等網頁文件WebContent
| |-test測試代碼
| |-java ——存放所有測試.java文件,如JUnit測試類
| |-resources ——測試資源文件
| -target ——目標文件輸出位置例如.class、.jar、.war文件
| -pom.xml ——maven項目核心配置文件
五、Maven的工程創建
- 第一步:根據maven的目錄結構創建HelloMaven工程(target目錄會在編譯之後自動創建)
- 第二步:創建HelloWorld.java 在src/main/java/com/tf/maven目錄下新建文件Hello.java
package com.tf.maven;
public class HelloWorld { public String sayHello(String name){ return "Hello World :" + name + "!"; } } |
- 第三步:創建TestHelloWorld.java
package com.tf.maven;
import org.junit.Test; import static junit.framework.Assert.*;
public class TestHelloWorld{
@Test public void testSayHello(){ HelloWorldhw = new HelloWorld(); String result = hw.sayHello("zhangsan"); assertEquals("hello zhangsan",result); } } |
- 第四步:配置pom.xml
<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.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <!--版本:4.0.0 --> <modelVersion>4.0.0</modelVersion> <!--組織名稱:暫時使用組織名稱+項目名稱作爲組織名稱 --> <!--組織名稱:實際名稱按照訪問路徑規範設置,通常以功能作爲名稱:eg: junit spring --> <groupId>com.qf.maven</groupId> <!--項目名稱 --> <artifactId>HelloWorld</artifactId> <!--當前項目版本號:同一個項目開發過程中可以發佈多個版本,此處標示0.0.1版 --> <!--當前項目版本號:每個工程發佈後可以發佈多個版本,依賴時調取不同的版本,使用不同的版本號 --> <version>0.0.1</version> <!--名稱:可省略 --> <name>Hello</name>
<!--依賴關係 --> <dependencies> <!--依賴設置 --> <dependency> <!--依賴組織名稱 --> <groupId>junit</groupId> <!--依賴項目名稱 --> <artifactId>junit</artifactId> <!--依賴版本名稱 --> <version>4.9</version> <!--依賴範圍:test包下依賴該設置 --> <scope>test</scope> </dependency>
</dependencies> </project>
|
到此maven工程即創建成功。
六、Maven的命令
需要在pom.xml所在目錄中執行以下命令。(cmd中執行命令)
1、Mvn compile
- 執行mvn compile命令,完成編譯操作
- 執行完畢後,會生成target目錄,該目錄中存放了編譯後的字節碼文件。
2、Mvn clean
- 執行完畢後,會將target目錄刪除。
3、Mvn test
- 執行mvn test命令,完成單元測試操作
- 執行完畢後,會在target目錄中生成三個文件夾:surefire、surefire-reports(測試報告)、test-classes(測試的字節碼文件)
4、Mvn package
- 執行mvnpackage命令,完成打包操作
- 執行完畢後,會在target目錄中生成一個文件,該文件可能是jar、war
5、Mvn install
- 執行mvn install命令,完成將打好的jar包安裝到本地倉庫的操作
- 執行完畢後,會在本地倉庫中出現安裝後的jar包,方便其他工程引用
6、mvn clean compile命令
- 組合指令,先執行clean,再執行compile,通常應用於上線前執行,清除測試類
7、mvn clean test命令
- 組合指令,先執行clean,再執行test,通常應用於測試環節
8、mvn clean package命令
- 組合指令,先執行clean,再執行package,將項目打包,通常應用於發佈前
- 執行過程:
- 清理————清空環境
- 編譯————編譯源碼
- 測試————測試源碼
- 打包————將編譯的非測試類打包
9、mvn clean install命令
- cmd中錄入mvn clean install 查看倉庫,當前項目被髮布到倉庫中
- 組合指令,先執行clean,再執行install,將項目打包,通常應用於發佈前
- 執行過程:
- 清理————清空環境
- 編譯————編譯源碼
- 測試————測試源碼
- 打包————將編譯的非測試類打包
- 部署————將打好的包發佈到資源倉庫中
七、使用eclipse創建maven工程配置倉庫地址
1、widows –》首選項:maven
2、
八、通過骨架創建maven工程
1、創建工程
- 第一步:選擇new→maven→Maven Project
- 第二步:next
- 第三步:next 選擇maven的工程骨架,這裏我們選擇quickstart。
- 第四步:next 輸入GroupId、ArtifactId、Version、Package信息點擊finish完成。
- 在src/main/java中創建com.tf.maven包,然後創建MavenFirst.java
- 在src/test/java中創建com.tf.maven包,然後創建TestMavenFirst.java
- 執行maven命令進行測試
- 在Eclipse的maven插件中執行maven命令,需要在maven工程或者pom.xml文件上點擊右鍵,選擇Run as→maven build..
可以在菜單中看到maven常用的命令已經以菜單的形式出現。
例如:
Maven clean
Maven install
Maven package
Maven test
- Maven build和maven build...並不是maven的命令。
- maven build...只是提供一個命令輸入功能,可以在此功能中輸入自定義的maven命令。如test、run....
-
maven build的功能就是執行上次自定義命令。
九、不通過骨架創建maven工程
通過選擇骨架創建maven工程,每次選擇骨架時都需要聯網下載,如果網絡不通或者較慢的情況下會有很長時間的等待。使用很是不方便,所以創建工程時可以不選擇骨架直接創建工程。
創建工程
- 第一步:選擇new→maven→Maven Project
- 第二步:next
- 第三步:next
Packaging:指定打包方式,默認爲jar。選項有:jar、war、pom。
- 第四步:點擊finish,完成maven工程創建。
- 第五步:修改pom文件 在Maven-second工程中依賴使用maven-first工程的代碼
十、Maven座標主要組成
- 什麼是座標?
在平面幾何中座標(x,y)可以標識平面中唯一的一點。在maven中座標就是爲了定位一個唯一確定的jar包。
Maven世界擁有大量構建,我們需要找一個用來唯一標識一個構建的統一規範
擁有了統一規範,就可以把查找工作交給機器
- groupId:定義當前Maven組織名稱
- artifactId:定義實際項目名稱
- version:定義當前項目的當前版本
- 這三個可以唯一的表示一個項目
1、依賴管理
就是對項目中jar 包的管理。可以在pom文件中定義jar包的GAV座標,管理依賴。
依賴聲明主要包含如下元素:
<dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.9</version> <scope>test</scope> </dependency> </dependencies> |
2、依賴範圍 <scope>runtime</scope>
其中依賴範圍scope 用來控制依賴和編譯,測試,運行的classpath的關係. 主要的是三種依賴關係如下:
1.compile:默認編譯依賴範圍。對於編譯,測試,運行三種classpath都有效
2.test:測試依賴範圍。只對於測試classpath有效
3.provided:已提供依賴範圍。對於編譯,測試的classpath都有效,但對於運行無效。因爲由容器已經提供,例如servlet-api
4.runtime:運行時提供。例如:jdbc驅動
3、直接依賴和間接依賴
如果B中使用A,C中使用B,則稱B是C的直接依賴,而稱A是C的間接依賴。
C->B B->A
C直接依賴B
C間接依賴A
3、依賴範圍對傳遞依賴的影響
左邊第一列表示第一直接依賴範圍 aàb
上面第一行表示第二直接依賴範圍b-->c
中間的交叉單元格表示傳遞性依賴範圍。
總結:
- 當第二依賴的範圍是compile的時候,傳遞性依賴的範圍與第一直接依賴的範圍一致。
- 當第二直接依賴的範圍是test的時候,依賴不會得以傳遞。
- 當第二依賴的範圍是provided的時候,只傳遞第一直接依賴範圍也爲provided的依賴,且傳遞性依賴的範圍同樣爲 provided;
- 當第二直接依賴的範圍是runtime的時候,傳遞性依賴的範圍與第一直接依賴的範圍一致,但compile例外,此時傳遞的依賴範圍爲runtime;
4、依賴衝突
-
如果直接與間接依賴中包含有同一個座標不同版本的資源依賴,以直接依賴的版本爲準(就近原則)
-
a<---bjunit 3.9
- b<--junit 4.1
1、Maven-first工程中依賴log4j-1.2.8版本
那麼maven-third中依賴的就是log4j-1.2.8
2、maven-second工程中依賴log4j-1.2.9版本
那麼maven-third中依賴的就是log4j-1.2.9,因爲它直接依賴的maven-second項目中依賴的就是1.2.9版本
- 如果直接依賴中包含有同一個座標不同版本的資源依賴,以配置順序下方的版本爲準(就近原則)
Maven-second中依賴log4j-1.2.9和log4j-1.2.14
此時log4j-1.2.14版本生效。
5、可選依賴
- <optional> true/false 是否可選,也可以理解爲是否向下傳遞。
- 在依賴中添加optional選項決定此依賴是否向下傳遞,
- 如果是true則不傳遞,如果是false就傳遞,默認爲false。
6、排除依賴
ThirdMavenSecondMavenFirstMaven
<exclusions <exclusion> <groupId>com.tf.maven</groupId> <artifactId>maven-first</artifactId> </exclusion> </exclusions> |
排除依賴包中所包含的依賴關係,不需要添加版本號。
如果在本次依賴中有一些多餘的jar包也被傳遞依賴過來,如果想把這些jar包排除的話可以配置exclusions進行排除。
十一、Maven三大生命週期
clean:清理項目
每套生命週期都由一組階段(Phase)組成,我們平時在命令行輸入的命令總會對應於一個特定的階段。比如,運行mvn clean ,這個的clean是Clean生命週期的一個階段。有Clean生命週期,也有clean階段。Clean生命週期一共包含了三個階段:
pre-clean 執行一些需要在clean之前完成的工作
clean 移除所有上一次構建生成的文件
post-clean 執行一些需要在clean之後立刻完成的工作
mvn clean 中的clean就是上面的clean,在一個生命週期中,運行某個階段的時候,它之前的所有階段都會被運行,也就是說,mvn clean 等同於mvn pre-clean clean ,如果我們運行mvn post-clean ,那麼 pre-clean,clean 都會被運行。這是Maven很重要的一個規則,可以大大簡化命令行的輸入。
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 將最終的包複製到遠程的倉庫,以讓其它開發人員與項目共享。
運行任何一個階段的時候,它前面的所有階段都會被運行,這也就是爲什麼我們運行mvn install 的時候,代碼會被編譯,測試,打包。此外,Maven的插件機制是完全依賴Maven的生命週期的,因此理解生命週期至關重要。
site:生成項目站點
pre-site 執行一些需要在生成站點文檔之前完成的工作
site 生成項目的站點文檔
post-site 執行一些需要在生成站點文檔之後完成的工作,並且爲部署做準備
site-deploy 將生成的站點文檔部署到特定的服務器上
這裏經常用到的是site階段和site-deploy階段,用以生成和發佈Maven站點,這可是Maven相當強大的功能,Manager比較喜歡,文檔及統計數據自動生成,很好看。
十二、Maven插件
Maven的核心僅僅定義了抽象的生命週期,具體的任務都是交由插件完成的。每個插件都能實現一個功能,每個功能就是一個插件目標。Maven的生命週期與插件目標相互綁定,以完成某個具體的構建任務。
例如compile就是插件maven-compiler-plugin的一個插件目標
- Maven編譯插件 (jre默認的是1.5,添加完插件後,工程右鍵-->Maven->update project--->Force update....打對勾 )
<build> |
Maven-tomcat插件: Maven build.. --->輸入tomacat7:run運行
<!--插件 --> <bulid> <plugins> <plugin> <groupId>org.apache.tomcat.maven</groupId> <artifactId>tomcat7-maven-plugin</artifactId> <version>2.2</version> <configuration> </plugin> </plugins> </build> |
修改配置文件後,在工程上點擊右鍵選擇maven→update project configration
十三、Tomcat插件創建一個maven web工程
- 第一步:不選用骨架
- 第二步:將打包方式選擇爲war
- 第三步:點擊finish,工程創建成功。
- 第四步:在工程中添加web.xml
Web.xml內容如下:
<?xmlversion="1.0"encoding="UTF-8"?> <web-appxmlns: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> |
- 第五步:在webapp下創建index.jsp
出錯:因爲項目缺少servlet api 和jsp的依賴
<dependency> </dependency> |
十四、修改Maven工程1.5的JRE