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)使用 npmyarn 等包管理工具初始化項目:

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 中將左側兩個剛創建的倉庫移動到右邊:

image-20220829153955277

點擊頁面底部的 Create repository按鈕創建倉庫。

通過上面的三個步驟,便創建了npm的三種類型的倉庫。

image-20220829154142144

點擊 demo-npm-group 後面的 copy 按鈕可以查看並複製私服地址:

image-20220829163027299

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:

image-20220829170109571

401 錯誤處理

如果登錄失敗,出現 401 錯誤:

image-20220829164322376

在確保用戶名、密碼、郵箱都正確的前提下,可以採用下面的方式進行處理:

打開系統當前用戶主目錄中的.npmrc 文件:

vi /Users/liuyun/.npmrc 

刪除該文件中對應私服地址的 authToken,如下圖,刪除該行,然後重新登錄。

image-20220829170258742

登錄成功後會提示:

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 中看到:

image-20220829172400192

1.4 應用通過 Nexus3 使用 JS 庫

1) 創建 JS 庫項目目錄: js-demo-app

2)使用 npmyarn 等包管理工具初始化項目:

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 節點中配置 repositoryrepository 中需配置三個子節點:

  • 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

執行成功如下:

image-20220830155004684

在 nexus3 頁面上也可以看到在 maven-snapshots 倉庫中有這個包:

image-20220830155134978

發布 release 包:

為了方便後面看效果,此處將DemeUtils 中 test 方法返回值修改為:

return "release - Hello " + str;

將 pom.xml 中 version 修改為 1.0:

<version>1.0</version>

再次執行 mvn clean deploy。執行成功後,可以在 maven-release 倉庫中看到這個包:

image-20220830155502051

如此一來,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 通用許可權服務等。

image

感謝你閱讀本文,如果本文給了你一點點幫助或者啟發,還請三連支援一下,點贊、關注、收藏,作者會持續與大家分享更多乾貨