Maven核心概念
統(tǒng)一管理目標jar包的版本
以對Spring的jar包依賴為例:Spring的每一個版本中都包含spring-context,springmvc等jar包。我們應該導入版本一致的Spring jar包,而不是使用4.0.0的spring-context的同時使用4.1.1的springmvc。
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.0.0.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>4.0.0.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>4.0.0.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
<version>4.0.0.R
問題是如果我們想要將這些jar包的版本統(tǒng)一升級為4.1.1,是不是要手動一個個修改呢?顯然,我們有統(tǒng)一配置的方式:
<!--統(tǒng)一管理當前模塊的jar包的版本-->
<properties>
<spring.version>4.0.0.RELEASE</spring.version>
</properties>
……
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
<version>${spring.version}</version>
</dependency>
這樣一來,進行版本調(diào)整的時候只改一改地方就行了
倉庫
1)分類
(1)本地倉庫:為當前本機電腦上的所有Maven工程服務。
(2)遠程倉庫
①私服:架設(shè)在當前局域網(wǎng)環(huán)境下,為當前局域網(wǎng)范圍內(nèi)的所有Maven工程服務。
②中央倉庫:架設(shè)在Internet上,為全世界所有Maven工程服務。
③中央倉庫的鏡像:架設(shè)在各個大洲,為中央倉庫分擔流量。減輕中央倉庫的壓力,同時更快的響應用戶請求。
2)倉庫中的文件
(1)Maven的插件
(2)我們自己開發(fā)的項目的模塊
(3)第三方框架或工具的jar包
不管是什么樣的jar包,在倉庫中都是按照坐標生成目錄結(jié)構(gòu),所以可以通過統(tǒng)一的方式查詢或依賴。
生命周期
1)什么是Maven的生命周期?
Maven生命周期定義了各個構(gòu)建環(huán)節(jié)的執(zhí)行順序,有了這個清單,Maven就可以自動化的執(zhí)行構(gòu)建命令了。
Maven有三套相互獨立的生命周期,分別是:
a.Clean Lifecycle在進行真正的構(gòu)建之前進行一些清理工作。
b.Default Lifecycle構(gòu)建的核心部分,編譯,測試,打包,安裝,部署等等。
c.Site Lifecycle生成項目報告,站點,發(fā)布站點。
再次強調(diào)一下它們是相互獨立的,你可以僅僅調(diào)用clean來清理工作目錄,僅僅調(diào)用site來生成站點。當然你也可以直接運行mvn clean install site運行所有這三套生命周期。
每套生命周期都由一組階段(Phase)組成,我們平時在命令行輸入的命令總會對應于一個特定的階段。比如,運行mvn clean,這個clean是Clean生命周期的一個階段。有Clean生命周期,也有clean階段。
2)clean生命周期
Clean生命周期一共包含了三個階段:
a.pre-clean 執(zhí)行一些需要在clean之前完成的工作
b.clean 移除所有上一次構(gòu)建生成的文件
c.post-clean 執(zhí)行一些需要在clean之后立刻完成的工作
3)Site生命周期
a.pre-site執(zhí)行一些需要在生成站點文檔之前完成的工作
b.site生成項目的站點文檔
c.post-site執(zhí)行一些需要在生成站點文檔之后完成的工作,并且為部署做準備
d.site-deploy將生成的站點文檔部署到特定的服務器上
這里經(jīng)常用到的是site階段和site-deploy階段,用以生成和發(fā)布Maven站點,這可是Maven相當強大的功能,Manager比較喜歡,文檔及統(tǒng)計數(shù)據(jù)自動生成,很好看。
4)Default生命周期
Default生命周期是Maven生命周期中最重要的一個,絕大部分工作都發(fā)生在這個生命周期中。這里,只解釋一些比較重要和常用的階段。
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 接受編譯好的代碼,打包成可發(fā)布的格式,如JAR。
pre-integration-test
integration-test
post-integration-test
verify
install將包安裝至本地倉庫,以讓其它項目依賴。
deploy將最終的包復制到遠程的倉庫,以讓其它開發(fā)人員與項目共享或部署到服務器上運行。
5)生命周期與自動化構(gòu)建
運行任何一個階段的時候,它前面的所有階段都會被運行,例如我們運行mvn install 的時候,代碼會被編譯,測試,打包。這就是Maven為什么能夠自動執(zhí)行構(gòu)建過程的各個環(huán)節(jié)的原因。此外,Maven的插件機制是完全依賴Maven的生命周期的,因此理解生命周期至關(guān)重要。
插件和目標
(1)Maven的核心僅僅定義了抽象的生命周期,具體的任務都是交由插件完成的。
(2)每個插件都能實現(xiàn)多個功能,每個功能就是一個插件目標。
(3)Maven的生命周期與插件目標相互綁定,以完成某個具體的構(gòu)建任務。
例如:compile就是插件maven-compiler-plugin的一個功能;pre-clean是插件maven-clean-plugin的一個目標。
繼承
為什么需要繼承機制
由于非compile范圍的依賴信息是不能在“依賴鏈”中傳遞的,所以有需要的工程只能單獨配置。例如:
此時如果項目需要將各個模塊的junit版本統(tǒng)一為4.9,那么到各個工程中手動修改無疑是非常不可取的。使用繼承機制就可以將這樣的依賴信息統(tǒng)一提取到父工程模塊中進行統(tǒng)一管理
創(chuàng)建父工程
(1)父工程的打包方式為pom
<groupId>com.atguigu.maven</groupId>
<artifactId>Parent</artifactId>
<packaging>pom</packaging>
<version>1.0-SNAPSHOT</version>
(2)父工程只需要保留pom.xml文件即可。
在子工程中引用父工程
在子工程中引用父工程
(1)父工程坐標
<parent>
<!-- 父工程坐標 -->
<groupId>...</groupId>
<artifactId>...</artifactId>
<version>...</version>
<!--指定從當前pom.xml文件出發(fā)尋找父工程的pom.xml文件的相對路徑-->
<relativePath>..</relativePath>
</parent>
(2)繼承
<!--繼承-->
<parent>
<groupId>com.atguigu.maven</groupId>
<artifactId>Parent</artifactId>
<version>1.0-SNAPSHOT</version>
<!--指定從當前pom.xml文件出發(fā)尋找父工程的pom.xml文件的相對路徑-->
<relativePath>../Parent/pom.xml</relativePath>
</parent>
此時,如果子工程的groupId和version如果和父工程重復則可以刪除。
在父工程中管理依賴
(1)將Parent項目中的dependencies標簽,用dependencyManagement標簽括起來。
<!--依賴管理-->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.0</version>
<scope>test</scope>
</dependency>
</dependencies>
</dependencyManagement>
(2)在子項目中重新指定需要的依賴,刪除范圍和版本號。
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</dependency>
聚合
為什么要使用聚合
將多個工程拆分為模塊后,需要手動逐個安裝到倉庫后依賴才能夠生效。修改源碼后也需要逐個手動進行clean操作。而使用了聚合之后就可以批量進行Maven工程的安裝、清理工作。
如何配置聚合
在總的聚合工程中使用modules/module標簽組合,指定模塊工程的相對路徑即可。
<!--聚合-->
<modules>
<module>../MakeFriend</module>
<module>../OurFriends</module>
<module>../HelloFriend</module>
<module>../Hello</module>
</modules>
Maven可以根據(jù)各個模塊的繼承和依賴關(guān)系自動選擇安裝的順序。
Maven酷站
我們可以到http://mvnrepository.com/搜索需要的jar包的依賴信息。
http://search.maven.org/
Maven生產(chǎn)環(huán)境所遇到的問題
jar未下載完成
在使用maven過程中,我們所使用的jar包是會到中央倉庫中進行下載的,但是如果再下載過程中因為網(wǎng)絡不通暢等原因,會導致jar包下載失敗,并且會形成一個xxxx.lastupdated的文件,但是此時maven并不會將其刪掉后重新下載,而是認為它下載過了,我們需要做的是將.xxxxlastupdated文件手動刪除后,再次重新下載。
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.0</version>
<scope>test</scope>
</dependency>
1)問題模擬
(1)在項目導入了maven依賴,在倉庫中發(fā)現(xiàn)目前沒有這個依賴。
(2)此刻電腦沒有網(wǎng)絡
(3)點擊maven的刷新后,maven會去下載,但是下載不下來。
(4)最終在本地倉庫會形成一下模樣。
(5)并且連接上網(wǎng)絡后并不會繼續(xù)下載,形成如下模樣。
2)解決方案1
手動刪除.lastupdate文件,讓其重新下載就好了。
3)解決方案2
直接在倉庫下搜索.lastupdated文件,然后ctrl+a全選后ctrl+d刪除 就能直接刪掉所有沒下載號的jar包。文章來源:http://www.zghlxwxcb.cn/news/detail-861695.html
jar包沖突問題
jar包沖突往往是發(fā)生在,同一個項目在運行時導入了兩個相同jar包的不同版本,又因為兩個不同版本的jar包代碼是不一樣的,是沖突的,導致在運行時,報出各種莫名其妙的錯誤。
1)問題描述
以上依賴中,thymeleaf-spring5–3.0.12是天然依賴于thymeleaf的3.0.12版本的依賴的,但是因為我們自己的導入是thymeleaf 3.0.11版本,這兩個版本代碼差距巨大,就會導致jar包沖突問題。
2)解決方案
要么不要導入3.0.11版本依賴,或者你選在將thymeleaf-spring5–3.0.12的依賴中的thymeleaf的3.0.12
版本排除掉(圖解是排除的方式)。文章來源地址http://www.zghlxwxcb.cn/news/detail-861695.html
到了這里,關(guān)于學習大數(shù)據(jù),所需要的java(Maven)基礎(chǔ)(2)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!