小饒學程式設計之JAVA EE第三部分——專案管理工具:4Maven
一、開發中遇到的問題
1、都是同樣的程式碼,為什麼在我的機器上可以編譯執行,而在他的機器上就不行?
2、為什麼在我的機器上可以正常打包,而配置管理員卻打不出來?
3、專案組加入了新的人員,我要給他說明編譯環境如何設定,但是讓我撓頭的是,有些細節我也記不清楚了。
4、我的專案依賴一些jar包,我應該把他們放哪裡?放原始碼庫裡?
5、這是我開發的第二個專案,還是需要上面的那些jar包,再把它們複製到我當前專案的svn庫裡吧
6、現在是第三次,再複製一次吧 ----- 這樣真的好嗎?
7、我寫了一個資料庫相關的通用類,並且推薦給了其他專案組,現在已經有五個專案組在使用它了,今天我發現了一個bug,並修正了它,我會把jar包通過郵件發給其他專案組
-----這不是一個好的分發機制,太多的環節可能導致出現bug
8、 專案進入測試階段,每天都要向測試伺服器部署一版。每次都手動部署,太麻煩了。
二、maven
Maven是基於POM(工程物件模型),通過一小段描述來對專案的程式碼、報告、檔案進管理的工具。
Maven是一個跨平臺的專案管理工具,它是使用java開發的,它要依賴於jdk1.6及以上
Maven主要有兩大功能:管理依賴、專案構建。
依賴指的就是jar包。
2.1什麼是構建
繪製構建流程圖
2.2構建過程
2.3專案構建的方式
1、 Eclipse
使用eclipse進行專案構建,相對來說,步驟比較零散,不好操作
2、 Ant
它是一個專門的專案構建工具,它可以通過一些配置來完成專案構建,這些配置要明確的告訴ant,原始碼包在哪?目標class檔案應該存放在哪?資原始檔應該在哪
3、 Maven
它是一個專案管理工具,他也是一個專案構建工具,通過使用maven,可以對專案進行快速簡單的構建,它不需要告訴maven很多資訊,但是需要安裝maven去的規範去進行程式碼的開發。也就是說maven是有約束的。
三、maven的安裝
3.1下載
官方網站:http://maven.apache.org
下載完成後直接解壓
3.2安裝
第一步:配置maven的環境變數MAVEN_HOME
第二步:配置maven的環境變數PATH
第三步:測試maven是否安裝成功,在系統命令列中執行命令:mvn –v
3.3 配置maven
在maven中有兩個配置檔案:使用者配置、全域性配置(預設)
3.3.1 全域性配置
在maven安裝目錄的conf裡面有一個settings.xml檔案,這個檔案就是maven的全域性配置檔案。
該檔案中localRepository用來配置maven本地倉庫的地址
預設在系統的使用者目錄下的m2/repository中,該目錄是本地倉庫的目錄。
3.3.2 使用者配置
使用者配置檔案的地址:~/.m2/settings.xml,該檔案預設是沒有,需要將全域性配置檔案拷貝一份到該目錄下。
重新指定本地倉庫地址,如果不指定,則預設是~/.m2/repository目錄,如果使用者配置檔案不存在,則使用全域性配置檔案的配置。
3.3.3修改Maven中央倉庫地址
Maven是當前流行的專案管理工具,但官方的庫在國外經常連不上,連上也下載速度很慢。因此我們可以修改中央倉庫地址為國內一些企業提供的地址。
修改 m a v e n . h o m e / c o n f 或 者 {maven.home}/conf或者 maven.home/conf或者{user.home}/.m2資料夾下的settings.xml檔案,在標籤下加入上述內容即可。如下:
<?xml version="1.0" encoding="UTF-8"?>
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">
<mirrors>
<!-- 阿里雲倉庫 -->
<mirror>
<id>alimaven</id>
<mirrorOf>central</mirrorOf>
<name>aliyun maven</name>
<url>https://maven.aliyun.com/repository/central</url>
</mirror>
<!-- 中央倉庫1 -->
<mirror>
<id>repo1</id>
<mirrorOf>central</mirrorOf>
<name>Human Readable Name for this Mirror.</name>
<url>http://repo1.maven.org/maven2/</url>
</mirror>
<!-- 中央倉庫2 -->
<mirror>
<id>repo2</id>
<mirrorOf>central</mirrorOf>
<name>Human Readable Name for this Mirror.</name>
<url>http://repo2.maven.org/maven2/</url>
</mirror>
</mirrors>
</settings>
四、建立maven工程
4.1Maven工程結構
Project
|–src(原始碼包)
|–main(正常的原始碼包)
|–java(.java檔案的目錄)
|–resources(資原始檔的目錄)
|–test(測試的原始碼包)
|–java
|–resources
|–target(class檔案、報告等資訊儲存的地方)
|–pom.xml(maven工程的描述檔案)
4.2建立maven工程
4.2.1使用命令列建立
建立java工程
mvn archetype:generate -DgroupId=包名 -DartifactId=專案名稱 -DarchetypeArtifactId=maven-archetype-quickstart
建立web工程
mvn archetype:generate -DgroupId=包名 -DartifactId=專案名稱 -DarchetypeArtifactId=maven-archetype-webapp
4.2.2使用eclipse建立
右鍵—>Maven—>Maven Project,選擇模板,填寫包名,專案名稱即可。
4.3Maven命令的使用
4.3.1 Maven compile
編譯的命令
4.3.2 Maven clean
清除命令,清除已經編譯好的class檔案,具體說清除的是target目錄中的檔案
4.3.3 Maven test
測試命令,該命令會將test目錄中的原始碼進行編譯
4.3.4Maven package
打包命令
4.3.5 Maven install
安裝命令,會將打好的包,安裝到本地倉庫
4.3.6組合命令
以上命令可以進行組合使用,如:
mvn clean compile
mvn clean test
mvn clean package
mvn clean install
五、M2Eclipse
5.1下載外掛
5.2檢視是否安裝成功
5.3、設定maven安裝路徑
5.4、設定Maven的使用者配置
5.5、建立工程
eclipse中建立maven工程可以分為兩種,一種是使用模板建立,一種是不使用模板建立。
六、Maven的核心概念
6.1 座標
6.1.1、 什麼是座標?
在平面幾何中座標(x,y)可以標識平面中唯一的一點。在maven中座標就是為了定位一個唯一確定的jar包。
Maven世界擁有大量構建,我們需要找一個用來唯一標識一個構建的統一規範
擁有了統一規範,就可以把查詢工作交給機器
6.1.2、 Maven座標主要組成
groupId:定義當前Maven組織名稱
artifactId:定義實際專案名稱
version:定義當前專案的當前版本
6.2 依賴管理
6.2.1、 依賴範圍
其中依賴範圍scope 用來控制依賴和編譯,測試,執行的classpath的關係. 主要的是三種依賴關係如下:
1.compile: 預設編譯依賴範圍。對於編譯,測試,執行三種classpath都有效
2.test:測試依賴範圍。只對於測試classpath有效
3.provided:已提供依賴範圍。對於編譯,測試的classpath都有效,但對於執行無效。因為由容器已經提供,例如servlet-api
4.runtime:執行時提供。例如:jdbc驅動
6.2.2 依賴傳遞
A、B、C
B工程依賴A工程,C工程依賴B工程,那麼B工程是C工程的直接依賴,A工程是C工程的間接依賴
6.2.2.1建立MavenThird工程
第一步:建立mavenThird工程
第二步:建立MavenThird.java
第三步:建立TestMavenThird.java
6.2.2.2 分析第一解決依賴和第二直接依賴
6.2.2.3 依賴範圍傳遞
上面第一行表示第二直接依賴範圍
中間的交叉單元格表示傳遞性依賴範圍。
總結:
Ø 當第二依賴的範圍是compile的時候,傳遞性依賴的範圍與第一直接依賴的範圍一致。
Ø 當第二直接依賴的範圍是test的時候,依賴不會得以傳遞。
Ø 當第二依賴的範圍是provided的時候,只傳遞第一直接依賴範圍也為provided的依賴,且傳遞性依賴的範圍同樣為 provided;
Ø 當第二直接依賴的範圍是runtime的時候,傳遞性依賴的範圍與第一直接依賴的範圍一致,但compile例外,此時傳遞的依賴範圍為runtime;
6.2.3 依賴衝突
在maven中存在兩種衝突方式:一種是跨pom檔案的衝突,一致是同一個pom檔案中的衝突。
6.2.3.1跨pom檔案的衝突
MavenFirst的pom檔案中依賴來junit的4.9版本,那邊MavenSecond和MavenThird中都是使用了4.9版本。
如果MavenSecond中重新依賴junit的4.8版本,那麼MavenSecond和MavenThird中都是使用了4.8本,這體現來依賴的就近使用原則。
依賴的jar包如下:
6.2.3.2同一個pom檔案的衝突
6.2.4 可選依賴
Optional標籤標示該依賴是否可選,預設是false。可以理解為,如果為true,則表示該依賴不會傳遞下去,如果為false,則會傳遞下去。
6.2.5 排除依賴
Exclusions標籤可以排除依賴
6.3 生命週期
Maven有三個生命週期:clean生命週期、default生命週期、site生命週期
生命週期可以理解為專案構建的步驟集合。
生命週期是由多個階段(Phase)組成。每個階段都是一個完整的功能,比如mvn clean中的clean就是一個階段。
6.3.1 Clean生命週期
pre-clean 執行一些需要在clean之前完成的工作
clean 移除所有上一次構建生成的檔案
post-clean 執行一些需要在clean之後立刻完成的工作
mvn clean命令,等同於 mvn pre-clean clean。只要執行後面的命令,那麼前面的命令都會執行,不需要再重新去輸入命令。
有Clean生命週期,在生命週期又有clean階段。
6.3.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 將最終的包複製到遠端的倉庫,以讓其它開發人員與專案共享。
在maven中,只要在同一個生命週期,你執行後面的階段,那麼前面的階段也會被執行,而且不需要額外去輸入前面的階段,這樣大大減輕了程式設計師的工作。
6.3.3 Site生命週期
pre-site 執行一些需要在生成站點文件之前完成的工作
site 生成專案的站點文件
post-site 執行一些需要在生成站點文件之後完成的工作,並且為部署做準備
site-deploy 將生成的站點文件部署到特定的伺服器上
6.4 外掛
外掛(plugin),每個外掛都能實現一個階段的功能。Maven的核心是生命週期,但是生命週期相當於主要指定了maven命令執行的流程順序,而沒有真正實現流程的功能,功能是有外掛來實現的。
比如:compile就是一個外掛實現的功能。
6.4.1 編譯外掛
6.4.2 Tomcat外掛
預設輸入tomcat:run去使用tomcat外掛來啟動web工程,但是預設的tomcat外掛使用的tomcat版本是tomcat6
而目前主流的tomcat,是使用的tomcat7,需要手動配置tomcat外掛
使用tomcat7來執行web工程,它的命令是:tomcat7:run
6.5、繼承
建立繼承專案
6.6、聚合
建立聚合專案
七、倉庫
7.1、什麼是Maven倉庫
用來統一儲存所有Maven共享構建的位置就是倉庫。根據Maven座標定義每個構建在倉庫中唯一儲存路徑大致為:groupId/artifactId/version/artifactId-version.packaging
7.2、倉庫的分類
- 本地倉庫
預設在~/.m2/repository,如果在使用者配置中有配置,則以使用者配置的地址為準
- 遠端倉庫
中央倉庫
- 私服
7.3、私服
相關文章
- 小饒學程式設計之JAVA SE第三部分——MySQL基礎程式設計JavaMySql
- Java協程程式設計之Loom專案嚐鮮Java程式設計OOM
- Rust 程式設計小專案:WebServer 01Rust程式設計WebServer
- Rust 程式設計小專案:WebServer 02Rust程式設計WebServer
- Rust 程式設計小專案:WebServer 03Rust程式設計WebServer
- Rust 程式設計小專案:WebServer 04Rust程式設計WebServer
- Rust 程式設計小專案:WebServer 05Rust程式設計WebServer
- Rust 程式設計小專案:WebServer 06Rust程式設計WebServer
- 小程式的專案結構設計
- Java EE/J2EE物件導向程式設計之道Java物件程式設計
- 小程式專案之填坑小記
- Java學習之AWT GUI程式設計JavaGUI程式設計
- Hadoop 學習之 MapredReduce 程式設計小試Hadoop程式設計
- Java學習之Swing Gui程式設計JavaGUI程式設計
- mac 下使用java EE 建立web專案MacJavaWeb
- 適合 Java 新手的開源專案集合——在 GitHub 學程式設計JavaGithub程式設計
- 小學數學程式設計題程式設計
- 好程式設計師Java培訓分享Java EE與Java的區別程式設計師Java
- oracle的程式設計師犯了不可饒恕的錯誤!Oracle程式設計師
- 從實戰專案總結的Ruby小技巧(第三部分)
- Linux Unix shell 程式設計指南學習筆記(第三部分)Linux程式設計筆記
- 黑馬程式設計師——Java學習筆記之⑦——“網路程式設計”程式設計師Java筆記
- Java EE的斷路器API設計JavaAPI
- J2EE程式設計起步程式設計
- 好程式設計師Java學習路線之集程式設計師Java
- Java 高效程式設計(Effective Java)中文第三版Java程式設計
- 【Java EE】從零開始寫專案【總結】Java
- 微信小程式開發—專案實戰之計算器開發微信小程式
- Java程式設計師學習Rust程式設計 - infoworldJava程式設計師Rust
- 好程式設計師Java教程分享Java之設計模式程式設計師Java設計模式
- 程式設計師看不懂自己寫的程式碼 是不可饒恕的程式設計師
- 程式設計師必看的書之Java程式設計師程式設計師Java
- Docker第三方專案小結Docker
- JAVA高階程式設計之hibernate框架學習二Java程式設計框架
- SimpleAdmin手摸手教學之:專案架構設計2.0架構
- Java程式設計常用計算機小知識Java程式設計計算機
- JAVA程式設計學習記錄(File類檔案操作)Java程式設計
- Java專案經驗——程式設計師成長的鑰匙Java程式設計師