Nexus仓库

简介: 本文介绍了Nexus Repository Manager的Linux安装与配置,包括JDK环境搭建、OSS版下载、解压启动、仓库管理及Docker部署方式。详细说明了登录、密码重置、仓库创建、Maven/NPM/Docker私服配置与资源上传等操作,并提供常用命令与配置示例,助力高效搭建私有仓库。

Linux安装

  1. 安装jdk8,并配置环境变量
    安装后的路径为:/usr/java/jdk1.8.0_181-amd64
rpm -ivh jdk-8u181-linux-x64.rpm
  1. 到 sonatype 官网下载Nexus Repository Manager OSS

Nexus分为开源免费的OSS版和Pro版。

此处可以选择下载开源免费的OSS版。

pro版多了资源健康检查等功能。

  1. 将下载的压缩包放到服务器解压
    解压后会有两个文件夹:

sonatype将Nexus安装包托管到了 Fastly CDN,国内访问Fastly CDN非常卡顿。可能会下载失败,需要多试几次。

tar -zxvf  nexus-3.30.0-01-unix.tar.gz
  • nexus-3.30.0-01

nexus软件

  • sonatype-work

nexus工作目录。

该文件夹和nexus软件在相同路径中,最好不要改动。

  1. 修改nexus的配置
    编辑 nexus-3.30.0-01/etc/nexus-default.properties 文件
## DO NOT EDIT - CUSTOMIZATIONS BELONG IN $data-dir/etc/nexus.properties
##
# Jetty section
# nexus的内置Jetty的端口号
application-port=8081 
application-host=0.0.0.0
nexus-args=${jetty.etc}/jetty.xml,${jetty.etc}/jetty-http.xml,${jetty.etc}/jetty-requestlog.xml
# nexus发布到Jetty的项目访问路径
nexus-context-path=/
# Nexus section
nexus-edition=nexus-pro-edition
nexus-features=\
 nexus-pro-feature
nexus.hazelcast.discovery.isEnabled=true
  1. 启动nexus
    windows版:
  1. 使用管理员身份将nexus安装成一个windows服务
# 安装服务
nexus.exe /install
# 卸载服务
nexus.exe /uninstall
  1. 在windows的“服务”中可以找到nexus服务,启动该服务

Linux版:

  1. 执行 nexus指令查看其参数

不带参数直接运行nexus指令,会返回nexus可选参数列表

./nexus
  1. 启动nexus(nexus不建议使用root用户执行)
# 启动
./nexus start
# 关闭
./nexus stop
# 查看状态
./nexus status
# 重启
./nexus restart


  1. 浏览器放问nexus
    http://192.168.29.141:8081/

启动较缓慢,需要等待一段时间才能连上


相关操作


登录

  1. 进入nexus的web管理页面后,所有的配置都是只读的,需要登录才能操作
  2. 点击Sign In 进行登录
    默认用户名:admin
    默认密码:在 /home/nexus/sonatype-work/nexus3/admin.password  文件中

旧版本Nexus没有该密码文件,默认密码为:admin123

  1. 首次登录需要修改密码,例如将密码改为:admin

修改密码后,admin.password文件会被自动删除

  1. 配置是否允许匿名访问

启用匿名访问意味着,用户可以在没有凭据的情况下从仓库搜索、浏览和下载组件。


使用管理员登录后,便可以在nexus的web页面中管理nexus。


可以配置仓库(仓库的创建等)、安全(用户、角色、域、权限、SSL、匿名账户等配置)、IQ Server、Support(日志查看、服务器状态、指标统计、系统信息、日志文件压缩、JVM堆存储压缩等)、系统(API、Email服务、定时任务等)


点击右上角的用户账户,进入用户详情页面,可以修改用户的密码。


忘记密码

如果更改完密码,把密码忘记了,密码不能找回,只能重新设置。


重置密码:参考官方文档

旧版本的密码存在配置文件中,3.x存储在数据库中。

nexus内置了一个图数据库OrientDB,密码信息存储在图数据库中。图数据库的数据文件位于 sonaptype/nexus3/db 文件夹中

  1. 关闭nexus,备份 sonaptype/nexus3/db 文件夹
  2. 登录OrientDB数据库控制台
