Bootstrap

基于Nexus搭建Maven私服

一、什么是Nexus

Nexus 是 Sonatype 公司发布的一款仓库(Repository)管理软件,全称是Nexus Repository Manager,常用来搭建 Maven 私服,所以也有人将 Nexus 称为“Maven仓库管理器”。
Maven 私服其实并不是 Maven 的核心概念,它仅仅是一种衍生出来的特殊的仓库,但这并不代表它不重要,相反由于私服具有降低中央仓库负荷、节省外网带宽、以及提高项目稳定性等优点,使得私服在实际开发过程中得到了相当普遍地使用。

能够帮助我们建立私服的软件被称为 Maven 仓库管理器,主要有以下 3 种:

  • Apache Archiva
  • JFrog Artifactory
  • Sonatype Nexus

其中,Sonatype Nexus 是当前最流行,使用最广泛的 Maven 仓库管理器。Nexus 分为开源版和专业版,其中开源版足以满足大部分 Maven 用户的需求。
Nexus 开源版具有以下特性:

  • 占用内存小
  • 具有基于 ExtJs 得操作界面,用户体验较好
  • 使用基于 Restlet 的完全 REST API
  • 支持代理仓库、宿主仓库和仓库组
  • 基于文件系统,不需要依赖数据库
  • 支持仓库索引以及搜索
  • 支持在界面上上传构件
  • 安全控制

Nexus 专业版需要付费购买,它主要包含一些企业级的高级特性,详情请参考 Sonatype Nexus 官方文档

二、构建Nexus私服的作用、如果没有私服会出现什么问题?

所谓的私服,就是在局域网中的一种特殊的远程仓库,它的作用是代理远程中央仓库和部署第三方构件。有了私服之后,当Maven需要下载构件的时候,直接请求私服即可,私服上如果存在所需的构件,则直接从私服进行下载到本地仓库;反之,如果私服上不存在所需的构件,私服会请求外部的远程仓库(中央仓库),先将构件下载到私服,然后再提供给本地仓库进行下载。这样,第二个开发人员如果同样需要此构件,就可以直接从私服进行下载到本地仓库了。
对于企业开发而言,如果没有私服,我们所有的依赖都需要从 Maven 的中央仓库或者第三方的 Maven 仓库下载到本地。如果一个团队中的所有人都重复的从 Maven 仓库下载组件无疑加大了仓库的负载和带宽的消耗,而且如果企业的带宽资源紧张,引入依赖等待时长更是灾难的存在。
另外,很多情况下项目的开发都是在内网进行的,我们某些组件不可能发布到外网,所以我们可能需要一个自己的maven私服。

三、Nexus私服的优点

3.1 节省外网带宽

大量对中央仓库的重复请求会消耗带宽,利用私服代理外部仓库,可以避免重复的公网下载降低带宽的压力。

3.2 加速maven的构建

maven通过内网从私服拉取所需构件(私服存在此构件的情况下),获取构件的速度大大加快,从而加快打包构件的速度。

3.3 部署第三方构件

开发人员自己封装的一些jar包(工具类),可以部署到私服,以便内部开发人员的maven项目使用。

3.4 提高稳定性

当公网网络不稳定的时候,如果使用远程仓库,maven的构建也会变得不稳定。如果在私服存在所需的构件,即使没有公网,maven的构件也会顺利进行。

3.5 降低中央仓库的负荷

使用私服,避免了从中央仓库的重复下载,可以减轻中央仓库的负荷。
这些优点使得nexus日趋成了最为流行的Maven仓库管理器。

四、版本选择及下载

4.1 关于版本选择

目前 Nexus 分为 Nexus 2.x 和 Nexus 3.x 两个大版本,它们是并行的关系,下面我们以最新的 Nexus 3.x 为例,演示 Nexus 的安装过程。

4.2 关于下载及解压

  1. 进入 Nexus 3.x 下载页面,根据本机操作系统,选择对应的版本进行下载,如下图所示。

  1. 将下载 Nexus 安装包解压到本地磁盘,可获得nexus-3.57.0-01 和 sonatype-work 2 个目录,如下图。
