maven的作用
1.管理jar
增加第三方jar (例如我要上傳文件,commons-fileupload.jar commons-io.jar )(版本可能下錯)maven下載就不會衝突
jar包之間的依賴關係 (commons-fileupload自動關聯下載所有依賴的jar)
2.講項目拆分成若干個模塊
maven概念
基於java平臺的自動化構建工具
make-ant-maven-gradle
maven能幹的事
清理 將編譯結果進行刪除,爲重新編譯做準備
編譯 java->class
測試 單元測試 開發人員 測試人員 (針對於項目中的關鍵點進行測試,亦可用項目中的測試代碼去測試開發代碼)
報告 將測試結果進行顯示
打包 將項目中包含的多個文件 壓縮成一個文件 用於安裝 或者部署 (java項目打包成jar,web項目打包成war)
安裝 將打成的包,放到本地倉庫(現在有三個模塊(項目),一個用來寫DAO,一個是service,service依賴於dao,但是這是兩個不同的項目,所以就要把它放到本地倉庫,讓其他模塊去安裝它,供其他項目使用)
本地倉庫
中央倉庫 (私服nexus)
中央倉庫鏡像 緩解服務器壓力,不可能只有一個倉庫,分流
(本地倉庫是遠程倉庫的一個緩衝和子集,當你構建maven項目的時候,首先會從本地倉庫查找資源,如果沒有,那麼maven會從遠程倉庫下載到你本地倉庫。)
部署 將打成的包,放到服務器上準備運行(將java,js,jsp等各個文件進行篩選,組裝,變成一個可以直接運行的項目)
-eclipse中部署的web項目可以運行
-將eclipse中的項目,複製到tmocat/webapps中則不能運行
-項目可以在webapps中直接運行
-eclipse中的項目,在部署時,會生成一個對應的部署項目(在wtpwebapps中)
區別在於:部署項目,沒有源碼文件,只有編譯後的class文件
因爲二者目錄結構不一致,因此tomcat無法直接運行eclipse中複製過來的項目(因爲 如果要在tomcat中運行一個項目,則該項目要嚴格遵循tomcat目錄結構)
可以右鍵eclipse的項目export,變成war包,然後放到wtpwebapps中,不需要解壓,會自動解壓(裏面的文件結構符合tomcat)
eclipse中的項目要在tomcat裏運行,就需要部署
自動化構建工具:將原材料(java,js,css,html,圖片)->產品(可發佈項目)
編譯-打包-部署-測試 (如果沒有maven) -》自動構建(maven)
---------------------------
1.下載配置maven
配置JAVA_HOME
配置MAVEN_HOME
M2_HOME
配置path(bin目錄)
驗證
mvn -v
配置本地倉庫
默認本地倉庫(可以在maven目錄中的conf的settings.xml中查看) : ${user.home}/.m2/repository
修改本地倉庫 : <localRepository>路徑(例如D:/xxx)</localRepository>
2.使用maven
約定 優於 配置
硬編碼方式 job.setPath("d://abc");
配置方式 job conf.xml <path>d:\\abc</path>
約定:使用默認值
maven約定的目錄結構:
項目
src
main 程序功能代碼
java java代碼
resources 資源代碼,配置代碼
test 測試代碼
java
resources
pom.xml 項目對象模型
gav:
<groupId>域名翻轉+大項目名</groupId>
<artifactId>子模塊名</artifactId>
<version>版本號</version>
-----------------3 座標詳解----------------------------
<groupId>org.sonatype.nexus</groupId>
<artifactId>nexus-indexer</artifactId>
<version>2.0.0</version>
<packaging>jar</packaging>
groupId
定義當前maven項目隸屬的實際項目。
groupId的表示方式與Java包名的表示方式類似,如: <groupId>org.sonatype.nexus</groupId>
artifactId
該元素定義實際項目中的一個Maven項目(模塊),推薦的做法是使用實際項目的名稱作爲artifactId的前綴。
如:<artifactId>nexus-indexer</artifactId>
在默認情況下,maven生成的構件,其文件名會以artifactId作爲開頭,如:nexus-indexer-2.0.0.jar。
packaging【可選的,默認爲jar】:
當不定義packaging時,maven會使用默認值jar。
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate</artifactId>
<version>3.2.6.ga</version>
</dependency>
它被下載後將會被存放至
%repository%/org/hibernate/hibernate/3.2.6.ga/hibernate-3.2.6.ga.jar
其中%repository%就是你本地的repository目錄!
不知大家看出來了沒有,它是按你的Dependency的groupid + artifactid + version,然後以點號作分隔,來建立文件夾的,最後建立的文件夾如下
|--org
|--hibernate
|--hibernate
|--3.2.6.ga
|--hibernate-3.2.6.ga.jar
可能會有些人會問那個jar包的名字是怎麼來的,細心的人或許早己觀察出來了,沒錯,就是artifactId + "-" + version + ".jar"。
依賴:
一開始講過
在maven項目中,如果要使用一個當時存在的jar或模塊,則可以通過依賴實現(本地倉庫,遠程倉庫去尋找)
執行mvn:必須在pom.xml所在的目錄中執行(項目路徑)
編譯(第一次會先下載maven基礎jar包,從遠程倉庫下載後,放到本地倉庫,第二次就不用了): mvn compile --只編譯main目錄
測試(第一次會先下載測試基礎環境):mvn test
mvn package(第一次也是會下載執行該命令的基礎環境) 打成jar/war
mvn install(同) 將開發的模塊 放入本地倉庫 供其他模塊使用 (路徑在倉庫的/groupId/ artifactId/ version/下)
mvn clean(同) 清理項目裏的編譯文件的目錄(target目錄)
<dependency>
<groudId>junit</groudId>
<artifactId>junit</artifactId>
<version>4.0</version>
<scope>test</scope>
<dependency>
依賴的範圍,依賴的有效性
complie(默認) test provided
compile test provided
(編譯)主程序(main) √ × √
(測試)測試程序(test) √ √ √
部署(運行) √ × ×
compile test provided
(編譯)主程序(main) A.jar × A.jar
(測試)測試程序(test) A.jar A.jar A.jar
部署(運行) A.jar × ×
maven在編譯,測試,運行項目時,各自使用一套classpath
在eclipse中創建maven工程:
1.配置maven
windows -> preferences 輸入maven,找到installation,eclipse通常自帶,最好使用自己下載的maven,然後user Settings,在User Settings找到自己的settings.xml路徑,然後下方的localRepository會更改爲你設置的本地倉庫路徑
在eclipse中編寫完pom.xml依賴後,需要右鍵項目 maven-update project
運行:
Run As:
1 Maven build 執行上次Maven build...
2 Maven build... Goals中可以寫clean compile test package等
maven生命週期:
生命週期和構建關係;
生命週期中的順序:a b c d e
當我們執行c命令,實際執行abc
像package就是處於比較靠後的位置
package命令後,實際執行了:
resources
compile
test
package