# unix
java -jar ./lib/support/nexus-orient-console.jar
# windows
java -jar lib\support\nexus-orient-console.jar
  1. 连接数据库
# 连接OrientDB数据库(如果报错,就再尝试一次)
connect plocal:../sonatype-work/nexus3/db/security admin admin
  1. 使用下列语句重置密码为:admin123  
    如果 nexus中不存在admin用户:

OrientDB使用的是类SQL语言,不是SQL。

-- 查看Nexus中是否存在admin用户
select * from user where id = "admin";
-- 存在admin用户,则重置admin用户的密码
update user SET password="$shiro1$SHA-512$1024$NE+wqQq/TmjZMvfI7ENh/g==$V4yPw8T64UQ6GfJfxYq2hLsVrBY8D1v+bktfOxGdt4b/9BthpWPNUy/CBk6V9iA0nHpzYzJFWO8v/tZFtES8CA==" UPSERT WHERE id="admin"
-- 添加admin用户
INSERT INTO user (status, id, firstName, lastName, email, password) VALUES ('active', 'admin', 'admin', 'admin', 'changeme@yourcompany.com', '$shiro1$SHA-512$1024$NE+wqQq/TmjZMvfI7ENh/g==$V4yPw8T64UQ6GfJfxYq2hLsVrBY8D1v+bktfOxGdt4b/9BthpWPNUy/CBk6V9iA0nHpzYzJFWO8v/tZFtES8CA==')
-- 为admin用户绑定角色
INSERT INTO user_role_mapping (userId, source, roles) VALUES ('admin', 'default', 'nx-admin')
  1. 重启nexus服务器生效


仓库配置

自带的仓库配置:

maven-central:maven的中央仓库,,format为“maven2" , type为“proxy”(代理),Remote storage配置的代理的 远程maven仓库路径。如果要使用该仓库,只需拷贝该仓库的 URL 到自己的maven setting配置文件中。

maven-releases:jar包的正式发行版,type 为"hosted"(本地仓)。如果要使用该仓库,只需拷贝该仓库的 URL 到自己的maven setting配置文件中。

maven-snapshots:jar包的快照版,type 为"hosted",默认创建的maven的jar包即为快照版。

maven-public:聚合分组仓库。type为“group"(组),提供了聚合分组的功能。Member repositories配置的是该组包含的仓库成员。可以将需要配置的多个仓库都加入这个分组中,最终在maven setting配置文件中配置这个组的URL即可。

nuget-group、nuget-hosted、nuget.org-proxy 是 format 为“nuget" 的仓库示例。


创建仓库:

  1. 选择 Create repository
  2. 选择要创建的仓库类型,例如 maven2(proxy)(代理远程maven仓库)
  3. 设置仓库名称、代理的远程仓库地址 阿里云maven


本地仓设置成允许重复提交:

默认情况下,创建的仓库只允许提交一次,需要设置成可重复提交。(如果禁止重复提交模式下,多次提交会报405错误)

  1. 进入需要配置的仓库,例如 maven-releases 、maven-snapshots
  2. Hosted ---> Deployment policy ,选择 Allow redeploy


在maven中使用Nexus中的仓库

方式1:通过mirrors配置

在maven的settings.xml中进行配置:

<servers>
    <!-- 配置登录的用户名/密码,如果允许匿名账户访问则无需配置 -->
    <!-- id要和mirror中配置的id对应 -->
    <server>
      <id>myNexus</id>
      <username>admin</username>
      <password>admin</password>
    </server>
</servers>
<mirrors>
    <!-- 配置镜像,下载时通过该镜像对应的连接下载对应的依赖 -->
    <mirror>
        <id>myNexus</id>
        <!-- mirrorOf将会通过哪些操作的类型去下载 -->
        <!-- 配置*代表所有的请求都通过该镜像下载 -->
        <mirrorOf>*</mirrorOf>
        <name>my nexus repository</name>
        <!-- 此处配置的是nexus私服中的maven-public地址(即group类型的maven仓库),这样可以使配置更简洁,只需配置这一个地址就可以访问这个组中的所有仓库 -->
        <url>http://192.168.29.141:8081/repository/maven-public/</url>
    </mirror>
