如果僅僅是為了代理遠(yuǎn)程的公共倉庫,那么 Nexus 的代理倉庫就完全能夠滿足需要,但是我們知道,Nexus 除了代理倉庫外,還有另一種倉庫:宿主倉庫。
宿主倉庫的主要作用是存儲(chǔ)公司或組織內(nèi)部的構(gòu)件,以及一些無法從公共倉庫獲取的第三方構(gòu)件(JDBC 驅(qū)動(dòng)),供用戶下載使用。用戶可以通過配置 Maven 將構(gòu)件自動(dòng)部署到 Nexus 宿主倉庫,也可以在 Nexus 界面手動(dòng)上傳構(gòu)件。
日常開發(fā)中,快照版本構(gòu)件可以直接部署到 Nexus 中策略為 Snapshot 的宿主倉庫中,而最終發(fā)布的版本則應(yīng)該部署到 Nexus 中策略為 Release 的宿主倉庫中。
使用 Maven 將構(gòu)件部署到 Nexus 宿主倉庫中主要分為 3 步:
配置項(xiàng)目的 POM 文件。
在 setting.xml 中配置認(rèn)證信息。
使用 mvn 命令部署構(gòu)件。
下面我們通過一個(gè)實(shí)例來詳細(xì)介紹如何使用 Maven 部署構(gòu)件到 Nexus 宿主倉庫。
下面我們通過一個(gè)實(shí)例來詳細(xì)介紹如何使用 Maven 部署構(gòu)件到 Nexus 宿主倉庫。
創(chuàng)建一個(gè)名為 test-upload-snapshot 的 Maven 項(xiàng)目,并在其 POM 文件中添加如下配置。
<project> ... <distributionManagement> <repository> <id>bianchengbang_Release_hosted</id> <url>http://localhost:8082/nexus/content/repositories/bianchengbang_Release_hosted/</url> </repository> <snapshotRepository> <id>bianchengbang_Snapshot_hosted</id> <url>http://localhost:8082/nexus/content/repositories/bianchengbang_Snapshot_hosted/</url> </snapshotRepository> </distributionManagement> </project>
以上配置說明如下:
distributionManagement 元素:負(fù)責(zé)將指定的構(gòu)件部署到 Nexus 指定的倉庫中。
repository 元素:distributionManagement 的子元素,用于定義部署 Release 版本的構(gòu)件被部署的倉庫。它有 2 子元素:id 和 url ,其中 id 為 Nexus 倉庫的唯一標(biāo)識(shí),url 為 Nexus 宿主倉庫的 url。
snapshotRepository 元素:distributionManagement 的子元素,用于定義部署 Snapshot 版本的構(gòu)件被部署的倉庫。它也有 2 子元素:id 和 url ,且與 repository 中含義一致。
最初版本的 Nexus 沒有為宿主倉庫提供任何的安全措施。如果宿主倉庫開啟了部署功能,任何人可以連接并部署構(gòu)件至這個(gè)倉庫,這顯然是極不安全的。因此,現(xiàn)在的 Nexus 中增加了權(quán)限認(rèn)證,Nexus 對(duì)于匿名用戶是只讀的,若想部署構(gòu)件到 Nexus 中,則需要在 setting.xml 中配置如下認(rèn)證信息。
<settings> ... <servers> <server> <id>bianchengbang_Release_hosted</id> <username>admin</username> <password>admin123</password> </server> <server> <id>bianchengbang_Snapshot_hosted</id> <username>admin</username> <password>admin123</password> </server> </servers> </settings>
注意:以上配置中,server 元素中的 id 必須和 pom.xml 中 distributionManagement 元素對(duì)應(yīng)倉庫的 id 保持一致。Maven 在部署構(gòu)件時(shí),會(huì)先根據(jù) id 查找用戶名稱和密碼進(jìn)行認(rèn)證和登錄,然后將構(gòu)件部署到對(duì)應(yīng)得宿主倉庫。
完成以上配置之后,就可以使用 Maven 命令將構(gòu)件部署到宿主倉庫了,操作步驟如下。
1)打開命令行窗口,跳轉(zhuǎn)到 test-upload-snapshot 項(xiàng)目得目錄下,執(zhí)行如下 Maven 命令。
mvn clean deploy
2) Maven 命令執(zhí)行結(jié)果如下圖。
[INFO] Scanning for projects... [INFO] [INFO] ---------------< net.biancheng.www:test-upload-snapshot >--------------- [INFO] Building test-upload-snapshot 0.0.1-SNAPSHOT [INFO] --------------------------------[ jar ]--------------------------------- [INFO] [INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ test-upload-snapshot --- [INFO] Deleting D:\eclipse workSpace 3\test-upload-snapshot\target [INFO] [INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ test-upload-snapshot --- [INFO] Using 'UTF-8' encoding to copy filtered resources. [INFO] Copying 0 resource [INFO] [INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ test-upload-snapshot --- [INFO] Nothing to compile - all classes are up to date [INFO] [INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ test-upload-snapshot --- [INFO] Using 'UTF-8' encoding to copy filtered resources. [INFO] Copying 0 resource [INFO] [INFO] --- maven-compiler-plugin:3.1:testCompile (default-testCompile) @ test-upload-snapshot --- [INFO] Nothing to compile - all classes are up to date [INFO] [INFO] --- maven-surefire-plugin:2.12.4:test (default-test) @ test-upload-snapshot --- [INFO] [INFO] --- maven-jar-plugin:2.4:jar (default-jar) @ test-upload-snapshot --- [INFO] Building jar: D:\eclipse workSpace 3\test-upload-snapshot\target\test-upload-snapshot-0.0.1-SNAPSHOT.jar [INFO] [INFO] --- maven-install-plugin:2.4:install (default-install) @ test-upload-snapshot --- [INFO] Installing D:\eclipse workSpace 3\test-upload-snapshot\target\test-upload-snapshot-0.0.1-SNAPSHOT.jar to D:\myRep ository\repository\net\biancheng\www\test-upload-snapshot\0.0.1-SNAPSHOT\test-upload-snapshot-0.0.1-SNAPSHOT.jar [INFO] Installing D:\eclipse workSpace 3\test-upload-snapshot\pom.xml to D:\myRepository\repository\net\biancheng\www\te st-upload-snapshot\0.0.1-SNAPSHOT\test-upload-snapshot-0.0.1-SNAPSHOT.pom [INFO] [INFO] --- maven-deploy-plugin:2.7:deploy (default-deploy) @ test-upload-snapshot --- Downloading from bianchengbang_Snapshot_hosted: http://localhost:8082/nexus/content/repositories/bianchengbang_Snapshot_ hosted/net/biancheng/www/test-upload-snapshot/0.0.1-SNAPSHOT/maven-metadata.xml Downloaded from bianchengbang_Snapshot_hosted: http://localhost:8082/nexus/content/repositories/bianchengbang_Snapshot_h osted/net/biancheng/www/test-upload-snapshot/0.0.1-SNAPSHOT/maven-metadata.xml (787 B at 9.2 kB/s) Uploading to bianchengbang_Snapshot_hosted: http://localhost:8082/nexus/content/repositories/bianchengbang_Snapshot_host ed/net/biancheng/www/test-upload-snapshot/0.0.1-SNAPSHOT/test-upload-snapshot-0.0.1-20210322.030343-5.jar Uploaded to bianchengbang_Snapshot_hosted: http://localhost:8082/nexus/content/repositories/bianchengbang_Snapshot_hoste d/net/biancheng/www/test-upload-snapshot/0.0.1-SNAPSHOT/test-upload-snapshot-0.0.1-20210322.030343-5.jar (2.1 kB at 28 k B/s) Uploading to bianchengbang_Snapshot_hosted: http://localhost:8082/nexus/content/repositories/bianchengbang_Snapshot_host ed/net/biancheng/www/test-upload-snapshot/0.0.1-SNAPSHOT/test-upload-snapshot-0.0.1-20210322.030343-5.pom Uploaded to bianchengbang_Snapshot_hosted: http://localhost:8082/nexus/content/repositories/bianchengbang_Snapshot_hoste d/net/biancheng/www/test-upload-snapshot/0.0.1-SNAPSHOT/test-upload-snapshot-0.0.1-20210322.030343-5.pom (2.4 kB at 36 k B/s) Downloading from bianchengbang_Snapshot_hosted: http://localhost:8082/nexus/content/repositories/bianchengbang_Snapshot_ hosted/net/biancheng/www/test-upload-snapshot/maven-metadata.xml Downloaded from bianchengbang_Snapshot_hosted: http://localhost:8082/nexus/content/repositories/bianchengbang_Snapshot_h osted/net/biancheng/www/test-upload-snapshot/maven-metadata.xml (297 B at 11 kB/s) Uploading to bianchengbang_Snapshot_hosted: http://localhost:8082/nexus/content/repositories/bianchengbang_Snapshot_host ed/net/biancheng/www/test-upload-snapshot/0.0.1-SNAPSHOT/maven-metadata.xml Uploaded to bianchengbang_Snapshot_hosted: http://localhost:8082/nexus/content/repositories/bianchengbang_Snapshot_hoste d/net/biancheng/www/test-upload-snapshot/0.0.1-SNAPSHOT/maven-metadata.xml (787 B at 14 kB/s) Uploading to bianchengbang_Snapshot_hosted: http://localhost:8082/nexus/content/repositories/bianchengbang_Snapshot_host ed/net/biancheng/www/test-upload-snapshot/maven-metadata.xml Uploaded to bianchengbang_Snapshot_hosted: http://localhost:8082/nexus/content/repositories/bianchengbang_Snapshot_hoste d/net/biancheng/www/test-upload-snapshot/maven-metadata.xml (297 B at 5.2 kB/s) [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 2.342 s [INFO] Finished at: 2021-03-22T11:03:44+08:00 [INFO] ------------------------------------------------------------------------
在 Nexus 界面的倉庫列表選中 bianchengbang_Snapshot_hosted 宿主倉庫,在下方的 Browse Index 選項(xiàng)卡中,可以看到 test-upload-snapshot 構(gòu)件已經(jīng)被部署到該倉庫中,如圖 1 所示。
有些 Jar 文件(如 Oracle 的 JDBC 驅(qū)動(dòng))由于許可證等原因,無法存放在公開倉庫中。此外,還有一些小型的開源項(xiàng)目,它們沒有將自己的構(gòu)件分發(fā)到公共倉庫中,也沒有維護(hù)自己的倉庫,因此這些構(gòu)件是無法從公共倉庫中獲得的。若 Maven 項(xiàng)目中需要這類構(gòu)件,我們就需要將構(gòu)件下載到本地,然后手動(dòng)上傳到 Nexus 私服。
我們還是以 Maven 項(xiàng)目 App-Core-lib 為例,將其打包后手動(dòng)上傳到 Nexus 內(nèi)置宿主倉庫 3rd party 中,具體步驟如下。
1. 打開命令行窗口,跳轉(zhuǎn)到 App-Core-lib 的目錄下,執(zhí)行如下 mvn 命令,對(duì)項(xiàng)目進(jìn)行打包。
mvn clean package
2.打包完成后,進(jìn)入 App-Core-lib\target 目錄,可以看到 Maven 已經(jīng)將該項(xiàng)目打包成了一個(gè) jar 文件,如圖 2 所示。
3. 在 Nexus 界面的倉庫列表中選擇 3rd party 倉庫,在下方選擇 Artifact Upload 選項(xiàng)卡,其中 GAV Definition 用于定義上傳構(gòu)件的坐標(biāo)信息。
GAV Definition 中提供了兩種定義構(gòu)件坐標(biāo)的方式:
若該構(gòu)件通過 Maven 構(gòu)建產(chǎn)生的,則可以選擇 From POM,Nexus 會(huì)自動(dòng)從 POM 中獲取構(gòu)件的坐標(biāo)。
若該構(gòu)件來自第三方,則只能選擇 GAV Parameters,手動(dòng)定義構(gòu)件的坐標(biāo)。
以上 2 種方式操作時(shí)會(huì)略有不同,下面我們分別對(duì)它們進(jìn)行介紹。
若該構(gòu)件是通過 Maven 構(gòu)建產(chǎn)生的,那么可以在 GAV Definition 下拉列表中,選擇 From POM,然后指定該構(gòu)件所屬項(xiàng)目的 pom.xml,Nexus 會(huì)自動(dòng)從 pom.xml 中獲取構(gòu)件的坐標(biāo)。最后點(diǎn)擊頁面最下方的 Upload Artifact(s) 按鈕,將構(gòu)件上傳到倉庫中,如圖 3 所示。
若構(gòu)件不是通過 Maven 構(gòu)建的,而是來自第三方(例如 Oracle 的 JDBC 驅(qū)動(dòng)),則只能在 GAV Definition 下拉列表中,選擇 GAV Parameters 手動(dòng)定義構(gòu)件的坐標(biāo)。
GAV Definition 中提供了兩種定義構(gòu)件坐標(biāo)的方式:
定義好坐標(biāo)后,點(diǎn)擊 Select Artifact(s) to Upload... 按鈕選擇要上傳的構(gòu)件,然后點(diǎn)擊 Add Artifact 按鈕將其加入上傳列表中。最后點(diǎn)擊頁面最下方的 Upload Artifact(s) 按鈕,將構(gòu)件上傳到倉庫中,如圖 4 所示。
4. 在倉庫列表中選中 3rd party 宿主倉庫,在下方的 Browse Index 選項(xiàng)卡中,可以看到構(gòu)件已經(jīng)被部署到該倉庫中,如圖 5 所示。