使用mvn?deploy命令上傳jar包的實(shí)現(xiàn)
一、背景
在日常Java開(kāi)發(fā)中,Maven私服作為團(tuán)隊(duì)協(xié)作的核心樞紐,承載著版本依賴分發(fā)的重任。然而,當(dāng)某天發(fā)現(xiàn)私服中關(guān)鍵JAR包離奇丟失,而本地倉(cāng)庫(kù)仍保留著歷史構(gòu)建文件時(shí),如何快速?gòu)谋镜?ldquo;復(fù)活”缺失的依賴?此時(shí),如何快速將本地倉(cāng)庫(kù)中的 jar 包重新發(fā)布到私服,成為恢復(fù)構(gòu)建環(huán)境的關(guān)鍵。本文將詳細(xì)介紹如何使用 mvn deploy:deploy-file 命令將本地倉(cāng)庫(kù)中的 jar 包發(fā)布到私服,并分享在此過(guò)程中可能遇到的問(wèn)題及其解決方案,幫助開(kāi)發(fā)者高效解決類似問(wèn)題。
二、環(huán)境
- Nexus Repository Manager OSS 2.15.1-02
- Apache Maven 3.3.9
- Java version: 17.0.9
- win 10
三、配置nexus上傳賬號(hào)
配置 maven 的 settings.xml 文件,在配置文件中添加2個(gè) server節(jié)點(diǎn),并輸入 nexus 的用戶名和密碼。配置中的id要記住命令中需要使用。
<servers> <server> <id>snapshots</id> <username>admin</username> <password>******</password> </server> <server> <id>release</id> <username>admin</username> <password>******</password> </server> </servers>
四、執(zhí)行deploy命令上傳包
以下命令都是基于cmd,方便查看都用了^將命令分為多行。mvn配置不光在maven安裝目錄下,還有用戶的環(huán)境配置。
執(zhí)行命令前避免其它配置干擾,最好把只保留maven目錄下的配置。
- 檢查環(huán)境可以執(zhí)行 mvn -X命令,看看加載了那些配置。
- 查看有效配置可以執(zhí)行 mvn help:effective-settings命令
1. 首先需要把本地倉(cāng)中要上傳到j(luò)ar、pom復(fù)制到其它目錄中
cd /d D:\temp\maven\
2. 確定待上傳包版本
上傳的包版本決定,上傳路徑和使用repoitoryId值。-Durl參數(shù)的實(shí)際路徑需要在私服中自己找~~~,配置錯(cuò)了就各種錯(cuò)?。。?br />-DrepositoryId參數(shù)值需要和settings.xml的server id節(jié)點(diǎn)值一至。
SNAPSHOT包參數(shù)
- 包名有snapshot關(guān)鍵字,如:mydtemo-0.0.1-SNAPSHOT.jar需要使用以下參數(shù)值
- -Durl=https://nexus.demo.com/nexus/content/repositories/snapshots/
- -DrepositoryId=snapshots
release包參數(shù)
- 沒(méi)有有snapshot關(guān)鍵字的為release包,如:mydtemo-0.0.1.jar需要使用以下參數(shù)值
- -Durl=https://nexus.demo.com/nexus/content/repositories/releases/
- -DrepositoryId=releases
3. 執(zhí)行上傳命令
待上傳的jar包如果有對(duì)應(yīng)pom文件,pom中的maven坐標(biāo)沒(méi)有引用變量時(shí),比較省事指定一個(gè)-DpomFile就可以了
# 指定pomFile參數(shù)時(shí),不需要填寫groupId、artifactId、version三個(gè)參數(shù) mvn -e deploy:deploy-file ^ -Dfile=./mydtemo-2025.3.7.jar ^ -DpomFile=./mydtemo-2025.3.7.pom ^ -Dpackaging=jar ^ -Durl=https://nexus.demo.com/nexus/content/repositories/releases/ ^ -DrepositoryId=releases
如果沒(méi)有pom文件就需要手動(dòng)指定maven坐標(biāo),仔細(xì)點(diǎn)兒否則容易出錯(cuò),導(dǎo)致拉取依賴找不到包。
# 無(wú)pom文件時(shí),需要填寫groupId、artifactId、version三個(gè)參數(shù) mvn -e deploy:deploy-file ^ -Dfile=./mydtemo-2025.3.7.jar ^ -DgroupId=com.mydemo.test ^ -DartifactId=mydtemo ^ -Dversion=2025.3.7 ^ -Dpackaging=jar ^ -Durl=https://nexus.demo.com/nexus/content/repositories/releases/ ^ -DrepositoryId=releases
如果是snapshot包,參數(shù)稍微有點(diǎn)兒區(qū)別。這里還有個(gè)場(chǎng)景就是指定-Dclassifier參數(shù),在 Maven 中,classifier 屬性用于區(qū)分同一 artifact 的不同版本或變種。通常,一個(gè) artifact 由 groupId、artifactId 和 version 三個(gè)基本元素確定。然而,在某些情況下,我們可能需要為同一個(gè) artifact 創(chuàng)建多個(gè)不同的版本或變種,比如源代碼包、文檔包或特定平臺(tái)的二進(jìn)制包等。
# 指定classifier參數(shù),向snapshot倉(cāng)發(fā)布jar包 mvn -e deploy:deploy-file ^ -Dfile=./mydtemo-spring-1.0.11-SNAPSHOT-dto.jar ^ -DgroupId=com.mydemo.test ^ -DartifactId=mydtemo ^ -Dversion=spring-1.0.11-SNAPSHOT ^ -Dclassifier=dto ^ -Dpackaging=jar ^ -Durl=https://nexus.demo.com/nexus/content/repositories/snapshots/ ^ -DrepositoryId=nexus-snapshots
如果只是上傳pom文件,file參數(shù)也需要指定。
cd /d D:\temp\maven\ # 只上傳pom文件 mvn -e deploy:deploy-file ^ -Dfile=./mydemo-1.2.0.pom ^ -DpomFile=./mydemo-1.2.0.pom ^ -Durl=https://nexus.demo.com/nexus/content/repositories/releases/ ^ -DrepositoryId=releases
五、執(zhí)行dependency命令測(cè)試下載依賴
上面如果順利的話,已經(jīng)上傳到私服了,下面測(cè)試下拉取依賴,當(dāng)然在idea中也可測(cè)試。
命令格式
mvn -e dependency:get ^ -Dartifact=mydtemo:com.mydemo.test:jar:2025.3.7
也可以指定配置文件,來(lái)取其它倉(cāng)的依賴。
# 指定配置文件拉取 mvn dependency:get ^ -Dartifact=mydemo:mydemo:pom:1.2.0 ^ -s D:\maven\apache-maven-3.3.9\conf\settings.xml
如果懶得去本地倉(cāng)中翻找,可以指定下載地址,測(cè)試時(shí)打開(kāi)一個(gè)目錄就可以了。
# 指定下載目錄(先下載到本倉(cāng)之后在copy到-Ddest指定的目錄中) mvn -e -X dependency:get ^ -Dartifact=com.mydemo.test:mydtemo:2025.3.7 ^ -DrepoUrl=https://nexus.demo.com/nexus/content/repositories/releases/ ^ -Ddest=E:\downloads\mvn-test
六、命令解釋
命令解釋:mvn deploy:deploy-file
mvn deploy:deploy-file
是 Maven 提供的一個(gè)命令,用于將本地文件(如 jar 包或 pom 文件)直接上傳到 Maven 私服(如 Nexus 或 Artifactory)。以下是該命令的詳細(xì)參數(shù)說(shuō)明:
1. 命令名
mvn deploy:deploy-file
這是 Maven 的命令名稱,用于將本地文件上傳到遠(yuǎn)程倉(cāng)庫(kù)。
2. -Dfile=
作用:指定要上傳的 jar 文件路徑。
說(shuō)明:
- 路徑可以是絕對(duì)路徑或相對(duì)路徑。
- 建議將要上傳的 jar 包放在一個(gè)簡(jiǎn)單的目錄下,避免路徑過(guò)長(zhǎng)或復(fù)雜。
示例:
-Dfile=target/my-artifact-1.0.0.jar
3. -DpomFile=
作用:指定與 jar 包對(duì)應(yīng)的 pom 文件路徑。
說(shuō)明:
- 如果上傳的是 jar 包,必須同時(shí)指定
-Dfile
和-DpomFile
。 - 如果只上傳 pom 文件,只需指定
-DpomFile
。
示例:
-DpomFile=pom.xml
4. -Dpackaging=
作用:指定要上傳的文件類型。
說(shuō)明:
- 常見(jiàn)的類型包括
jar
和pom
。 - 上傳 jar 包時(shí),類型為
jar
;上傳 pom 文件時(shí),類型為pom
。
示例:
-Dpackaging=jar
5. -Durl=
作用:指定要上傳的 Nexus 倉(cāng)庫(kù)地址。
說(shuō)明:
- Snapshots 版本的 jar 包必須上傳到 Snapshots 倉(cāng)庫(kù)。
- Releases 版本的 jar 包必須上傳到 Releases 倉(cāng)庫(kù)。
- 如果類型不匹配(例如將 Releases 包上傳到 Snapshots 倉(cāng)庫(kù)),會(huì)報(bào)
status code 400
異常。
示例:
-Durl=http://nexus.example.com/repository/maven-releases/
6. -DrepositoryId=
作用:指定使用的倉(cāng)庫(kù) ID。
說(shuō)明:
- 該 ID 必須與
settings.xml
文件中的<server>
配置的id
一致。 - 如果匹配不到 ID,會(huì)報(bào)
status code 405
異常。
示例:
-DrepositoryId=my-nexus-repo
7. 自動(dòng)解析 pom 文件
說(shuō)明:
- 上傳成功后,Maven 會(huì)解析 pom 文件,自動(dòng)識(shí)別 jar 包的存儲(chǔ)路徑。
- 確保 pom 文件中的
groupId
、artifactId
和version
信息正確,否則可能導(dǎo)致上傳失敗或路徑錯(cuò)誤。
完整示例命令
以下是一個(gè)完整的示例命令,將本地 jar 包和 pom 文件上傳到 Nexus 私服:
mvn deploy:deploy-file \ -Dfile=target/my-artifact-1.0.0.jar \ -DpomFile=pom.xml \ -Dpackaging=jar \ -Durl=http://nexus.example.com/repository/maven-releases/ \ -DrepositoryId=my-nexus-repo
七、常見(jiàn)問(wèn)題及解決方案
1. status code 400 異常
原因:上傳的 jar 包類型與倉(cāng)庫(kù)類型不匹配(例如將 Releases 包上傳到 Snapshots 倉(cāng)庫(kù))。
解決:檢查 -Durl
參數(shù),確保上傳到正確的倉(cāng)庫(kù)。
詳情:
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-deploy-plugin:2.7:deploy-file (default-cli) on project standalone-pom: Failed to deploy artifacts: Could not transfer artifact com.mydemo.test:**mydemo:jar:2025.3.7 from/to releases (https://com.mydemo.test/nexus/content/repositories/public/): Failed to transfer file: https://com.mydemo.test/nexus/content/repositories/public/com/com/mydemo/**mydemo/2025.3.7/**mydemo-2025.3.7.jar. Return code is: 400, ReasonPhrase: Bad Request.
2. status code 405 異常
- 原因:
-DrepositoryId
與settings.xml
中的<server>
配置不匹配。 - 解決:檢查
settings.xml
文件,確保id
一致。
詳情:
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-deploy-plugin:2.7:deploy-file (default-cli) on project standalone-pom: Failed to deploy artifacts: Could not transfer artifact com.mydemo.test:**mydemo:jar:2025.3.7 from/to releasesx (https://com.mydemo.test/nexus/content/repositories/releases/): Failed to transfer file: https://com.mydemo.test/..../....jar. Return code is: 401, ReasonPhrase: Unauthorized.
3. Could not find artifact 異常
- 原因:pom 文件中的
groupId
、artifactId
或version
信息錯(cuò)誤。 - 解決:檢查 pom 文件,確保坐標(biāo)信息正確。
4. Return code is: 401權(quán)限問(wèn)題
原因:上傳倉(cāng)庫(kù)需要認(rèn)證,但未配置正確的用戶名和密碼。
解決:在 settings.xml
中配置 <server>
的認(rèn)證信息。
錯(cuò)誤詳情:
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-deploy-plugin:2.7:deploy-file (default-cli) on project standalone-pom: Failed to deploy artifacts: Could not transfer artifact com.mydemo.test:**mydemo:jar:2025.3.7 from/to releases (https://com.mydemo.test/nexus/content/repositories/releases/): Failed to transfer file: https://com.mydemo.test/..../....jar. Return code is: 401, ReasonPhrase: Unauthorized.
5. 不能從本地倉(cāng)直接上傳
需要把本地倉(cāng)的jar包復(fù)制到其它目錄。
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-deploy-plugin:2.7:deploy-file (default-cli) on project standalone-pom: Cannot deploy artifact from the local repository: D:\java\maven\maven_repo\com\mydemo\test\**mydemo\2025.3.7\**mydemo-2025.3.7.jar
總結(jié)
mvn deploy:deploy-file
是將本地 jar 包或 pom 文件上傳到 Maven 私服的重要命令。通過(guò)正確配置 -Dfile
、-DpomFile
、-Durl
和 -DrepositoryId
等參數(shù),可以高效完成上傳任務(wù)。同時(shí),注意倉(cāng)庫(kù)類型、權(quán)限和 pom 文件信息的正確性,避免常見(jiàn)錯(cuò)誤。有時(shí)候maven版本高或者第也會(huì)導(dǎo)致上傳失敗。
到此這篇關(guān)于使用mvn deploy命令上傳jar包的文章就介紹到這了,更多相關(guān)mvn deploy上傳jar包內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java List移除相應(yīng)元素的超簡(jiǎn)潔寫法分享
這篇文章主要介紹了Java List移除相應(yīng)元素的超簡(jiǎn)潔寫法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-11-11Java實(shí)現(xiàn)將png格式圖片轉(zhuǎn)換成jpg格式圖片的方法【測(cè)試可用】
這篇文章主要介紹了Java實(shí)現(xiàn)將png格式圖片轉(zhuǎn)換成jpg格式圖片的方法,涉及java文件讀寫及圖形創(chuàng)建等相關(guān)操作技巧,需要的朋友可以參考下2018-03-03Springboot使用redisson?+?自定義注解實(shí)現(xiàn)消息的發(fā)布訂閱(解決方案)
Redisson是一個(gè)基于Redis的Java駐留內(nèi)存數(shù)據(jù)網(wǎng)格(In-Memory?Data?Grid)和分布式鎖框架,它提供了一系列的分布式Java對(duì)象和服務(wù),可以幫助開(kāi)發(fā)者更方便地使用Redis作為數(shù)據(jù)存儲(chǔ)和分布式鎖的解決方案,感興趣的朋友跟隨小編一起看看吧2024-05-05Spring Boot 中application.yml與bootstrap.yml的區(qū)別
其實(shí)yml和properties文件是一樣的原理,且一個(gè)項(xiàng)目上要么yml或者properties,二選一的存在。這篇文章給大家介紹了Spring Boot 中application.yml與bootstrap.yml的區(qū)別,感興趣的朋友一起看看吧2018-04-04淺談Java中ThreadLocal引發(fā)的內(nèi)存泄漏
本文主要介紹了淺談Java中ThreadLocal引發(fā)的內(nèi)存泄漏,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-06-06淺析Spring boot 中 logback 配置<springPropert
這篇文章主要介紹了淺析Spring boot 中 logback 配置<springProperty> 讀取application.properties 中的屬性,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-02-02