[root@VM-8-11-centos software]# ll
total 205956
drwxr-xr-x 10 root root      4096 Jul  8 13:06 nexus-3.57.0-01
-rw-r--r--  1 root root 210885633 Jul  8 13:01 nexus-3.57.0-01-unix.tar.gz
drwxr-xr-x  3 root root      4096 Jul  8 13:06 sonatype-work

其中:

  • nexus-3.57.0-01:该目录中包含了 Nexus 3.x 运行所需要的文件,如启动脚本、依赖 jar 包等。
  • sonatype-work:该目录中包含了 Nexus 3.x 生成的配置文件、日志文件等。
  1. nexus-3.57.0-01中包含以下目录及文件。
[root@VM-8-11-centos software]# ll nexus-3.57.0-01
total 96
drwxr-xr-x  3 root root  4096 Jul  8 13:06 bin # 该目录包含 nexus 启动脚本本身以及启动相关的配置文件
drwxr-xr-x  2 root root  4096 Jul  8 13:06 deploy
drwxr-xr-x  7 root root  4096 Jul  8 13:06 etc # 此目录包含配置文件
drwxr-xr-x  5 root root  4096 Jul  8 13:06 lib # 此目录包含与Apache Karaf相关的二进制库
-rw-r--r--  1 root root   651 Jul  1 06:00 NOTICE.txt
-rw-r--r--  1 root root 17321 Jul  1 06:00 OSS-LICENSE.txt
-rw-r--r--  1 root root 41955 Jul  1 06:00 PRO-LICENSE.txt
drwxr-xr-x  2 root root  4096 Jul  8 13:06 public # 此目录包含应用程序的公共资源
drwxr-xr-x  3 root root  4096 Jul  8 13:06 replicator
drwxr-xr-x 23 root root  4096 Jul  8 13:06 system # 此目录包含构成应用程序的所有组件和插件

数据目录内容对于每个实例是唯一的,并且包括子目录,子目录包含存储库管理器使用的所有组件、存储库、配置和其他持久性数据。
数据目录默认位于 …/sonatype-work/nexus3。
要更改默认位置,请参阅配置运行时环境页的配置数据目录部分
数据目录下的文件和目录包括:

[root@VM-8-11-centos software]# ll sonatype-work/nexus3/
total 12
drwxr-xr-x 2 root root 4096 Jul  8 13:06 blobs # 未使用绝对存储路径定义的所有基于文件系统的blob存储的父目录。例如,默认blob存储将位于`../sonatype-work/nexus3/blobs/default`。
-rw-r--r-- 1 root root    0 Jul  1 05:55 clean_cache
drwxr-xr-x 2 root root 4096 Jul  8 13:06 log # 运行实例生成的日志文件,也有日志文件的压缩包,貌似是每天都会生成日志文件,你可以定期删除老的日志文件
drwxr-xr-x 2 root root 4096 Jul  8 13:06 tmp # 用于存储临时文件的目录

五、配置JDK环境变量

在国内,甲骨文公司的jdk下载的速度是很慢的,这里建议使用国内华为云的jdk,两者没有区别,就是做了一个搬运工作,对国内使用JDK环境的人来说非常友好
第一步:选择自己合适的JDK版本,网站在下面给出
https://repo.huaweicloud.com/java/jdk/
第二步:我以JDK1.8为例,演示如何在Centos7下安装JDK1.8版本,下面给出下载链接
https://repo.huaweicloud.com/java/jdk/8u202-b08/jdk-8u202-linux-i586.tar.gz

提示:一定要下载linux版本的

第三步:通过ssh工具连接到Centos7,命令下载直接下载
如果无法连通网络环境,可自行下载后上传到服务器

# 下载JDK
[root@VM-8-11-centos software]# wget https://repo.huaweicloud.com/java/jdk/8u202-b08/jdk-8u202-linux-i586.tar.gz
# 解压JDK
[root@VM-8-11-centos software]# tar -zxvf jdk-8u202-linux-i586.tar.gz

这里我们把JDK也下载到software目录下
如果提示找不到wget命令,可能是还没有安装命令。执行下面的命令进行安装:

[root@VM-8-11-centos software]# yum install wget

(1)通过修改/etc/profile文件配置JDK环境变量(不推荐)
不推荐的原因是考虑后期维护是否方便
Linux不建议在/etc/profile文件中设置系统环境变量。

# 修改配置文件
# vim /etc/profile

