• 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": "heroyyg@126.com"
      }
    }
    

    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 官方的地址,也可填写淘宝镜像或其他地址,这里我填写官方地址:https://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 仓库的地址:

    http://localhost:8081/repository/demo-npm-hosted/
    

    在命令行中使用 npm 登录 nexus3 私服:

    npm login --registry http://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 http://localhost:8081/repository/demo-npm-hosted/
    

    发布 JS 库:

    npm publish --registry http://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 http://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 http://localhost:8081/repository/demo-npm-group/
    

    1.5 命令总结

    npm 登录私服使用 hosted 地址:

    npm login --registry http://localhost:8081/repository/demo-npm-hosted/
    

    npm 发布使用 hosted 地址:

    npm publish --registry http://localhost:8081/repository/demo-npm-hosted/
    

    npm 添加 / 更新私服上的包,使用 group 地址:

    yarn add js-demo-lib --registry http://localhost:8081/repository/demo-npm-group/
    yarn upgrade js-demo-lib --registry http://localhost:8081/repository/demo-npm-group/
    

    2 Maven 中使用 Nexus3

    2.1 Nexus3 Maven 仓库

    安装好 nexus3 后,默认有四个 maven 仓库:

    maven-central:类型为 proxy,对中央仓库的代理,默认配置了 https://repo1.maven.org/maven2/,可以将其修改为阿里云镜像:http://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-publicid>
    				<mirrorOf>centralmirrorOf>
    				<name>Nexus3 Maven Publicname>
    				<url>http://localhost:8081/repository/maven-public/url>
    		mirror>
    mirrors>
    
    • 配置 server
    <servers>
        <server>
            <id>nexus3-releasesid>
            <username>youyageusername>
            <password>111111password>
        server>
        <server>
            <id>nexus3-snapshotsid>
            <username>youyageusername>
            <password>111111password>
        server>
    servers>
    

    server 中的 username 和 password 就是 上文在 nexus3 中创建的用户的 id 和 password。

    2.3 Java 包发布到 Nexus3 私服仓库

    现在创建一个 Maven 项目,将其发布到 Nexus3 中。

    1)新建 Maven 项目,项目名为:java-demo-lib

    2)pom.xml 如下:

    
    <project xmlns="http://maven.apache.org/POM/4.0.0"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0modelVersion>
    
        <groupId>com.yygnb.demo.libgroupId>
        <artifactId>java-demo-libartifactId>
        <version>1.0-SNAPSHOTversion>
    
        <properties>
            <maven.compiler.source>8maven.compiler.source>
            <maven.compiler.target>8maven.compiler.target>
        properties>
    
        <distributionManagement>
            <repository>
                <id>nexus3-releasesid>
                <name>nexus3-releasesname>
                <url>http://localhost:8081/repository/maven-releases/url>
            repository>
            <snapshotRepository>
                <id>nexus3-snapshotsid>
                <name>nexus3-snapshotsname>
                <url>http://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.0version>
    

    再次执行 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-publicid>
            <name>nexus3-maven-publicname>
            <url>http://localhost:8081/repository/maven-public/url>
            <snapshots>
                <enabled>trueenabled>
            snapshots>
            <releases>
                <enabled>trueenabled>
            releases>
        repository>
    repositories>
    

    添加上面 java-demo-lib snapshot 依赖:

    <dependencies>
        <dependency>
            <groupId>com.yygnb.demo.libgroupId>
            <artifactId>java-demo-libartifactId>
            <version>1.0-SNAPSHOTversion>
        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.libgroupId>
            <artifactId>java-demo-libartifactId>
            <version>1.0version>
        dependency>
    dependencies>
    

    刷新 Maven,重新执行 main 方法,控制台输出:

    release - Hello 程序员优雅哥
    

    2.5 配置总结

    1) settings.xml

    ...
    <mirrors>
    		<mirror>
    				<id>nexus3-maven-publicid>
    				<mirrorOf>centralmirrorOf>
    				<name>Nexus3 Maven Publicname>
    				<url>http://localhost:8081/repository/maven-public/url>
    		mirror>
    mirrors>
    <servers>
        <server>
            <id>nexus3-releasesid>
            <username>youyageusername>
            <password>111111password>
        server>
        <server>
            <id>nexus3-snapshotsid>
            <username>youyageusername>
            <password>111111password>
        server>
    servers>
    ...
    

    2)pom.xml

    ...
    <repositories>
        <repository>
            <id>nexus3-maven-publicid>
            <name>nexus3-maven-publicname>
            <url>http://localhost:8081/repository/maven-public/url>
            <snapshots>
                <enabled>trueenabled>
            snapshots>
            <releases>
                <enabled>trueenabled>
            releases>
        repository>
    repositories>
    
    <distributionManagement>
        <repository>
            <id>nexus3-releasesid>
            <name>nexus3-releasesname>
            <url>http://localhost:8081/repository/maven-releases/url>
        repository>
        <snapshotRepository>
            <id>nexus3-snapshotsid>
            <name>nexus3-snapshotsname>
            <url>http://localhost:8081/repository/maven-snapshots/url>
        snapshotRepository>
    distributionManagement>
    ...
    

    关于 nexus3 在 npm 或 maven 环境下的更多操作,在后面的实战部分再继续,如 Vue3 组件库开发和发布、基于 SpringBoot / Spring Cloud 通用权限服务等。

    image

    感谢你阅读本文,如果本文给了你一点点帮助或者启发,还请三连支持一下,点赞、关注、收藏,作者会持续与大家分享更多干货

  • 相关阅读:
    二叉树刷题(四)
    前端工程师应该如何去创业?
    Java编码与解码
    腾讯开源项目——behaviac——学习1
    java-php-net-python-工会管理系统计算机毕业设计程序
    《乔布斯传》英文原著重点词汇笔记(八)【 chapter six 】
    一级造价工程师(安装)- 计量笔记 - 第六章第四节建筑智能化工程
    MySQL binlog归档日志和redo log事务日志详解
    使用idea导入开发iuap2.0项目
    项目部署服务器【java】
  • 原文地址:https://www.cnblogs.com/youyacoder/p/16650210.html