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