一、都是一樣的代碼,爲何在個人機器上能夠編譯執行,而在他的機器上就不行?html
二、爲何在個人機器上能夠正常打包,而配置管理員卻打不出來?java
三、項目組加入了新的人員,我要給他說明編譯環境如何設置,可是讓我撓頭的是,有些細節我也記不清楚了。android
四、個人項目依賴一些jar包,我應該把他們放哪裏?放源碼庫裏?web
五、這是我開發的第二個項目,仍是須要上面的那些jar包,再把它們複製到我當前項目的svn庫裏吧spring
六、如今是第三次,再複製一次吧 ----- 這樣真的好嗎?數據庫
七、我寫了一個數據庫相關的通用類,而且推薦給了其餘項目組,如今已經有五個項目組在使用它了,今天我發現了一個bug,並修正了它,我會把jar包經過郵件發給其餘項目組apache
-----這不是一個好的分發機制,太多的環節可能致使出現bugapi
八、項目進入測試階段,天天都要向測試服務器部署一版。每次都手動部署,太麻煩了。tomcat
svn:版本控制工具服務器
Maven是基於項目對象模型(POM),能夠經過一小段描述信息來管理項目的構建,報告和文檔的軟件項目管理工具。
Maven是跨平臺的項目管理工具。主要服務於基於Java平臺的項目構建,依賴管理和項目信息管理。
gradle
Maven主要有兩個功能:
一、項目構建(打包(jar,war),部署)
二、依賴管理(作好配置,自定下載依賴)
實施
運維(客服)
測試
開發組
一、Eclipse
手工操做較多,項目的構建過程都是獨立的,很難一步完成。好比:編譯、測試、部署等。
開發時每一個人的IDE配置都不一樣,很容易出現本地代碼換個地方編譯就出錯
二、Ant
Ant只是一個項目構建工具,它沒有集成依賴管理。
Ant在進行項目構建時,它沒有對項目目錄結構進行約定,須要手動指定源文件、類文件等目錄地址。同時它執行task時,須要顯示指定依賴的task,這樣會形成大量的代碼重複。
三、Maven
Maven不只是一個項目構建工具,更是一個項目管理工具。它在項目構建工程中,比ant更全面,更靈活。
Maven在進行項目構建時,它對項目目錄結構擁有約定,知道你的源代碼在哪裏,類文件應該放到哪裏去。
它擁有生命週期的概念,maven的生命週期是有順序的,在執行後面的生命週期的任務時,不須要顯示的配置前面任務的生命週期。例如執行 mvn install 就能夠自動執行編譯,測試,打包等構建過程
四、gradle android
Pom.xml maven的核心配置文件
Central:中央倉庫
私服
本地
plug:插件 jdk編譯插件 tomcat插件
本課程使用的maven的版本爲3.5
Maven是使用java開發,須要安裝jdk1.6以上,推薦使用1.7
第一步:安裝jdk,要求1.6或以上版本。
第二步:把maven解壓縮,解壓目錄最好不要有中文。
第三步:配置環境變量MAVEN_HOME
第四步:配置環境變量PATH,將%MAVEN_HOME%\bin加入Path中,在Windows中必定要注意要用分號;與其餘值隔開。
第五步:驗證是否安裝成功,打開cmd窗口,輸入mvn –v
Maven有兩個settings.xml配置文件,一個是全局配置文件,一個是用戶配置文件。
%MAVEN_HOME%/conf/settings.xml 是maven全局的配置文件。
該配置文件中配置了本地倉庫(依賴)的路徑,默認就是:~/.m2/repository。其中~表示當前用戶路徑C:\Users\[UserName]。
localRepository:用戶倉庫,用於檢索依賴包路徑
~/.m2/settings.xml是用戶的配置文件(默認沒有該文件,須要將全局配置文件拷貝過來在進行修改)
注意:通常本地倉庫的地址不使用默認配置,一般狀況下須要在用戶配置中,配置新的倉庫地址。
配置步驟以下:
第一步:建立一個本地倉庫目錄,好比E:// repository/maven。
/USERS/.m2/repository
第二步:複製maven的全局配置文件(.settings)到~/.m2目錄下,即建立用戶配置文件
第三步:修改maven的用戶配置文件。
注意:
用戶級別的倉庫在全局配置中一旦設置,全局配置將再也不生效,轉用用戶所設置的倉庫,不然使用全局配置文件中的默認路徑倉庫(全局:maven/conf/settings.xml 用戶:用戶:~/.m2/settings.xml )
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項目核心配置文件
target目錄會在編譯以後自動建立。
在src/main/java/com/qf/maven目錄下新建文件Hello.java
package com.qf.maven;
public class HelloWorld { public String sayHello(String name){ return "Hello World :" + name + "!"; } } |
package com.qf.maven;
import org.junit.Test; import static junit.framework.Assert.*;
public class TestHelloWorld{
@Test public void testSayHello(){ HelloWorld hw = new HelloWorld(); String result = hw.sayHello("zhangsan"); assertEquals("hello zhangsan",result); } } |
<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工程即建立成功。
須要在pom.xml所在目錄中執行如下命令。
執行 mvn compile命令,完成編譯操做
執行完畢後,會生成target目錄,該目錄中存放了編譯後的字節碼文件。
執行 mvn clean命令
執行完畢後,會將target目錄刪除。
執行 mvn test命令,完成單元測試操做
執行完畢後,會在target目錄中生成三個文件夾:surefire、surefire-reports(測試報告)、test-classes(測試的字節碼文件)
執行 mvn package命令,完成打包操做
執行完畢後,會在target目錄中生成一個文件,該文件多是jar、war
執行 mvn install命令,完成將打好的jar包安裝到本地倉庫的操做
執行完畢後,會在本地倉庫中出現安裝後的jar包,方便其餘工程引用
cmd 中錄入 mvn clean compile命令
組合指令,先執行clean,再執行compile,一般應用於上線前執行,清除測試類
cmd 中錄入 mvn clean test命令
組合指令,先執行clean,再執行test,一般應用於測試環節
cmd 中錄入 mvn clean package命令
組合指令,先執行clean,再執行package,將項目打包,一般應用於發佈前
執行過程:
清理————清空環境
編譯————編譯源碼
測試————測試源碼
打包————將編譯的非測試類打包
cmd 中錄入 mvn clean install 查看倉庫,當前項目被髮布到倉庫中
組合指令,先執行clean,再執行install,將項目打包,一般應用於發佈前
執行過程:
清理————清空環境
編譯————編譯源碼
測試————測試源碼
打包————將編譯的非測試類打包
部署————將打好的包發佈到資源倉庫中
widows –》首選項:maven
第一步:選擇new→maven→Maven Project
第二步:next
第三步:next
選擇maven的工程骨架,這裏咱們選擇quickstart。
第四步:next
輸入GroupId、ArtifactId、Version、Package信息點擊finish完成。
在src/main/java中建立com.qf.maven包,而後建立MavenFirst.java
在src/test/java中建立com.qf.maven包,而後建立TestMavenFirst.java
在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命令。
maven build的功能就是執行上次自定義命令。
經過選擇骨架建立maven工程,每次選擇骨架時都須要聯網下載,若是網絡不通或者較慢的狀況下會有很長時間的等待。使用非常不方便,因此建立工程時能夠不選擇骨架直接建立工程。
第一步:選擇new→maven→Maven Project
第二步:next
第三步:next
Packaging:指定打包方式,默認爲jar。選項有:jar、war、pom。
第四步:點擊finish,完成maven工程建立。
在Maven-second工程中依賴使用maven-first工程的代碼
在平面幾何中座標(x,y)能夠標識平面中惟一的一點。在maven中座標就是爲了定位一個惟一肯定的jar包。
Maven世界擁有大量構建,咱們須要找一個用來惟一標識一個構建的統一規範
擁有了統一規範,就能夠把查找工做交給機器
groupId:定義當前Maven組織名稱
artifactId:定義實際項目名稱
version:定義當前項目的當前版本
惟一的表示一個項目
就是對項目中jar 包的管理。能夠在pom文件中定義jar包的GAV座標,管理依賴。
依賴聲明主要包含以下元素:
<dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.9</version> <scope>test</scope> </dependency> </dependencies> |
其中依賴範圍scope 用來控制依賴和編譯,測試,運行的classpath的關係. 主要的是三種依賴關係以下:
1.compile: 默認編譯依賴範圍。對於編譯,測試,運行三種classpath都有效
2.test:測試依賴範圍。只對於測試classpath有效
3.provided:已提供依賴範圍。對於編譯,測試的classpath都有效,但對於運行無效。由於由容器已經提供,例如servlet-api
4.runtime:運行時提供。例如:jdbc驅動
<scope>runtime</scope>
若是B中使用A,C中使用B,則稱B是C的直接依賴,而稱A是C的間接依賴。
C->B B->A
C直接依賴B
C間接依賴A
左邊第一列表示第一直接依賴範圍 aàb
上面第一行表示第二直接依賴範圍 b-->c
中間的交叉單元格表示傳遞性依賴範圍。
總結:
一、Maven-first工程中依賴log4j-1.2.8版本
那麼maven-third中依賴的就是log4j-1.2.8
二、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版本生效。
<optional> true/false 是否可選,也能夠理解爲是否向下傳遞。
在依賴中添加optional選項決定此依賴是否向下傳遞,
若是是true則不傳遞,若是是false就傳遞,默認爲false。
ThirdMaven SecondMaven FirstMaven
<exclusions <exclusion> <groupId>com.qf.maven</groupId> <artifactId>maven-first</artifactId> </exclusion> </exclusions> |
排除依賴包中所包含的依賴關係,不須要添加版本號。
若是在本次依賴中有一些多餘的jar包也被傳遞依賴過來,若是想把這些jar包排除的話能夠配置exclusions進行排除。
Maven生命週期就是爲了對全部的構建過程進行抽象和統一。
包括項目清理、初始化、編譯、打包、測試、部署等幾乎全部構建步驟。
生命週期能夠理解爲構建工程的步驟。
在Maven中有三套相互獨立的生命週期,請注意這裏說的是「三套」,並且「相互獨立」,這三套生命週期分別是:
Clean Lifecycle: 在進行真正的構建以前進行一些清理工做。
Default Lifecycle: 構建的核心部分,編譯,測試,打包,部署等等。
Site Lifecycle: 生成項目報告,站點,發佈站點。 ProjectManager
再次強調一下它們是相互獨立的,你能夠僅僅調用clean來清理工做目錄,僅僅調用site來生成站點。固然你也能夠直接運行 mvn clean install site 運行全部這三套生命週期。
每套生命週期都由一組階段(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生命週期是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的生命週期與插件目標相互綁定,以完成某個具體的構建任務。
例如compile就是插件maven-compiler-plugin的一個插件目標
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>1.7</source> <target>1.7</target> <encoding>UTF-8</encoding> </configuration> </plugin>
|
Maven-tomcat插件:
<build> <finalName>HelloMaven4_web</finalName> <!-- 插件 --> <plugins> <plugin> <groupId>org.apache.tomcat.maven</groupId> <artifactId>tomcat7-maven-plugin</artifactId> <version>2.2 </version> <configuration> <url>http://localhost:8080/HelloMaven4_web</url> <server>tomcat</server> </configuration> </plugin> </plugins> </build> |
修改配置文件後,在工程上點擊右鍵選擇maven→update project configration
第一步:不選用骨架
第二步:將打包方式選擇爲war
第三步:點擊finish,工程建立成功。
第四步:在工程中添加web.xml
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> |
第五步:在webapp下建立index.jsp
注意:建立了一個web工程,可是沒有生成web.xml 啓動時,就會報錯,你要手動添加嗎? 使用eclipse的同窗都知道右鍵 選擇JavaEE Tools來建立web.xml那麼idea呢?
第一步:點擊file,選擇projectStructure
第二步:選擇facets,選擇web-》web項目名 點擊+web.xml