</mirrors>


如果用户名/密码错误,将会返回 401 错误(即没有权限)


方式2:通过profiles配置

在maven的settings.xml中进行配置

<servers>
    <!-- 配置登录的用户名/密码,如果允许匿名账户访问则无需配置 -->
    <!-- id要和profile中配置的repository的id对应 -->
    <server>
      <id>myNexus</id>
      <username>admin</username>
      <password>admin</password>
    </server>
</servers>
<!-- 定义存储的位置(也就是仓库),这里可以配置多个仓库 -->
<profiles>
    <profile>
        <id>otherRepositories</id>
        <repositories>
            <repository>
                <!-- id要和server中的id对应 -->
                <id>myNexus</id>
              <name>my nexus repository</name>
                <url>http://192.168.29.141:8081/repository/maven-public/</url>
                <releases>
                    <updatePolicy>daily</updatePolicy>
                    <enabled>true</enabled>
                    <checksumPolicy>warn</checksumPolicy>
                </releases>
                <snapshots>
                    <enabled>false</enabled>
                </snapshots>
                <layout>default</layout>
            </repository>
        </repositories>
    </profile>
</profiles>
<!-- 激活profiles,activeProfile需要和profile的id对应 -->
<activeProfiles>
    <activeProfile>otherRepositories</activeProfile>
</activeProfiles>


两种方式对比:

如果使用mirrors方式配置,当私服宕机时,maven项目的依赖便无法下载。

如果使用profile方式配置,当私服宕机时,maven项目的依赖会到自动切换到Maven远程仓库进行下载。



方式3:在项目中配置:

<projects>
    
  <!-- 依赖等相关配置 -->
    
    <!-- 私仓配置 -->
    <repositories>
        <repository>
            <!-- 仓库基本信息 -->
            <id>myNexus</id>
            <name>我的nexus私仓</name>
            <url>http://xxx.xxx.xxx.xxx/repository/maven-group/</url>
            
            <!-- 是否允许 RELEASE 版本的依赖,以及相关策略 -->
            <releases>
                <enabled>true</enabled>
                <!-- 完整性校验策略,ignore/warn(默认)/fail -->
                <checksumPolicy>ignore</checksumPolicy>
                <!-- 更新策略:always/daily(默认)/interval:xxx分钟/never -->
                <updatePolicy>always</updatePolicy>
            </releases>
            <!-- SNAPSHOT版本的依赖策略 -->
            <snapshots>
                <enabled>true</enabled>
                <checksumPolicy>ignore</checksumPolicy>
                <updatePolicy>always</updatePolicy>
            </snapshots>
        </repository>
    </repositories>
    
    <!-- 插件私仓配置,配置方式和依赖的私仓配置一样 -->
    <pluginRepositories>
        <pluginRepository>
            <!-- 仓库基本信息 -->
            <id>myNexusPlugin</id>
            <name>我的nexus私仓</name>
            <url>http://xxx.xxx.xxx.xxx/repository/maven-group/</url>
            <releases>
                <enabled>true</enabled>
            </releases>
            <snapshots>
                <enabled>true</enabled>
            </snapshots>
        </pluginRepository>
    </pluginRepositories>
    
</projects>

上传项目到nexus仓库

在maven的settings文件中添加配置:

上传不需要mirrors和profiles,仓库路径在项目的pom.xml中进行定义

<!-- 配置仓库的用户名密码 -->
<servers>
    <server>
      <id>upload</id>
      <username>admin</username>
      <password>admin</password>
    </server>
</servers>


在需要上传的资源的项目 pom.xml 中添加配置:

<!-- 配置上传的仓库地址 -->
<distributionManagement>
    <repository>
        <!-- 要和settings.xml中server的id对应,因为上传时需要身份认证 -->
        <id>upload</id>
        <name>upload releases</name>
        <url>http://192.168.29.141:8081/repository/maven-releases/</url>  <!-- release仓库地址 -->
    </repository>
    <repository>
        <id>upload</id>
        <name>upload snapshots</name>
        <url>http://192.168.29.141:8081/repository/maven-snapshots/</url>  <!-- snapshots仓库地址 -->
    </repository>
