npm 和 maven 使用 Nexus3 私服 | 前後端一起學
前文《Docker 搭建 Nexus3 私服 》介紹了在 docker 環境下安裝 nexus3 以及 nexus3 的基本操作和管理,本文分別介紹 npm(前端)和 maven(後端)如何使用 nexus3 作為私服。文中的 demo 可以在 github 上搜索 youyage_nexus3_demos
獲取。
本篇內容分為上下兩個部分,上篇是npm使用 Nexus3 私服,下篇是maven 使用 Nexus3 私服。
1 npm 中使用 Nexus3
這裡以一個 JS 庫為例來說明前端公共庫如何發佈到 Nexus3 私服。Vue或其他組件庫的發佈也是一樣的操作,只是打包等發佈前的操作不同。本文中所有的 demo 都放在 youyage_nexus3_demo
中
1.1 JavaScript 庫開發
1) 創建 JS 庫項目目錄: js-demo-lib
;
2)使用 npm
或 yarn
等包管理工具初始化項目:
yarn init
3)由於咱們重點是演示 nexus3 發佈 JS 庫,故 webpack 打包等操作咱們都略過。修改 package.json,指定 type
屬性值為 module
:
{
"name": "js-demo-lib",
"version": "1.0.1",
"type": "module",
"main": "index.js",
"license": "MIT",
"author": {
"name": "youyage",
"email": "[email protected]"
}
}
4)在項目根目錄下創建入口文件 index.js:
export const testMsg = (str) => {
return `hello ${str}`
}
export default {
testMsg
}
該文件中就只提供了一個 testMsg 方法。
1.2 創建 Nexus3 前端倉庫
1)創建倉庫,倉庫類型選擇 npm(hosted)
,Name 填寫 demo-npm-hosted
,點擊頁面底部的 Create repository
按鈕創建倉庫;
2)創建倉庫,倉庫類型選擇 npm(proxy)
,Name 填寫 demo-npm-proxy
Remote storage 即遠程倉庫的地址,可以填 npm 官方的地址,也可填寫淘寶鏡像或其他地址,這裡我填寫官方地址://registry.npmjs.org
,點擊頁面底部的 Create repository
按鈕創建倉庫;
3)創建倉庫,倉庫類型選擇 npm(group)
,Name 填寫 demo-npm-group
,在下面的 Group 中將左側兩個剛創建的倉庫移動到右邊:
點擊頁面底部的 Create repository
按鈕創建倉庫。
通過上面的三個步驟,便創建了npm的三種類型的倉庫。
點擊 demo-npm-group
後面的 copy
按鈕可以查看並複製私服地址:
1.3 JS 庫發佈到 Nexus3 私服倉庫
要發佈 JS 庫,需要先通過 npm 指定 Registry 登錄。Registry 為私服 hosted 倉庫的地址:
//localhost:8081/repository/demo-npm-hosted/
在命令行中使用 npm 登錄 nexus3 私服:
npm login --registry //localhost:8081/repository/demo-npm-hosted/
依次填寫上文創建的用戶的用戶名 username、密碼 password、郵箱 email:
401 錯誤處理
如果登錄失敗,出現 401 錯誤:
在確保用戶名、密碼、郵箱都正確的前提下,可以採用下面的方式進行處理:
打開系統當前用戶主目錄中的.npmrc
文件:
vi /Users/liuyun/.npmrc
刪除該文件中對應私服地址的 authToken,如下圖,刪除該行,然後重新登錄。
登錄成功後會提示:
npm notice Log in on //localhost:8081/repository/demo-npm-hosted/
發佈 JS 庫:
npm publish --registry //localhost:8081/repository/demo-npm-hosted/
如果發佈時提示 401,可按照上述登錄 401 進行檢查;如果還是失敗,則檢查 nexus3 的 Realms 設置,查看 npm Bearer Token Realm
是否激活。
JS 庫發佈成功,可以在 Nexus 中看到:
1.4 應用通過 Nexus3 使用 JS 庫
1) 創建 JS 庫項目目錄: js-demo-app
;
2)使用 npm
或 yarn
等包管理工具初始化項目:
yarn init
3)使用 yarn 添加依賴:上面發佈的 JS 庫 js-demo-lib:
yarn add js-demo-lib --registry //localhost:8081/repository/demo-npm-group/
4)修改 package.json,指定 type
屬性值為 module
5)在項目根目錄下創建入口文件 index.js:
import lib from 'js-demo-lib'
console.log(lib.testMsg('程序員優雅哥'))
該文件中引入 JS 庫,並調用 JS 庫的 testMsg 方法。
6)在控制台中測試運行:
node ./index.js
控制台中輸出:
hello 程序員優雅哥
如果 JS 庫升級了,可以使用如下命令在應用端升級:
yarn upgrade js-demo-lib --registry //localhost:8081/repository/demo-npm-group/
1.5 命令總結
npm 登錄私服使用 hosted 地址:
npm login --registry //localhost:8081/repository/demo-npm-hosted/
npm 發佈使用 hosted 地址:
npm publish --registry //localhost:8081/repository/demo-npm-hosted/
npm 添加 / 更新私服上的包,使用 group 地址:
yarn add js-demo-lib --registry //localhost:8081/repository/demo-npm-group/
yarn upgrade js-demo-lib --registry //localhost:8081/repository/demo-npm-group/
2 Maven 中使用 Nexus3
2.1 Nexus3 Maven 倉庫
安裝好 nexus3 後,默認有四個 maven 倉庫:
maven-central:類型為 proxy,對中央倉庫的代理,默認配置了
//repo1.maven.org/maven2/
,可以將其修改為阿里雲鏡像://maven.aliyun.com/nexus/content/groups/public/
maven-release:類型為 hosted,開發人員部署自己的 release 版本 jar 包的宿主倉庫
maven-snapshots:類型為 hosted,開發人員部署自己的 snapshots 版本 jar 包的宿主倉庫
maven-public:類型為 group,組倉庫,聚合了上面三者。
可以按照這四者進行創建,也可以直接使用。這裡就直接使用這四個倉庫了。
2.2 配置 Maven
打開 maven 的配置文件 settings.xml
,如果只是從 nexus3 拉取包,則只需要配置鏡像(mirror)即可;如果要發佈包到 nexus3 上,除了配置鏡像 mirror,還需要配置 server。
- 鏡像配置(group類型 – maven-public 的地址)
<mirrors>
<mirror>
<id>nexus3-maven-public</id>
<mirrorOf>central</mirrorOf>
<name>Nexus3 Maven Public</name>
<url>//localhost:8081/repository/maven-public/</url>
</mirror>
</mirrors>
- 配置 server
<servers>
<server>
<id>nexus3-releases</id>
<username>youyage</username>
<password>111111</password>
</server>
<server>
<id>nexus3-snapshots</id>
<username>youyage</username>
<password>111111</password>
</server>
</servers>
server
中的 username 和 password 就是 上文在 nexus3 中創建的用戶的 id 和 password。
2.3 Java 包發佈到 Nexus3 私服倉庫
現在創建一個 Maven 項目,將其發佈到 Nexus3 中。
1)新建 Maven 項目,項目名為:java-demo-lib
2)pom.xml 如下:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="//maven.apache.org/POM/4.0.0"
xmlns:xsi="//www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="//maven.apache.org/POM/4.0.0 //maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.yygnb.demo.lib</groupId>
<artifactId>java-demo-lib</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
<distributionManagement>
<repository>
<id>nexus3-releases</id>
<name>nexus3-releases</name>
<url>//localhost:8081/repository/maven-releases/</url>
</repository>
<snapshotRepository>
<id>nexus3-snapshots</id>
<name>nexus3-snapshots</name>
<url>//localhost:8081/repository/maven-snapshots/</url>
</snapshotRepository>
</distributionManagement>
</project>
由於需要將該項目發佈到 Nexus3 中,故需要在 distributionManagement
節點中配置 repository
。repository
中需配置三個子節點:
id
:與 settings.xml 中配置的server
中的id
一致;name
:無特殊要求url
:type 為 hosted 的 maven 倉庫。由於 hosted 類型的倉庫分為 release 和 snapshots,故兩個地址分別對應 maven-snapshots 和 maven-release 的地址。
3)編寫 DemoUtils:
package com.yygnb.demo.lib;
public class DemoUtils {
public static String test(String str) {
return "snapshot - Hello " + str;
}
}
發佈 snapshots 包:
由於現在 pom.xml 中 version
為:1.0-SNAPSHOT
,將其發佈到 maven-snapshots 中。執行
mvn clean deploy
執行成功如下:
在 nexus3 頁面上也可以看到在 maven-snapshots 倉庫中有這個包:
發佈 release 包:
為了方便後面看效果,此處將DemeUtils 中 test 方法返回值修改為:
return "release - Hello " + str;
將 pom.xml 中 version
修改為 1.0:
<version>1.0</version>
再次執行 mvn clean deploy
。執行成功後,可以在 maven-release 倉庫中看到這個包:
如此一來,release 和 snapshots 都成功發佈到 nexus3 的 hosted 倉庫中了。
2.4 應用通過 Nexus3 使用 Java 通用包
最後創建一個項目,分別測試拉取上面發佈的 snapshots 和 release 包。
創建 Maven 項目,項目名為 java-demo-app
。在 pom.xml 中添加repository,指定 nexus3 的 maven-public 地址:
<repositories>
<repository>
<id>nexus3-maven-public</id>
<name>nexus3-maven-public</name>
<url>//localhost:8081/repository/maven-public/</url>
<snapshots>
<enabled>true</enabled>
</snapshots>
<releases>
<enabled>true</enabled>
</releases>
</repository>
</repositories>
添加上面 java-demo-lib snapshot 依賴:
<dependencies>
<dependency>
<groupId>com.yygnb.demo.lib</groupId>
<artifactId>java-demo-lib</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
刷新 Maven,可以看到從 nexus3 中拉取了該依賴。
寫個 main 方法測試:
package com.yygnb.demo.app;
import com.yygnb.demo.lib.DemoUtils;
public class MainDemo {
public static void main(String[] args) {
System.out.println(DemoUtils.test("程序員優雅哥"));
}
}
執行該方法,控制台輸出:
snapshot - Hello 程序員優雅哥
先將依賴版本修改為 1.0,即:
<dependencies>
<dependency>
<groupId>com.yygnb.demo.lib</groupId>
<artifactId>java-demo-lib</artifactId>
<version>1.0</version>
</dependency>
</dependencies>
刷新 Maven,重新執行 main 方法,控制台輸出:
release - Hello 程序員優雅哥
2.5 配置總結
1) settings.xml
...
<mirrors>
<mirror>
<id>nexus3-maven-public</id>
<mirrorOf>central</mirrorOf>
<name>Nexus3 Maven Public</name>
<url>//localhost:8081/repository/maven-public/</url>
</mirror>
</mirrors>
<servers>
<server>
<id>nexus3-releases</id>
<username>youyage</username>
<password>111111</password>
</server>
<server>
<id>nexus3-snapshots</id>
<username>youyage</username>
<password>111111</password>
</server>
</servers>
...
2)pom.xml
...
<repositories>
<repository>
<id>nexus3-maven-public</id>
<name>nexus3-maven-public</name>
<url>//localhost:8081/repository/maven-public/</url>
<snapshots>
<enabled>true</enabled>
</snapshots>
<releases>
<enabled>true</enabled>
</releases>
</repository>
</repositories>
<distributionManagement>
<repository>
<id>nexus3-releases</id>
<name>nexus3-releases</name>
<url>//localhost:8081/repository/maven-releases/</url>
</repository>
<snapshotRepository>
<id>nexus3-snapshots</id>
<name>nexus3-snapshots</name>
<url>//localhost:8081/repository/maven-snapshots/</url>
</snapshotRepository>
</distributionManagement>
...
關於 nexus3 在 npm 或 maven 環境下的更多操作,在後面的實戰部分再繼續,如 Vue3 組件庫開發和發佈、基於 SpringBoot / Spring Cloud 通用權限服務等。
感謝你閱讀本文,如果本文給了你一點點幫助或者啟發,還請三連支持一下,點贊、關注、收藏,作者會持續與大家分享更多乾貨