Maven( ['me?vn])
介紹
? 首先要了解,maven 是項(xiàng)目管理工具,主要用于管理我們的 jar 包,通過優(yōu)化我們的 pom.xml 可以很好的優(yōu)化我們的項(xiàng)目。
? 當(dāng)然除了 maven 之外,項(xiàng)目管理工具還有 ant 、 gradle 等 ,gradle 依賴配置更為簡潔,這是 gradle 最大的優(yōu)點(diǎn),他吸取了 ant 和 maven 的優(yōu)點(diǎn),采用 Groovy 代碼進(jìn)行配置,如果說 maven 是 convention over configuration ,那么 gradle 就是在自己定規(guī)則。
基礎(chǔ)
安裝配置
-
settings.xml (常用配置)
lcoalRepository # 本地倉庫 offline # 離線 proxies/proxy # 代理 servers/server # 服務(wù)器 mirrors/mirror # 鏡像 profiles/prfile # 'ticket' activeProfiles/activeProfile # 通過與 profiles 進(jìn)行配置進(jìn)行工作區(qū)的切換 -
convention over configuration 有沒有一個(gè) pom 的標(biāo)準(zhǔn)呢,或者說是一個(gè)超級(jí) pom
maven-model-builder-xxx.jar/org/apache/maven/model
-
pom.xml (常用配置)
modelVersion # pom文件的模型版本,參考超級(jí) pom groupId # 組Id,一般是網(wǎng)站的逆序 artifactId # 功能命名 version # 版本號(hào),snapshot final.... packaging # 默認(rèn)為 jar,在進(jìn)行復(fù)合工程的創(chuàng)建的時(shí)候,需要改為 pom name # 名稱 modules # 字母塊,此時(shí)應(yīng)該是最外層的 pom properties # 配置信息 dependencyManagement # 通過此配置可以有效的管理聚合項(xiàng)目的引用 jar 包的版本 dependency # jar 包依賴 -
dependency
scope(生命周期)
- compile 編譯,不寫默認(rèn)compile
- test 測(cè)試,在編譯和打包的時(shí)候,不會(huì)依賴進(jìn)去
- provided 在編譯和測(cè)試階段都有效,但是最后打包不會(huì)加入進(jìn)去。servlet-api 就不需要在進(jìn)行引入
- runtime 運(yùn)行,在運(yùn)行的時(shí)候需要依賴,編譯的時(shí)候不依賴。
- system 本地,編譯的時(shí)候,依賴本地包
jar 包的依賴傳遞,好的項(xiàng)目,一定要盡量的降低 jar 包的冗余度
`mvn dependency:tree > log.txt`
-
exclusions
過濾掉干擾的 jar ,避免應(yīng)用沖突
定義
-
lifecycle 生命周期
分為三大類 clean default site,具體又會(huì)有下面這些小類,黑色為核心 default 分類
- clean
- validate
- compile
- test
- package
- verify
- install
- site
- deploy
-
phase 任務(wù)單元
一個(gè)聲明周期可以分解為多個(gè)任務(wù)單元,即多個(gè) phase,他們是按順序進(jìn)行執(zhí)行的。
如:
clean 拆分為
pre-clean : 一些執(zhí)行 clean 前的操作
clean : 執(zhí)行 clean 操作
post-clean : 執(zhí)行 clean 操作之后需要立馬進(jìn)行的操作
-
goal 執(zhí)行任務(wù)的最小單元
一個(gè) phase 對(duì)應(yīng)到多個(gè) goal ,這些goal 也是按順序進(jìn)行執(zhí)行的。
-
版本
我們熟知的版本后綴名:snapshot、release等
snapshot 結(jié)尾的是測(cè)試版本,release 為發(fā)布版本,一般以 release 結(jié)尾的 jar 包不能自動(dòng)更新,必須升級(jí)版本號(hào)。谷歌一些 jar 包也喜歡以 final 進(jìn)行后綴,這個(gè)可以自己進(jìn)行定義,不離譜就好。
-
常用的命令:
clean # 清理target compile # 編譯項(xiàng)目 test # 執(zhí)行測(cè)試用例 package # 進(jìn)行打包 install # 安裝到本地 deploy # 發(fā)布到遠(yuǎn)程倉庫 需要在 pom 中配置 distributionManagement 并在settings.xml 中配置 server 常用的指令: mvn clean install -Dmaven.test.skip=true 高級(jí)特性:多線程打包 mvn -T 4 clean install mvn -T 1C clean install
常用插件
-
versions 進(jìn)行版本統(tǒng)一管理
<dependency> <groupId>org.codehaus.mojo</groupId> <artifactId>versions-maven-plugin</artifactId> <version>2.5</version> </dependency> -
findbugs 檢查代碼質(zhì)量
<dependency> <groupId>org.codehaus.mojo</groupId> <artifactId>findbugs-maven-plugin</artifactId> <version>3.0.5</version> </dependency>
高級(jí)
-
手寫Mojo
操作步驟
- 修改 pom 配置
<!-- 打包方式修改為 maven-plugin --> <packaging>maven-plugin</packaging> <!-- 引入需要依賴的 jar 包 --> <dependency> <groupId>org.apache.maven</groupId> <artifactId>maven-plugin-api</artifactId> <version>${maven.plugin.api.version}</version> </dependency> <dependency> <groupId>org.apache.maven.plugin-tools</groupId> <artifactId>maven-plugin-annotations</artifactId> <version>${maven.plugin.annotations.version}</version> <scope>provided</scope> </dependency>?
- 編寫自定義 plugin 類
- 繼承
AbstractMojo類 -
@Parameter標(biāo)注參數(shù) -
execute()中用getLog()方法打印出插件運(yùn)行日志及結(jié)果
- 編譯打包
mvn install - 引入使用
?
-
自定義腳手架
新建 maven 聚合工程,lan-base lan-web lan-service lan-consumer....
-
工程根目錄下依次執(zhí)行
mvn archetype:create-from-projectcd target/generated-sources/archetypemvn install
自定義腳手架就已經(jīng)加到了 maven 倉庫中了,可以在 maven 倉庫中進(jìn)行查看
可以查看倉庫中目錄中的 maven-metadata-local.xml 文件,在 ide 中進(jìn)行引入。
手動(dòng)從 archetype 創(chuàng)建項(xiàng)目
mvn archetype:generate -DarchetypeCatelog=local?