软件和安装环境
- nexus安装包
下载地址:https://www.sonatype.com/oss-thank-you-tar.gz
我这里使用nexus-3.13.0-01(写本文时的最新版) - JDK 1.8+
1. 安装nexus
- 设置当前用户可以打开的文件总数为65536
[hadoop@jed etc]$ sudo vim /etc/security/limits.conf
#在文件中添加以下内容,其中hadoop是用户名
hadoop - nofile 65536
- 解压安装包
目录说明:
bin: 包含nexus的启动脚本以及启动相关的配置文件,例如通过bin/nexus.vmoptions文件,你可以配置一些JVM参数和日志存放位置等配置
etc: 包含应用级别的配置文件
lib: 包含 Apache Karaf 相关的jar包
public: 包含应用相关的公共资源
system: 包含应用相关的构件和插件
- 进入bin目录下,启动nexus
[hadoop@jed bin]$ ./nexus start
Starting nexus
# 使用 nexus run 也会启动 nexus,区别在于:start以守护线程方式启动,run以非守护线程方式启动
- 查看nexus状态
[hadoop@jed bin]$ ./nexus status
nexus is running.
- 访问Web UI
http://ip:8081/
看到以上页面说明 nexus 启动正常。
其他命令说明:
# 重启
nexus restart
# 强制重新刷新仓库
nexus force-reload
2. 配置 nexus 以服务的形式启动,并且开机自启动
(0) 准备工作
- 关闭之前手动开启的nexus进程
[hadoop@jed bin]$ ./nexus stop
Shutting down nexus
Stopped.
- 配置环境变量,添加NEXUS_HOME
[hadoop@jed nexus-3.13.0-01]$ vim ~/.bash_profile
export NEXUS_HOME=/opt/apps/nexus-3.13.0-01
export PATH=$PATH:$NEXUS_HOME/bin
[hadoop@jed nexus-3.13.0-01]$ source ~/.bash_profile
- 修改$NEXUS_HOME/bin/nexus.rc
# 后面改为你自己的用户名
run_as_user="hadoop"
- 修改$NEXUS_HOME/bin/nexus
# 这一行是注释的,释放掉,后面写JAVA_HOME的路径
INSTALL4J_JAVA_HOME_OVERRIDE=/opt/apps/jdk1.8.0_172
- 做一个$NEXUS_HOME/bin/nexus到/etc/init.d/nexus的软连接
[hadoop@jed bin]$ sudo ln -s $NEXUS_HOME/bin/nexus /etc/init.d/nexus
(1) 方法一:使用chkconfig
cd /etc/init.d
## 添加nexus服务
sudo chkconfig --add nexus
## 设置在3、4、5这3个系统运行级别的时候自动开启nexus服务
sudo chkconfig --levels 345 nexus on
## 启动nexus服务
sudo service nexus start
关于系统运行级别以及chkconfig命令的用法参考Linux的运行级别和chkconfig用法
(2) 方法二:使用update-rc.d
cd /etc/init.d
sudo update-rc.d nexus defaults
sudo service nexus start
(3) 方法三:使用systemd(CentOS-7推荐使用)
# 在/etc/systemd/system/下新建文件nexus.service
[hadoop@jed nexus-3.13.0-01]$ touch /etc/systemd/system/nexus.service
# 编辑该文件,内容如下(你可能需要适当修改)
[hadoop@jed nexus-3.13.0-01]$ sudo vim /etc/systemd/system/nexus.service
[Unit]
Description=nexus service
After=network.target
[Service]
Type=forking
LimitNOFILE=65536
ExecStart=/opt/apps/nexus-3.13.0-01/bin/nexus start
ExecStop=/opt/apps/nexus-3.13.0-01/bin/nexus stop
User=hadoop
Restart=on-abort
[Install]
WantedBy=multi-user.target
[hadoop@jed nexus-3.13.0-01]$ sudo systemctl daemon-reload
[hadoop@jed nexus-3.13.0-01]$ sudo systemctl enable nexus.service
[hadoop@jed nexus-3.13.0-01]$ sudo systemctl start nexus.service
3. Nexus仓库的分类
Maven可以直接从宿主仓库下载构件,也可以从代理仓库下载构件,代理仓库会间接的从远程仓库下载并缓存构件,为了方便,maven也可以从仓库组下载构件,而仓库组没有实际内容,它会转向其包含的宿主仓库或者代理仓库获得实际构件的内容。
登录Nexus Web UI,管理员默认账户密码为admin/admin123
查看内置的仓库
nexus 3.13 自带的部分仓库的说明:
- maven-central:代理仓库,该仓库代理Maven中央仓库,策略为release,因此只会下载和缓存中央仓库中的发布版本的构件。
- maven-releases: 宿主仓库,策略为release,用来部署组织内部的发布版本的构件。
- maven-snapshots:宿主仓库,策略为snapshots,用来部署组织内部的快照版本的构件。
- maven-public:仓库组,包含了以上3个仓库
4. Nexus 操作
(1) 创建用户
退出系统,用新创建的用户登录(账户hadoop/密码hadoop)
(2) 创建宿主仓库
(2) 创建代理仓库
(3) 创建仓库组
(4) 配置maven从Nexus下载构件
pom如下:
<repositories>
<repository>
<id>nexus</id>
<name>nexus</name>
<url>http://jed:8081/repository/hadoop-test-repository-group/</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>nexus</id>
<name>nexus</name>
<url>http://jed:8081/repository/hadoop-test-repository-group/</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>false</enabled>
</snapshots>
</pluginRepository>
</pluginRepositories>
你可以从nexus页面上获得仓库的url
在pom中的id、name不需要与仓库中的对应,但url一定要一样,在pom中,多个仓库的id一定是不同的,例如<repositories>下配置了多个仓库,那么这些仓库的id一定要不同,但是<repositories>和<pluginRepositories>下可以共用一个仓库。
以上配置只在当前的项目中生效,如果想让你本地的所有的maven项目都去自定义的私服下载构件,需要在settings.xml中配置如下:
<settings>
<profiles>
<profile>
<repositories>
<repository>
<id>nexus</id>
<name>nexus</name>
<url>http://jed:8081/repository/hadoop-test-repository-group/</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>nexus</id>
<name>nexus</name>
<url>http://jed:8081/repository/hadoop-test-repository-group/</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>false</enabled>
</snapshots>
</pluginRepository>
</pluginRepositories>
</profile>
</profiles>
<activeProfiles>
<activeProfile>nexus</activeProfile>
</activeProfiles>
</settings>
在profile中配置的私服确实可以作用于本地所有的maven项目,但是maven除了会去私服中下载构件,也会去maven中央仓库中下载,如果我们想要配置maven的下载请求仅仅通过nexus,以全面发挥私服的作用,这就需要在<mirror>级别添加配置了(在profile配置的基础上再在mirror上添加配置),settings.xml中的内容如下:
<mirrors>
<mirror>
<id>nexus</id>
<url>http://jed:8081/repository/hadoop-test-repository-group/</url>
<!-- * 代表这个私服可以作为所有远程仓库的镜像 -->
<mirrorOf>*</mirrorOf>
</mirror>
</mirrors>
(5) 部署构件到nexus
项目中的pom配置如下:
<distributionManagement>
<repository>
<id>nexus-releases</id>
<name>nexus-releases</name>
<url>http://jed:8081/repository/hadoop-hosted-test-repository/</url>
</repository>
<snapshotRepository>
<id>nexus-snapshot</id>
<name>nexus-snapshot</name>
<url>http://jed:8081/repository/hadoop-hosted-test-repository-snapshots/</url>
</snapshotRepository>
</distributionManagement>
这里设置了两个仓库,一个用于部署发布版构件,一个用于部署快照版构件,用于部署快照版构件的仓库我们在之前演示创建仓库的时候没有创建,你需要自己创建一个,另外无论是部署快照版构件还是部署发布版构件,都是需要部署到宿主类型的仓库中,而我们之前配置的下载构件的仓库是一个仓库组,这里需要注意一下。
另外,nexus仓库对于匿名用户是只读的,所以还需要在settings.xml中配置认证信息,如下:
<servers>
<server>
<id>nexus-releases</id>
<username>hadoop</username>
<password>hadoop</password>
</server>
<server>
<id>nexus-snapshot</id>
<username>hadoop</username>
<password>hadoop</password>
</server>
</servers>
然后在项目根目录下执行maven命令mvn deploy
即可,如果想在任意路径下部署某个已经打好的jar包,完整的maven命令如下:
mvn deploy:deploy-file \
-DgroupId=your.group.id \
-DartifactId=your.artifact.id \
-Dversion=1.0.0 \
-Dpackaging=jar \
-Dfile=/path/to/your-jar-1.0.0.jar \
-Durl=http://ip:port/your/repository/url\
-DrepositoryId=yourRepositoryId
除了使用 maven 命令,还可以使用nexus WEB 界面来手动上传第三方jar包:
(6) 为项目分配独立的仓库
- 假设项目名称为bonc,新建两个宿主仓库bonc-releases和bonc-snapshots分别用于部署bonc项目的发布版构件和快照版构件,过程不再赘述
- 创建用于管理这两个仓库的权限(这里只演示为bonc-releases仓库创建权限)
- 创建一个角色bonc-role,添加这两个权限
- 创建一个用户,赋予bonc-role角色
- 在pom中配置部署构件的仓库
<distributionManagement>
<repository>
<id>bonc-releases</id>
<name>bonc-releases</name>
<url>http://jed:8081/repository/bonc-releases/</url>
</repository>
<snapshotRepository>
<id>bonc-snapshots</id>
<name>bonc-snapshots</name>
<url>http://jed:8081/repository/bonc-snapshots/</url>
</snapshotRepository>
</distributionManagement>
- 在 settings.xml中配置认证信息
<servers>
<server>
<id>bonc-releases</id>
<username>bonc</username>
<password>bonc</password>
</server>
<server>
<id>bonc-snapshots</id>
<username>bonc</username>
<password>bonc</password>
</server>
</servers>
这样就能把bonc项目的构件发布到专属的两个仓库中,而其他用户(没有设置管理这两个仓库权限或角色的用户)是不能部署构件到这两个仓库中的,当然了系统级别的用户(admin和上文创建的hadoop用户是可以的)
(7) nexus的调度任务
你可以在nexus界面上配置一些周期性执行的后台任务来维护nexus,以下为nexus 3.13 支持的后台任务的部分说明:
接下来以发布仓库的索引文件为例来演示怎么调度task
可以看到,新创建的task在等待执行:
到达设置的时间后,task开始执行,状态为running:
当任务运行完成后,刚才那条task就会消失(因为刚才的task设置只执行一次),需要注意的是,这里生成的索引文件,并不是被代理的仓库中的所有构件的索引,也就是说,这个任务并没有生成maven中央仓库中所有构件的索引,而是nexus仓库中已经存在的构件的索引
最后,关于更多nexus 3.x 的使用和配置的细节可以去Nexus 3 的官方文档中学习