</distributionManagement>


此处的地址不可以配置成 maven-public 的地址,因为maven-public是一个聚合仓库,此处需要指明要上传的仓库


在项目中执行 maven 的 deploy 命令。


如果项目的版本是 xxx-SNAPSHOTS,会上传到快照仓库,但是上传上去的jar包的名称后面会加上时间戳。


如果项目的版本是 xxx-RELEASE,会上传到发行版仓库,上传上去的jar包名称就是项目中的名称


使用Docker安装


安装方式1:使用docker部署

  1. 安装docker环境
  2. 从dockerHub上拉取nexus3的镜像
docker pull sonatype/nexus3

该镜像位于dockerHub上,但不是docker官方镜像,在网易数帆、阿里云等镜像中心都搜索不到。


从dockerHub上拉取时网络比较卡顿,如果网络超时就多试几次。

  1. 镜像拉取完成之后,使用docker进行运行
docker run -d -p 8081:8081 --name nexus sonatype/nexus3

nexus3的web默认绑定的端口为8081

  1. 使用浏览器访问:http://192.168.29.131:8081

启动较慢,可能需要等待一会儿才能访问到


为了避免以后再次拉取nexus镜像较慢问题,在拉取镜像成功之后,将镜像导出成一个tar包。以后重新部署时直接将tar包作为镜像导入docker即可。


docker save -o nexus3.tar sonatype/nexus3


关闭docker容器时,确保有足够的时间使nexus的数据库关闭:


docker stop --time=120 <CONTAINER_NAME>


安装方式2:使用Docker file进行构建


docker build --rm=true --tag=sonatype/nexus3 .


有3个参数:


  • NEXUS_VERSION:Nexus Repository Manager的版本
  • NEXUS_DOWNLOAD_URL:Nexus Repository的下载路径,用于NEXUS_VERSION的替代方式
  • NEXUS_DOWNLOAD_SHA256_HASH:下载的Nexus Repository Manager的sha256校验。如果提供了NEXUS_VERSION或NEXUS_DOWNLOAD_URL,则sha256参数必需



使用rspec测试Dockerfile:


rspec [--backtrace] spec/Dockerfile_spec.rb


Docker相关配置


默认用户是 admin,第一次启动时,为其生成的一串UUID密码位于 /nexus-data/admin.password 中。


查看密码:


docker exec nexus cat /nexus-data/admin.password


服务在新容器中可能需要2-3分钟才能启动,可以通过日志查看是否就绪:


docker logs -f nexus


nexus的安装方式为:/opt/sonatype/nexus


/nexus-data为永久目录,该目录用于配置、日志和存储,Nexus进程必需可写该目录。


可以通过 INSTALL4J_ADD_VM_PARAMS 环境变量,将JVM参数传递给启动脚本,默认为:-Xms2703m -Xmx2703m -XX:MaxDirectMemorySize=2703m -Djava.util.prefs.userRoot=${NEXUS_DATA}/javaprefs


例如:


docker run -d -p 8081:8081 --name nexus -e INSTALL4J_ADD_VM_PARAMS="-Xms2g -Xmx2g -XX:MaxDirectMemorySize=3g  -Djava.util.prefs.userRoot=/some-other-dir" sonatype/nexus3


其中 -Djava.util.prefs.userRoot可以指定永久目录的路径。


可以通过 NEXUS_CONTEXT 环境变量来控制Nexus上下文路径,默认为 /


例如:


docker run -d -p 8081:8081 --name nexus -e NEXUS_CONTEXT=nexus sonatype/nexus3


数据持久化


因为永久目录默认为/nexus-data,所以需要对永久目录进行持久化。


方式1:使用docker volume卷。


docker volume卷是持久性的因为可以专门为此创建一个卷。官方推荐做法


docker volume create --name nexus-data
docker run -d -p 8081:8081 --name nexus -v nexus-data:/nexus-data sonatype/nexus3


方式2:使用主机目录。


因为主机目录中的数据本身不会清空,所以可以将主机目录作为docker中的/nexus-data目录进行挂载