# 文件末尾追加内容如下:
#JAVA_HOME
export JAVA_HOME=/usr/local/software/jdk1.8.0_202
#JRE_HOME
export JRE_HOME=/usr/local/software/jdk1.8.0_202/jre
#CALSSPATH
export CLASSPATH=$CLASSPATH:${JAVA_HOME}/lib:${JRE_HOME}/lib
#PATH
export PATH=$PATH:${JAVA_HOME}/bin:${JRE_HOME}/bin

(2)在/etc/profile.d目录下增加环境变量脚本文件配置JDK环境变量(推荐)
/etc/profile在每次启动时会执行/etc/profile.d下全部的脚本文件,/etc/profile.d比/etc/profile好维护。
通过命令 vim /etc/profile.d/my_env.sh 创建并编辑脚本文件,文件内容如下:

#JAVA_HOME
export JAVA_HOME=/usr/local/software/jdk1.8.0_202
export PATH=$PATH:$JAVA_HOME/bin
export CALSSPATH=$CLASSPATH:$JAVA_HOME/lib#JRE_HOME
export JRE_HOME=/usr/local/software/jdk1.8.0_202/jre
export PATH=$PATH:$JRE_HOME/bin
export CALSSPATH=$CLASSPATH:$JRE_HOME/lib

两种配置方式,最终都需要执行如下命令,重载配置文件,使得环境变量配置生效。

[root@VM-8-11-centos software]# source /etc/profile

然后执行查询JDK版本命令,查询成功说明JDK环境变量配置已生效。

[root@VM-8-11-centos software]# java -version
java version "1.8.0_202"
Java(TM) SE Runtime Environment (build 1.8.0_202-b08)
Java HotSpot(TM) Server VM (build 25.202-b08, mixed mode)

安装jdk后输入Java-version出现-bash: /usr/java/jdk1.8.0_271/bin/java: /lib/ld-linux.so.2: bad ELF interpreter: No such file or directory

[root@VM-8-11-centos software]# java -version
-bash: /usr/local/software/jdk1.8.0_202/bin/java: /lib/ld-linux.so.2: bad ELF interpreter: No such file or directory

解决方案:需要下载一下glibc.i686

[root@VM-8-11-centos software]# yum install glibc.i686

解释:glibc是GNU发布的libc库,即c运行库。glibc是linux系统中最底层的api,几乎其它任何运行库都会依赖于glibc。glibc除了封装linux操作系统所提供的系统服务外,它本身也提供了许多其它一些必要功能服务的实现。由于 glibc 囊括了几乎所有的 UNIX通行的标准,可以想见其内容包罗万象。而就像其他的 UNIX 系统一样,其内含的档案群分散于系统的树状目录结构中,像一个支架一般撑起整个操作系统。在 GNU/Linux 系统中,其C函式库发展史点出了GNU/Linux 演进的几个重要里程碑,用 glibc 作为系统的C函式库,是GNU/Linux演进的一个重要里程碑。

安装过程中会询问是否安装等信息,直接输“y”即可。
安装好之后再输入“java -version”就会显示java的版本号及其他信息。这样就代表jdk安装成功了。

六、安装部署Nexus

在前台运行存储库管理器
要从类Unix平台(如Linux)上bin文件夹中的应用程序目录启动存储库管理器:

[root@VM-8-11-centos bin]# ll
total 32
drwxr-xr-x 2 root root  4096 Jul  8 13:06 contrib
-rwxr-xr-x 1 root root 18620 Jul  1 06:00 nexus
-rw-r--r-- 1 root root    15 Jul  1 06:00 nexus.rc
-rw-r--r-- 1 root root  1635 Jul  1 06:00 nexus.vmoptions

请使用:

./nexus run

使用run命令启动存储库管理器将使其在当前shell中运行并显示日志输出。可以在适当的控制台使用CTRL+C停止正在运行的应用程序。
大概等待一分钟左右,一旦日志显示消息“Started Sonatype Nexus”,就可以访问应用程序。
启动nexus并测试可用性
nexus默认端口号为8081,所以我们到浏览器键入ip:8081即可进入登录页面,刚刚进入时需要初始化一下,这里我们稍等片刻。

初始化完成后就会进入如下界面

