Maven 私服 Nexus 简单使用
简介
Nexus 是一个仓库管理工具,主要用于存储和管理二进制构件(如 JAR 文件)。它支持多种类型的仓库格式,包括 Maven、npm、NuGet 等。
Nexus 主要用于以下几个方面:
- 存储内部构件:存储公司内部开发的库和应用程序。
- 缓存外部依赖:缓存从公共仓库(如 Maven Central)下载的依赖项,减少对外部网络的依赖,提高构建速度。
- 集中化管理:提供一个集中的平台来管理所有依赖项,确保版本一致性和安全性。
Nexus 的主要功能
- 仓库类型: Nexus 支持多种类型的仓库:
- Hosted Repository(托管仓库):用于存储内部开发的构件或第三方构件。可以是发布版本(releases)或快照版本(snapshots)。
- Proxy Repository(代理仓库):作为公共仓库(如 Maven Central)的代理,缓存远程仓库中的构件,减少对外部网络的依赖。
- Group Repository(组仓库):将多个仓库组合在一起,方便客户端通过一个 URL 访问多个仓库。
- 权限管理: Nexus 提供了细粒度的权限管理功能,允许管理员为不同的用户和角色分配不同的权限。例如,某些用户可能只能读取仓库中的构件,而其他用户则可以上传和删除构件。
- 搜索和浏览:
Nexus 提供了一个易于使用的 Web 界面,允许用户浏览和搜索仓库中的构件。这有助于快速找到所需的依赖项,并进行版本管理。 - 安全和审计:
Nexus 支持 SSL 加密、LDAP 集成、OAuth 和 SSO 等多种安全机制,确保仓库的安全性。此外,Nexus 还提供了详细的日志记录和审计功能,帮助管理员跟踪用户的操作。 - CI/CD 集成
Nexus 可以与 Jenkins、GitLab CI、CircleCI 等持续集成/持续交付(CI/CD)工具无缝集成,支持自动化构建和部署流程。
安装
nexus 是 Java 开发,需要先安装 jdk 或 jre 才能运行.
相关版本:
- 系统: Ubuntu 24.04 server
- JDK: 11.0.26
- Nexus: 3.72.0-04
安装JDK
shell
# 下载jdk
wget https://download.oracle.com/otn/java/jdk/11.0.26+7/720377fa814b4b4491dea5837af261de/jdk-11.0.26_linux-x64_bin.tar.gz
# 将 jdk-11.0.26_linux-x64_bin.tar.gz 解压到/opt/java11目录
sudo mkdir /opt/java11
sudo tar -zxvf jdk-11.0.26_linux-x64_bin.tar.gz -C /opt/java11 --strip-components=1
# 配置 JDK 的环境变量
sudo tee /etc/profile.d/java.sh <<-'EOF'
JAVA_HOME=/opt/java8
CLASSPATH=%JAVA_HOME%/lib:%JAVA_HOME%/jre/lib
PATH=$PATH:$JAVA_HOME/bin:$JAVA_HOME/jre/bin
export PATH CLASSPATH JAVA_HOME
EOF
# 刷新环境变量
source /etc/profile.d/java.sh
安装 Nexus
shell
# 下载Nexus的最新版本
wget https://download.sonatype.com/nexus/3/latest-unix.tar.gz
# 创建一个目录来存放Nexus
sudo mkdir /opt/nexus
# 解压下载的tar.gz文件
sudo tar -zxvf latest-unix.tar.gz -C /opt/nexus --strip-components=1
# 创建一个nexus用户
sudo useradd nexus
# 给nexus目录权限
sudo chown -R nexus:nexus /opt/nexus
# 为nexus用户配置权限
sudo chmod -R 755 /opt/nexus
注意: 要更改 nexus 的工作目录的位置
shell
# 调整工作目录
# vim /opt/nexus/bin/nexus.vmoptions
-Xms2703m
-Xmx2703m
-XX:+UnlockDiagnosticVMOptions
-XX:+LogVMOutput
# -XX:LogFile=../sonatype-work/nexus3/log/jvm.log
-XX:LogFile=./sonatype-work/nexus3/log/jvm.log
-XX:-OmitStackTraceInFastThrow
-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.data=./sonatype-work/nexus3
# -Dkaraf.log=../sonatype-work/nexus3/log
-Dkaraf.log=./sonatype-work/nexus3/log
# -Djava.io.tmpdir=../sonatype-work/nexus3/tmp
-Djava.io.tmpdir=./sonatype-work/nexus3/tmp
-Dkaraf.startLocalConsole=false
-Djdk.tls.ephemeralDHKeySize=2048
#
# additional vmoptions needed for Java9+
#
--add-reads=java.xml=java.logging
--add-exports=java.base/org.apache.karaf.specs.locator=java.xml,ALL-UNNAMED
--patch-module
java.base=./lib/endorsed/org.apache.karaf.specs.locator-4.3.9.jar
--patch-module
java.xml=./lib/endorsed/org.apache.karaf.specs.java.xml-4.3.9.jar
--add-opens
java.base/java.security=ALL-UNNAMED
--add-opens
java.base/java.net=ALL-UNNAMED
--add-opens
java.base/java.lang=ALL-UNNAMED
--add-opens
java.base/java.util=ALL-UNNAMED
--add-opens
java.naming/javax.naming.spi=ALL-UNNAMED
--add-opens
java.rmi/sun.rmi.transport.tcp=ALL-UNNAMED
--add-exports=java.base/sun.net.www.protocol.http=ALL-UNNAMED
--add-exports=java.base/sun.net.www.protocol.https=ALL-UNNAMED
--add-exports=java.base/sun.net.www.protocol.jar=ALL-UNNAMED
--add-exports=jdk.xml.dom/org.w3c.dom.html=ALL-UNNAMED
--add-exports=jdk.naming.rmi/com.sun.jndi.url.rmi=ALL-UNNAMED
--add-exports=java.security.sasl/com.sun.security.sasl=ALL-UNNAMED
创建服务文件,以服务的形式运行
ini
# 创建nexus服务文件
# sudo vi /etc/systemd/system/nexus.service
[Unit]
Description=Nexus Repository Manager
After=network.target
[Service]
Type=forking
ExecStart=/opt/nexus/bin/nexus start
ExecStop=/opt/nexus/bin/nexus stop
User=nexus
LimitNOFILE=65536
TimeoutStartSec=30
[Install]
WantedBy=multi-user.target
Nexus 服务的启动\状态\停止\重启
shell
# 重新加载systemd服务
sudo systemctl daemon-reload
# 启动Nexus服务
sudo systemctl start nexus
# 设置Nexus开机自启
sudo systemctl enable nexus
# 检查Nexus服务状态
sudo systemctl status nexus
# 重启Nexus服务
sudo systemctl restart nexus
开始访问
访问管理地址: http://{hostIp}:8081
默认的用户密码:
- 用户:admin
- 密码:/opt/nexus/sonatype-work/nexus3/admin.password

