Java如何通過Maven管理項(xiàng)目依賴
項(xiàng)目的依賴
Java最大的一個(gè)優(yōu)勢(shì)之一應(yīng)該是整個(gè)生態(tài)中無數(shù)的框架和API,我們創(chuàng)建實(shí)際的項(xiàng)目不可避免的都需要用到這些框架和API,而它們通常都是以JAR包的形式提供。我們之前在編譯項(xiàng)目的時(shí)候,需要在classpath上存放依賴的JAR包。而且這些外部的JAR包還會(huì)有其他依賴。我們需要遞歸地一個(gè)個(gè)去下載所有這些外部依賴,并且要確保下載的版本都是正確的,當(dāng)項(xiàng)目越來越復(fù)雜的時(shí)候,這是極其麻煩的事情,比如碰到JAR Hell的問題。
Maven現(xiàn)在來拯救我們了,Maven可以自動(dòng)幫我們做依賴管理,我們需要做的就是在POM文件里指定依賴JAR包的名稱、版本號(hào),Maven會(huì)自動(dòng)下載,遞歸地去下載所有依賴,我們可以從具體的依賴添加工作解放出來了。
通過Maven定義依賴
之前的例子是一個(gè)完全自包含的項(xiàng)目,不需要額外的包依賴,因?yàn)樗鼘?shí)在太簡單了。我們來讓這個(gè)例子稍微復(fù)雜一點(diǎn),在打印"Hello World!"的時(shí)候同時(shí)打印出日期和時(shí)間,我們希望使用Joda提供的時(shí)間庫來讓幫助我們簡化時(shí)間相關(guān)的處理代碼:
package com.tianmaying.mavendemo; import org.joda.time.LocalTime; public class HelloWorld { public static void main(String[] args) { LocalTime currentTime = new LocalTime(); System.out.println("The current local time is: " + currentTime); NewComer newComer = new NewComer(); System.out.println(newComer.sayHello()); } }
我們使用Joda Time包提供的LocalTime
類來獲取和打印當(dāng)前時(shí)間。
這時(shí)如果我們執(zhí)行mvn compile
將會(huì)報(bào)出編譯錯(cuò)誤。需要將 Joda Time這個(gè)庫添加到我們的POM依賴中:
<dependencies> ... <dependency> <groupId>joda-time</groupId> <artifactId>joda-time</artifactId> <version>2.2</version> </dependency> </dependencies>
上面這段XML定義了這個(gè)項(xiàng)目的依賴。在<depency>元素中,包含三個(gè)子元素:
- <groupId> 類似于項(xiàng)目所屬的組織,所依賴的包也屬于某一個(gè)組織
- <artifactId> 依賴包的名稱
- <version> 依賴包的版本
依賴還有一個(gè)范圍(scope)的屬性,有三種取值:
- compile表示這個(gè)依賴在編譯時(shí)應(yīng)該存在,這是scope的默認(rèn)值
- provided表示這個(gè)依賴不僅在編譯時(shí)需要,同時(shí)應(yīng)該在運(yùn)行時(shí)也存在,比如Java Servlet API的依賴
- test表示依賴在編譯和測試時(shí)需要,但是運(yùn)行時(shí)不要求存在,比如JUnit的依賴,運(yùn)行時(shí)是不需要的
此時(shí)運(yùn)行mvn compile或者mvn package,Maven應(yīng)該可以解析到Joda庫,并將其從中央倉庫下載,構(gòu)建成功啦!
Maven倉庫
Maven倉庫可以認(rèn)為是基于Maven的一個(gè)構(gòu)件(主要時(shí)Jar包)管理工具,你可以從里面找構(gòu)件,也可以往里面增加構(gòu)件。如果你用過Ant就會(huì)知道,通過Ant來管理項(xiàng)目時(shí),我們一般都需要一個(gè)lib文件夾,各種依賴的Jar包都會(huì)放進(jìn)去,而且為了協(xié)作的一致性,通常還需要放到代碼版本管理系統(tǒng)中。現(xiàn)在輕松簡單了,基于基于依賴的信息,Maven就可以自動(dòng)地以遞歸的方式下載所有的依賴,直到整個(gè)依賴樹都下載完畢并放到你的本地倉庫中。Maven倉庫本質(zhì)上存儲(chǔ)了Jar包和元數(shù)據(jù)信息,通過原信息能夠準(zhǔn)確定位到Jar包,從而能夠獲取和修改。
Maven有三種類型的倉庫:
- 本地倉庫:本地倉庫默認(rèn)在用戶目錄下,包含了下載的所有依賴
- 中央倉庫:中央倉庫由Maven自己提供的,本地倉庫中的沒有依賴默認(rèn)都會(huì)去中央倉庫查找,下載后會(huì)存放到本地倉庫
- 遠(yuǎn)程倉庫:遠(yuǎn)程倉庫是遠(yuǎn)程服務(wù)器上可訪問的倉庫, 本質(zhì)類似于中央倉庫(只不過中央倉庫是權(quán)威罷了,而且你不能亂動(dòng):)。遠(yuǎn)程倉庫可以本地網(wǎng)絡(luò)中或者互聯(lián)網(wǎng)上,一般團(tuán)隊(duì)內(nèi)部會(huì)設(shè)置一個(gè)內(nèi)部的遠(yuǎn)程倉庫,這樣可以解決安全共享,網(wǎng)絡(luò)代理等問題。
Maven首先會(huì)從本地倉庫,然后是中央倉庫,最后如果pom文件中配置了遠(yuǎn)程倉庫,會(huì)到遠(yuǎn)程倉庫中查找依賴。
遠(yuǎn)程倉庫需要配置.settings文件,需要加入類似這樣的配置:
<repositories> <repository> <id>tianmaying</id> <url>http://tianmaying.com/maven2/lib</url> </repository> </repositories>
我們學(xué)習(xí)過程中,使用Maven自帶的中央倉庫就足以應(yīng)付絕大多數(shù)情況了,不需要任何額外的配置。
快照依賴
Maven還提供一個(gè)非常方便的功能:快照依賴。快照依賴指的是那些還在開發(fā)中的內(nèi)部依賴包。與其經(jīng)常地更新版本號(hào)來獲取最新版本,不如你直接依賴項(xiàng)目的快照版本??煺瞻姹镜拿恳粋€(gè)build版本都會(huì)被下載到本地倉庫,即使該快照版本已經(jīng)在本地倉庫了??偸窍螺d快照依賴可以確保本地倉庫中的每一個(gè)build版本都是最新的。這對(duì)我們快速迭代開發(fā)是一個(gè)非??岬奶匦?。
以上就是Java如何通過Maven管理項(xiàng)目依賴的詳細(xì)內(nèi)容,更多關(guān)于Maven管理項(xiàng)目依賴的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
SpringBoot+Redisson自定義注解一次解決重復(fù)提交問題
項(xiàng)目中經(jīng)常會(huì)出現(xiàn)重復(fù)提交的問題,本文主要介紹了SpringBoot+Redisson自定義注解一次解決重復(fù)提交問題,具有一定的參考價(jià)值,感興趣的可以了解一下2024-03-03Spring中的@Conditional注解實(shí)現(xiàn)分析
這篇文章主要介紹了Spring中的@Conditional注解實(shí)現(xiàn)分析, @Conditional是Spring 4出現(xiàn)的注解,但是真正露出價(jià)值的是Spring Boot的擴(kuò)展@ConditionalOnBean等,需要的朋友可以參考下2023-12-12intellij idea修改maven配置時(shí)總是恢復(fù)默認(rèn)配置的解決方法idea版本(2020.2.x)
這篇文章主要介紹了intellij idea修改maven配置時(shí)總是恢復(fù)默認(rèn)配置的解決方法idea版本(2020.2.x),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-08-08SpringBoot+VUE實(shí)現(xiàn)數(shù)據(jù)表格的實(shí)戰(zhàn)
本文將使用VUE+SpringBoot+MybatisPlus,以前后端分離的形式來實(shí)現(xiàn)數(shù)據(jù)表格在前端的渲染,具有一定的參考價(jià)值,感興趣的可以了解一下2021-08-08java基于C/S模式實(shí)現(xiàn)聊天程序(服務(wù)器)
這篇文章主要為大家詳細(xì)介紹了java基于C/S模式實(shí)現(xiàn)聊天程序的服務(wù)器篇,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-01-01