完成初始化之后,我们点击sign in,准备进行登录。
初次进入时需要输入用户名和密码,用户名为admin,密码可以按照页面提示找到对应文件完成输入,如下图所示:

使用cat命令查看该文件内容,如下所示,得到一串字符串复制下来去登录。

[root@VM-8-11-centos ~]# cat /usr/local/software/sonatype-work/nexus3/admin.password
6eb0e409-b839-4d36-8ea1-9fd6f13602a2

然后我们就进入了初始化页面,这里直接点击next。

然后页面会提示我们修改密码,这里我们按照提示输入两次点击下一步即可。

下一个设置页面,我们选择第一个选项,设置允许匿名访问。

点击next,就完成了基本的设置

七、优化配置

1、作为服务运行

为生产用途安装Nexus Repository时,必须将其配置为作为服务运行,因此它会在服务器重新启动后重新启动。最好以仅具有所需访问权限的特定用户身份运行该服务或守护程序。
这里我们介绍2种方式,一种是/etc/init.d方式,另一种是systemctl方式。 这两种方式使用root用户均可以执行,但是对于后一种方式用户nexus也可以执行。
首先切换到nexus目录

[root@VM-8-11-centos software]# cd nexus-3.57.0-01/
[root@VM-8-11-centos nexus-3.57.0-01]# ll
total 175256
drwxr-xr-x  3 root root      4096 Jul 10 10:26 bin
drwxr-xr-x  2 root root      4096 Jul  8 13:06 deploy
drwxr-xr-x  7 root root      4096 Jul  8 13:06 etc
drwxr-xr-x  5 root root      4096 Jul  8 13:06 lib
-rw-r--r--  1 root root       651 Jul  1 06:00 NOTICE.txt
-rw-r--r--  1 root root     17321 Jul  1 06:00 OSS-LICENSE.txt
-rw-r--r--  1 root root     41955 Jul  1 06:00 PRO-LICENSE.txt
drwxr-xr-x  2 root root      4096 Jul  8 13:06 public
drwxr-xr-x  3 root root      4096 Jul  8 13:06 replicator
drwxr-xr-x 23 root root      4096 Jul  8 13:06 system

添加nexus用户作为运行用户

[root@VM-8-11-centos nexus-3.57.0-01]# useradd nexus

修改 bin/nexus.rc, 修改内容为

[root@VM-8-11-centos nexus-3.57.0-01]# vim bin/nexus.rc
run_as_user="nexus"

配置之后记得更改目录权限,否则下次启动会没有权限

[root@VM-8-11-centos nexus-3.57.0-01]# chown -R nexus.nexus /usr/local/software/nexus-3.57.0-01
[root@VM-8-11-centos nexus-3.57.0-01]# chown -R nexus.nexus /usr/local/software/sonatype-work
1. /etc/init.d方式的配置:

以下命令均使用root用户方式执行
使用root用户修改 /etc/profile文件

[root@VM-8-11-centos nexus-3.57.0-01]# vim /etc/profile
# 添加 NEXUS_HOME= (这里的路径根据自己的情况进行修改
NEXUS_HOME=/usr/local/software/nexus-3.57.0-01

然后执行下面命令,使得配置生效。

[root@VM-8-11-centos nexus-3.57.0-01]# source /etc/profile

可以使用echo $NEXUS_HOME的方式查看配置是否生效(切换到nexus用户也可以检查一下)

然后执行

[root@VM-8-11-centos nexus-3.57.0-01]# ln -s $NEXUS_HOME/bin/nexus /etc/init.d/nexus

$NEXUS_HOME 路径根据自身实际安装路径为准

接着执行下列命令

[root@VM-8-11-centos nexus-3.57.0-01]# update-rc.d nexus defaults
[root@VM-8-11-centos nexus-3.57.0-01]# service nexus start
2. systemd方式

以下命令均使用root用户方式执行
此示例是使用systemd 运行存储库管理器服务的脚本。创建一个名为nexus.service的文件。添加以下内容,然后将文件保存在 /etc/systemd/system/ 目录中:

[root@VM-8-11-centos ~]# vim /etc/systemd/system/nexus.service
[Unit]
Description=nexus service
After=network.target
  
