查找依賴信息的網站:http://mvnrepository.com/
一、座標
# Maven中的座標,使用三個向量在倉庫中唯一定位一個Maven工程
# 公司或組織域名倒序+項目名
<groupId>com.myonetest.maven</groupId>
# 模塊名稱
<artifactId>JavaProject01</artifactId>
# 版本,SNAPSHOT 快照的意思,代表會快速迭代;RELEASE 代表穩定版本
<version>0.0.1-SNAPSHOT</version>
# 依賴範圍,compile 代表全程參與;test 只參與測試;provided 不參與打包
<scope>compile</scope>
# Maven工程和倉庫路徑的對應關係
<groupid>org.springframework</groupid>
<artifactid>spring-core</actifactid>
<version>4.0.0.RELEASE</version>
# org/springframework/spring-code/4.0.0.RELEASE/spring-code-4.0.0.RELEASE.jar
二、倉庫
# Maven倉庫分爲本地倉庫和遠程倉庫
# 本地倉庫一般包含以下內容
# 1、Maven自身需要的插件
# 2、第三方框架或工具所需要的jar包
# 3、我們自己開發的Maven工程
# 遠程倉庫一般分爲
# 1、中央倉庫
# 2、中央倉庫鏡像
# 3、局域網倉庫(可以使用 Nexus 搭建)
三、生命週期/插件
# 插件
# 生命週期的各個階段只定義了需要執行的任務,各個階段的任務和插件的目標是相對應的,相似的目標是由
#特定的插件來完成的
# Maven的核心程序定義了抽象的生命週期,生命週期的各個階段任務都由插件來完成。
# 我們可以把插件目標定義爲 Maven 命令。
# 生命週期
# Maven核心程序爲了更好的實現自動化構建,不論現在要執行生命週期中的哪一個極端,都會從這個生命週期的最初位置開始執行。(也就是每次都會從頭重新開始,比如執行 compile 命令後,再執行 test 命令,因爲 test 命令在 compile 命令之後,Maven核心程序會從頭開始再執行一遍直到 test)
# mvn clean 生命週期
Clean Lifecycle # 在進行真正的構建前進行清理工作
pre-clean #執行一些需要在clean之前完成的工作
clean #移除所有上一次構建生成的文件
post-clean #執行一些需要在clean之後立刻完成的工作
# mvn site 生命週期
Site Lifecycle #生成項目報告、站點,發佈站點
pre-site #執行一些需要在生成站點文檔之前完成的工作
site #生成項目的站點文檔
post-site #執行一些需要在生成站點文檔之後完成的工作,並且爲部署做準備
site-deploy #將生成的站點文檔部署到特定的服務器上
# 這裏經出用到的是site階段和site-deploy階段,用以生成和發佈Maven站點,這是Maven強大的功能,
文檔及統計數據自動生成,很好看。
# 默認的生命週期
Default Lifecycle:構建的核心部分,編譯、測試、打包、安裝,部署等
Default生命週期是Mave生命週期最重要的一個,絕大部分工作都發生在這個裏面
validate
generate-source
process-sources
generate-resources
process-resource #複製並處理資源文件,至目標目錄,準備打包
compile #編譯項目的源代碼
process-classes
generate-test-sources
process-test-sources
generate-test-resources
process-test-reources #複製並處理資源文件,至目標測試目錄。
test-compile #編譯測試源代碼
prcess-test-classes
test #使用合適的單元測試框架運行測試,這些測試代碼不會被打包或部署
prepare-package
package #接受編譯好的代碼,打包成可發佈的格式,比如jar
pre-integration-test
integration-test
post-integration-test
verify
install #將包安裝至本地倉庫,以讓其它項目依賴
deploy #將最終的包複製到遠程的倉庫,以讓其它開發人員與項目共享或部署到服務器上運行。
# 三個之間相互獨立,可以單獨調用,也可以運行mvn clean install site 一起調用。
PS:Maven核心程序只定義了抽象的生命週期,但具體的工作由插件完成,而插件並不包含在Maven核心程序中。 當Maven程序執行命令需要用到一些插件時,Maven核心程序會先到本地倉庫找,如果找不到則自動連接外網到中央倉庫下載。如果下載失敗則構建失敗。
四、繼承
# 假設場景
# 現在由三個項目A\B\C,都有依賴包junit,版本分別是4.0/4.9/4.2
# 因爲並不是必須包,所以依賴範圍是 test
<scope>test</scope>
# 但是 test 的依賴範圍不能傳遞,所以A\B\C三個項目中的版本都不一樣
# 需求
# 統一管理各個模塊之間的junit依賴版本
# 解決思路
# 將所有的junit依賴版本統一提取到父工程中,子工程聲明依賴時不指定版本;以父工程中統一設定。
# 操作步驟
# 1、創建一個新的Maven工程作爲父工程,創建項目時 packaging 要選擇 pom 方式。
# 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">
<modelVersion>4.0.0</modelVersion>
<groupId>com.parent.maven</groupId>
<artifactId>parent</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>pom</packaging>
</project>
# 2、在子工程中對聲明對父工程的引用
<!-- 子工程中聲明父工程 -->
<parent>
<groupId>com.parent.maven</groupId>
<artifactId>parent</artifactId>
<version>0.0.1-SNAPSHOT</version>
<relativePath>../parent/pom.xml</relativePath>
</parent>
# 3、將子工程的座標中與父工程座標中重複的內容刪除,會有黃線提示:grouid is duplicate of parent groupid
# 4、在父工程中統一聲明JUNIT的依賴(還有一個重點是方便管理)
<dependencyManagement>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.0</version>
<scope>test</scope>
</dependency>
</dependencies>
</dependencyManagement>
# 5、在子工程中刪除junit依賴的版本號,如果要使用不一致的,也可以不刪除。
# PS: 配置繼承後,執行安裝命令時要先安裝父工程。
五、聚合
# 可以實現一鍵安裝各個模塊
# 配置方式: 在一個總的聚合工程中配置各個參與聚合的模塊
# PS: 可以新建一個Maven工程作爲聚合工程,也可以使用剛纔實現繼承時創建的父工程(一般使用這個)
<!-- 配置聚合 -->
<modules>
<!-- 指定各個子工程的相對路徑 -->
<module>../ProjectA</module>
<module>../ProjectB</module>
<module>../ProjectC</module>
</modules>
# 配置完成直接pom.xml右擊run 允許install即可
# 日誌中的 reactor build order 會顯示先後順序
# 日誌中的 Reactor Summary 會顯示各個模塊的耗時和成功狀態
六、自動部署
平常好像用不上,就先不記錄了,核心是使用 cargo 一家專門從事servlet容器啓動的組織,org.codehaus.cargo