Maven 使用 Nexus 私服上传\下载
- 在 Nexus 中创建仓库: 注意Version policy 和 Deployment policy 的配置
- 在 Maven 的 settings.xml 中配置 server 和 mirror
- 在项目中使用私服上传和下载
部分关键配置项:
xml
<!-- settings.xml 中的关键配置 -->
<!-- server 部分 -->
<server>
<id>nexus-all</id>
<username>******</username>
<password>******</password>
</server>
<server>
<id>maven-releases-joe</id>
<username>******</username>
<password>******</password>
</server>
<server>
<id>maven-snapshots-joe</id>
<username>******</username>
<password>******</password>
</server>
<!-- mirror 部分 -->
<mirror>
<id>nexus-all</id>
<mirrorOf>*</mirrorOf>
<url>http://10.18.18.168:8081/repository/maven-public/</url>
<name>Nexus All Repositories Mirror</name>
</mirror>
<mirror>
<id>maven-releases-joe</id>
<mirrorOf>*</mirrorOf>
<url>http://10.18.18.168:8081/repository/maven-releases-joe/</url>
<name>maven-releases-joe</name>
</mirror>
<mirror>
<id>maven-snapshots-joe</id>
<mirrorOf>*</mirrorOf>
<url>http://10.18.18.168:8081/repository/maven-snapshots-joe/</url>
<name>maven-snapshots-joe</name>
</mirror>
xml
<!-- pom.xml 中的关键配置 -->
<!-- 上传, mvn clean deploy -->
<distributionManagement>
<repository>
<id>maven-releases-joe</id>
<url>http://10.18.18.168:8081/repository/maven-releases-joe/</url>
</repository>
<snapshotRepository>
<id>maven-snapshots-joe</id>
<url>http://10.18.18.168:8081/repository/maven-snapshots-joe/</url>
</snapshotRepository>
</distributionManagement>
<!-- 下载 -->
<repositories>
<repository>
<id>nexus-all</id>
<url>http://10.18.18.168:8081/repository/maven-public/</url>
</repository>
<repository>
<id>maven-releases-joe</id>
<url>http://10.18.18.168:8081/repository/maven-releases-joe/</url>
</repository>
<repository>
<id>maven-snapshots-joe</id>
<url>http://10.18.18.168:8081/repository/maven-snapshots-joe/</url>
</repository>
</repositories>
附录
shell
# 启动脚本测试
mkdir /home/nexus
# 给nexus目录权限
sudo chown -R nexus:nexus /home/nexus
# 为nexus用户配置权限
sudo chmod -R 755 /home/nexus
# 有时问题可能出在启动脚本本身。您可以手动尝试启动 Nexus 以获取更详细的输出:
sudo su - nexus -c '/opt/nexus/bin/nexus start'
# 或者直接运行 Nexus 以便实时查看输出
sudo su - nexus -c '/opt/nexus/bin/nexus run'
如果私服中不存在相关依赖可以手动上传:
shell
# 手动上传的方式之一: 在项目的根目录执行, 指定依赖所在的位置\仓库的地址.
# 注意: maven 本地仓库的依赖是不能直接上传的,需要移除本地仓库,再上传
mvn deploy:deploy-file -Durl="http://10.18.18.168:8081/repository/maven-releases-joe/" -DrepositoryId="maven-releases-joe" -Dfile="C:/Users/windows/Downloads/csp/casp-3.0.1.jar" -DpomFile="C:/Users/windows/Downloads/csp/casp-3.0.1.pom" -DgroupId="com.ultrapower" -DartifactId="casp" -Dversion="3.0.1" -Dpackaging="jar"