[Service]
Type=forking
LimitNOFILE=65536
ExecStart=/etc/init.d/nexus start
ExecStop=/etc/init.d/nexus stop 
User=nexus
Restart=on-abort
TimeoutSec=600
  
[Install]
WantedBy=multi-user.target

上述文件中的路径需要根据实际情况进行更新。文件更新之后,执行命令

[root@VM-8-11-centos nexus-3.57.0-01]# chmod a+x nexus.service

接着执行以下命令

[root@VM-8-11-centos nexus-3.57.0-01]# systemctl daemon-reload   # 重新加载配置文件
[root@VM-8-11-centos nexus-3.57.0-01]# systemctl enable nexus.service  # 开机自启动
[root@VM-8-11-centos nexus-3.57.0-01]# systemctl start nexus.service  # 启动服务

在我的操作过程中,首先配置了/etc/init.d的方式,然后配置了systemd的方式。 两种方式均可以启动、停止nexus服务,其中systemd的方式使用nexus用户也可以执行。 配置完毕之后,重新启动节点机器,配置是生效的,nexus服务会开机启动。

2、PID文件

在Linux上作为服务启动时,Nexus Repository将在操作系统 /tmp目录中创建一个包含进程ID的文件。

  • 前缀:“i4jdaemon_”
  • 后缀:nexus start脚本的绝对路径,其中路径部分分隔符替换为下划线_示例:_临时目录 /tmp,启动脚本的路径位于 /opt/nexus/nexus-3.14.0-04/bin/nexus,则创建的文件将位于“/tmp/i4jdaemon__opt_nexus_nexus-3.14.0-04_bin_nexus”。

如果无法写入服务pid文件,则服务启动将静默失败,而不会将任何日志记录语句写入nexus. log。
如果Nexus存储库进程已经停止,并且服务无法启动,请首先确认没有日志输出添加到nexus. log文件中。如果没有,请检查预先存在的pid文件。如果存在该文件,请在尝试启动服务之前先将其删除。
创建此文件的目录可以选择通过编辑 $install-dir/bin/nexus.vmoptions并添加如下行来更改:

-Dinstall4j.pidDir=/some/absolute/path/to/a/directory

属性指定的目录必须已经存在才能使属性工作-该目录不会自动创建。

3、配置运行时环境

配置存储库管理器运行时的细节涉及对各种配置文件和启动脚本中的所有组件的配置。本节详细介绍这些并提供特定任务的秘诀。运行存储库管理器的JVM的启动通过安装中KaTeX parse error: Expected 'EOF', got '#' at position 111: …Properties.html#̲load-java.io.Re…install-dir/bin/nexus.vmoptions:

-Xms2703m
-Xmx2703m
-XX:MaxDirectMemorySize=2703m
-XX:+UnlockDiagnosticVMOptions
-XX:+LogVMOutput
-XX:LogFile=../sonatype-work/nexus3/log/jvm.log
-XX:-OmitStackTraceInFastThrow
-Djava.net.preferIPv4Stack=true
-Dkaraf.home=.
-Dkaraf.base=.
-Dkaraf.etc=etc/karaf
-Djava.util.logging.config.file=etc/karaf/java.util.logging.properties
-Dkaraf.data=../sonatype-work/nexus3
-Dkaraf.log=../sonatype-work/nexus3/log
-Djava.io.tmpdir=../sonatype-work/nexus3/tmp
-Dkaraf.startLocalConsole=false
-Djava.endorsed.dirs=lib/endorsed

4、配置内存

在更改默认内存设置之前,请查看我们的内存指南。更改任何一个设置都需要调整所有3个设置。-Xms和-Xmx设置必须始终具有相同的值。
更改JVM内存:

  1. 在文本编辑器中打开$install-dir/bin/nexus.vmoptions。
  2. 查找配置内存的行:
-Xms2703M
-Xmx2703M
-XX:MaxDirectMemorySize=2703M
  1. 使用以下格式编辑每个设置的值。大小是一个数字,文字单位字母表示千兆字节(g, G)、兆字节(m,M)或千字节(k,K)。

-Xmssize[g|G|m|M|k|K]-Xmxsize[g|G|m|M|k|K]-XX:MaxDirectMemorySize=size[g|G|m|M|k|K]

  1. 使用将拥有存储库管理器进程的用户的权限和所有权保存文件。