mkdir 主机自定义目录
docker run -d -p 8081:8081 --name nexus -v 主机自定义目录:/nexus-data sonatype/nexus3


创建npm私仓注意事项


正常创建好一个 npm 私仓后,通过 npm publish向私仓上传npm资源:


  1. 配置nexus,nexus默认npm是失效的。
  1. 使用管理员用户登录nexus的web管理页面
  2. 找到:security --> Realms
  3. npm Bearer Token Realm配置成 Active


  1. 将本地npm的仓库地址配置为私仓地址:
# 如果创建的npm仓库为 hosted仓库、group仓库,则此处配置的是group仓库
npm config set registry http://xxxx:8081/repository/npm-group/
  1. 配置登录npm私仓的用户名、密码、邮箱
# npm login 或者npm adduser 两个命令等价
# 如果配置的私仓地址是group,此处应该登录的是hosted,因为最终要上传进的应该是hosted仓
npm login --registry=http://xxxx:8081/repository/npm-hosted/
  1. 进入到package.json的同级目录,进行发布

此处需要注意,如果package.json中publishConfig配置了其他的registry,需要将其改为我们的私仓地址,或者去掉该配置。


否则会报错:-4048(即用户未登录的错误)

# 如果没有在package.json中指定发布的仓库地址,则在后面加上私仓地址,应该上传到的是hosted仓
npm publish [floder] --registry=http://xxxx:8081/repository/npm-hosted/


如果用户名密码有问题,可以找到.npmrc文件进行修改:


  1. 使用命令查看 .npmrc文件的路径
# 或者使用 npm config ls -l 查看所有配置项
npm config get userconfig
  1. 打开该文件,删除_authToken 的那一行
  2. 重新使用 npm login登录即可


仓库分文件夹存储


  1. 在Web管理页面:Repository --> Blob Stores
  2. Create blob store
  3. 选择存储类型:File或者S3
    例如选择 File 文件存储;
    起一个Blob名称;
    填写文件保存路径,默认为:/home/nexus/sonatype-work/nexus3/blobs/Blob名称


创建新的仓库时,便可以在 Storage --> Blob store 选择我们自定义的文件夹进行存储。



Maven

使用命令方式上传到私仓

命令:

curl -u "用户名:密码" -X PUT -v -T aaa-1.0.1.jar htttP://xxx.xxx:8081/repository/资源库名/com/test/aaa/1.0.1/aaa-1.0.1.jar


整个资源库上传到私仓


将整个本地的资源库上传到nexus私仓:

  1. 先将本地repository仓库文件夹打成一个完整的zip压缩包
  2. 上传到nexus服务器上
  3. 解压zip
  4. 进入repository目录
  5. 清理*.lastUpdated_remote.repositories文件
# 查看所有*.lastUpdated
find . -name '*.lastUpdated' -type f
# 删除*.lastUpdated
find . -name '*.lastUpdated' -type f -exec rm {} +
# 检查
find . -name '*.lastUpdated' -type f
# 查看所有 _remote.repositories 文件
find . -name '_remote.repositories' -type f
# 删除所有 _remote.repositories 文件
find . -name '_remote.repositories' -type f -exec rm {} +
# 检查
find . -name '_remote.repositories' -type f
# 查看所有resolver-status.properties 文件
find . -name 'resolver-status.properties' -type f
# 删除所有 resolver-status.properties 文件
find . -name 'resolver-status.properties' -type f -exec rm {} +
# 检查
find . -name 'resolver-status.properties' -type f
  1. 将本地仓库里面所有的maven-metadata-alimaven.xml改名为maven-metadata.xmlalimaven是本地maven的settings文件中设置的镜像仓库名)
find . -name "maven-metadata-alimaven.xml" -execdir mv {} maven-metadata.xml \;
  1. 编写 mvnimport.sh 脚本,内容如下  