配置Java工具选项
文件$install-dir/bin/nexus.vmoptions指定java工具参数,每行一个,Java属性文件格式
编辑java选项

  1. 在文本编辑器中打开$install-dir/bin/nexus.vmoptions。
  2. 在新行上指定每个java选项。确保最后一个属性后跟行尾字符或新空行。否则将不会加载最后一个指定的属性。
  3. 使用将拥有存储库管理器进程的用户的权限和所有权保存文件。

5、更改HTTP端口

用于访问存储库管理器用户交互界面和资源的HTTP端口的默认值为8081。因此,用户交互界面将在http://localhost:8081/。要更改或更新端口,请在** d a t a − d i r / e t c / n e x u s . p r o p e r t i e s ∗ ∗ 中找到 ∗ ∗ a p p l i c a t i o n a t i o n − p o r t = 8081 ∗ ∗ a p p l i c a t i o n − p o r t = 8081 data-dir/etc/nexus.properties**中找到**application ation-port=8081**application-port=8081 datadir/etc/nexus.properties中找到applicationationport=8081applicationport=8081data-dir/etc/nexus.properties,然后编辑编号。下面是将端口更改为 9081的示例:

application-port=9081

因此,暴露的URL将被http://localhost:9081/。

6、设置HTTPS

此外,或者相反,您的用例可能要求您在HTTPS上运行服务器。这包括业务策略和某些NXRM功能或存储库格式的使用。有关执行此操作的方法,请参阅我们关于设置SSL的安全文章

7、更改上下文路径

要更改或更新指向特定webapp或组件的实例中的上下文路径,请在$data-dir/etc/nexus.properties中找到nexus-context-path=/行。components目录下公开用户交互界面的示例。
nexus-context-path=/components/
因此,如果端口设置为9081,暴露的URL将被http://localhost:9081/components/。

8、配置数据目录

您可以使用$install-dir/bin/nexus.vmoptions为要保留的数据定义新位置。在配置文件中,更改-Dkaraf.data、-Djava.io.tmpdir、-Dkaraf.log和-XX:LogFile的值来指定您喜欢使用的绝对路径。_nexus_服务会将数据目录添加到您配置的绝对路径中。例如,要使用绝对路径 /opt/sonatype-work/nexus3更改值,如下所示:

-Dkaraf.data=/opt/sonatype-work/nexus3
-Djava.io.tmpdir=/opt/sonatype-work/nexus3/tmp
-XX:LogFile=/opt/sonatype-work/nexus3/log/jvm.log
-Dkaraf.log=/opt/sonatype-work/nexus3/log

9、配置临时目录

存储库管理器将Java虚拟机临时目录用于重要的运行时文件。
临时目录设置为位于Nexus存储库数据目录中的$data-dir/tmp。优点是文件所有权和权限可以隔离在单个目录树下。
如果您希望更改默认临时位置,请记住以下要求:

  • tmp目录要求拥有存储库管理器进程的用户具有exec权限。不要对包含tmp目录的位置使用Linux上的noexec挂载选项。如果在tmp目录上设置了noexec,存储库管理器启动将失败,并显示java.lang.UnsatisfiedLinkError消息failed to map segment from shared object: Operation not permitted。如果正在使用存储库管理器docker映像,可能需要调整作为docker卷挂载的主机目录的权限以允许执行。
  • 不要操作放入临时目录的任何文件,尤其是在存储库管理器运行时
  • 确保托管目录的磁盘至少有1GB可用空间

10、更改临时目录

  1. 在文本编辑器中打开$install-dir/bin/nexus.vmoptions。
  2. 编辑包含 -Djava.io.tmpdir=…/sonatype-work/nexus3/tmp的行。该值可以是绝对路径,也可以是相对于$install-dir/bin目录的路径。
  3. 使用将拥有存储库管理器进程的用户的权限和所有权保存文件。

11、配置运行JDK

如果这里不配置,一般会使用默认的JAVA_HOME的变量,如果系统中有多个,那么可以进行配置。

[root@VM-8-11-centos bin]# vim nexus

修改第14行:
INSTALL4J_JAVA_HOME_OVERRIDE=/usr/local/jdk1.8.0_144

参考文献

nexus的安装
基于Nexus搭建Maven私服基础入门

;