#!/bin/bash# copy and run this script to the root of the repository directory containing files# this script attempts to exclude uploading itself explicitly so the script name is important# Get command line params while getopts ":r:u:p:" opt; do  case $opt in    r) REPO_URL="$OPTARG"   ;;    u) USERNAME="$OPTARG"   ;;    p) PASSWORD="$OPTARG"   ;;  esacdone find . -type f -not -path './mavenimport\.sh*' -not -path '*/\.*' -not -path '*/\^archetype\-catalog\.xml*' -not -path '*/\^maven\-metadata\-local*\.xml' -not -path '*/\^maven\-metadata\-deployment*\.xml' | sed "s|^\./||" | xargs -I '{}' curl -u "$USERNAME:$PASSWORD" -X PUT -v -T {} ${REPO_URL}/{} ;
  1. 将私仓文件、sh脚本授权
  2. 执行shell脚本并传入参数
./mvnimport.sh -u admin -p admin -r http://私仓地址:8081/repository/mvn-host/
  1. 等全部导入完毕后,在nexus控制台页面刷新即可看到已导入的jar

Npm

将依赖使用命令上传

  1. 登录资源库
npm login
  1. 进入package.json页面,进行上传
npm push


Docker

使用命令上传镜像

  1. 登录资源库
docker login 资源库地址 -u 用户名
  1. 将要上传的镜像复制一个tag
docker tag mysql:8 192.168.xxx.xxx:8881/mysql:8
  1. 上传镜像
docker push 192.168.xxx.xxx:8881/mysql
目录
相关文章
|
1月前
|
Java Maven 数据安全/隐私保护
Nexus仓库
Nexus是一款开源仓库管理工具,支持Maven、NPM、Docker等格式。本文介绍其在Linux与Docker环境下的安装配置,包括JDK部署、OSS版下载、仓库创建、用户权限管理及密码重置方法,并涵盖私服搭建、持久化存储、资源上传与匿名访问设置,助力企业高效构建私有仓库体系。
|
运维 测试技术
6月27日阿里云故障说明
6月27日下午,我们在运维上的一个操作失误,导致一些客户访问阿里云官网控制台和使用部分产品功能出现问题。故障于北京时间2018年6月27日16:21左右开始,16:50分开始陆续恢复。对于这次故障,没有借口,我们不能也不该出现这样的失误!我们将认真复盘改进自动化运维技术和发布验证流程,敬畏每一行代码,敬畏每一份托付。
11589 2
|
6月前
|
持续交付 网络安全 数据安全/隐私保护
ios微信双开(免费版)怎么弄的?如何下载
作为一名移动端自动化开发工程师,我曾在多个iOS越狱项目中处理过应用多开需求。本文将
|
算法 安全 数据安全/隐私保护
链接加密的方法有哪些?
【10月更文挑战第6天】链接加密的方法有哪些?
1354 10
|
测试技术
外包对职业发展是否有影响?
从事两年外包工作并不会影响未来的发展,关键在于是否在此期间提升了个人能力。许多外包人员由于缺乏系统的培训,能力停滞不前,只能从事低级的手工测试工作。在华为合作的外包人员中,部分人因公司未提供培养机会,导致技能难以提升。因此,在外包期间应主动学习,掌握自动化和编程技能,以提高竞争力。大部分企业并不在意求职者是否有外包经历,只要能力达标即可。建议不要在外包公司停留过久,及时跳槽寻找更好的发展机会,避免因长期外包而失去学习动力。
|
机器学习/深度学习 自然语言处理 算法
神经网络算法以及应用场景和基本语法
神经网络算法以及应用场景和基本语法
401 0
|
安全 Java API
Spring Security 6.x 图解身份认证的架构设计
【6月更文挑战第1天】本文主要介绍了Spring Security在身份认证方面的架构设计,以及主要业务流程,及核心代码的实现
479 1
Spring Security 6.x 图解身份认证的架构设计
|
数据库 索引
Elasticsearch索引别名:管理与优化数据访问
Elasticsearch索引别名:管理与优化数据访问
374 2
|
Docker 容器
docker build -t和docker build -f区别
参数用于指定要使用的Dockerfile的路径,允许你在不同的位置使用不同的Dockerfile来构建镜像。
479 0
|
缓存 算法 小程序
游戏开发学习路线和教程合集
游戏开发学习路线和教程合集
752 0

热门文章

最新文章