1. 概述
如果团队使用 java 进行开发,开发人员通常通过共享 jar 包的方式进行项目间公共代码的维护,这些 jar 包的维护就需要一个 maven 私服来进行管理,这样既能够保证代码的安全性,又能快速上传、管理 jar 包。 Nexus 是“开箱即用”的系统,不需要数据库,它使用文件系统加 Lucene 来组织数据,支持 WebDAV 与 LDAP 安全身份认证。 Nexus 还提供了强大的仓库管理功能,构件搜索功能,它还提供了一套 REST 客户端,占用内存较少,极大地简化了本地内部仓库的维护和外部仓库的访问。 总之,本地内部仓库在本地构建nexus私服的好处有: 1. 加速构建、稳定 2. 节省带宽、节省中央maven仓库的带宽 3. 控制和审计 4. 能够部署第三方构件 5. 可以建立本地内部仓库、可以建立公共仓库 这些优点使得Nexus日趋成为最流行的Maven仓库管理器。
本文,我们就来详细介绍一下如何通过 nexus 搭建 maven 私服。
2. Nexus2 还是 Nexus3
Nexus3.x 相较 2.x 版本有很大的改变。 1. 从底层重构,从而提高性能,增强扩展能力,并改善用户体验 2. 升级界面,增加更多的浏览,搜索和管理功能 3. 提供安装包,使部署更简单(安装完自动添加成服务,省去手动添加的麻烦) 4. 增加 Docker,NuGet,npm,Bower的支持 5. 提供新的管理接口,从而能自动管理任务
所以本文使用 nexus3 作为介绍,但是事实上,nexus3 的安装启动与 nexus2 非常类似。 nexus3 要求必须先安装并配置好 jdk8 以上的版本。
3. 安装 Nexus3.x
3.1. 获取安装包
首先执行 wget 命令获取安装包。
代码语言:javascript复制# 获取 Nexus3.6.0
wget http://sonatype-download.global.ssl.fastly.net/nexus/3/nexus-3.6.0-02-unix.tar.gz
3.2. 安装 Nexus
执行下面命令安装。
代码语言:javascript复制sudo mkdir -P /usr/local/nexus
sudo tar -zxvf nexus-3.6.0-02-unix.tar.gz -C /usr/local/nexus
sudo mv /usr/local/nexus/nexus-3.6.0-02 /usr/local/nexus/nexus
cd /etc/init.d
sudo ln -s /usr/local/nexus/nexus/bin/nexus .
现在我们就可以通过 service 命令来启动、停止或查看 nexus 的运行状态了。
3.3. 启动 Nexus
在启动 nexus 之前,要知道操作系统默认一个程序最大的能打开的文件数只有 4096,对于一个管理所有 jar 包的 Nexus 来说,这通常来说是不够的,我们需要将这个限制调大。 打开 /etc/security/limits.conf 文件,添加如下配置:
代码语言:javascript复制nexus - nofile 65536
现在执行。
代码语言:javascript复制sudo service nexus start
即可启动 nexus,默认端口是 8081,因此用浏览器打开 http://localhost:8081 就可以看到 nexus 内置的 REST 页面了。
4. 创建用户
点击页面上的 log in 按钮,输入默认用户名(admin)和默认密码(admin123)登录。 可以点击上面的“设置”图标,在“设置”里可以添加用户、角色,对接LDAP等的设置。
这里我们填写信息创建用户。
Grant 可以选择用户权限:
- nx-admin — 管理员权限
- nx-anonymous — 无差别用户权限,无法看到设置图标并且无法进入设置页面
5. 创建仓库
接下来我们就可以创建仓库了。
这里我们有三种 maven 仓库可选。
他们的区别是: 1. proxy — 远程仓库的代理,当用户向这个仓库请求一个 artifact,他会先在本地查找,如果找不到的话,就会从远程仓库下载,然后返回给用户 2. hosted — 宿主仓库,用户可以 deploy 到 hosted 中,也可以手工上传构件到 hosted 里,在 central repository 是获取不到的,就需要手工上传到hosted里 3. group — 仓库组,在 maven 里没有这个概念,是 nexus 特有的。目的是将上述多个仓库聚合,对用户暴露统一的地址
这里我们创建两个 hosted 仓库。
他们分别用来管理正式版 jar 包和 SNAPSHOT 包,区别在于是否允许重复上传。
6. 配置 settings.xml
代码语言:javascript复制<?xml version="1.0" encoding="UTF-8"?>
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0
https://maven.apache.org/xsd/settings-1.0.0.xsd">
<servers>
<server>
<id>releases</id>
<username>admin</username>
<password>admin123</password>
</server>
<server>
<id>snapshots</id>
<username>admin</username>
<password>admin123</password>
</server>
</servers>
</settings>
7. 配置 pom.xml
我们创建一个项目,然后配置 pom.xml。 最重要的是 distributionManagement 节点的配置,引用我们在 settings.xml 中配置的 nexus 私服 id。 配置中的 url 通过下图按钮处点击获取即可。
代码语言:javascript复制<?xml version="1.0" encoding="UTF-8"?>
<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.0</modelVersion>
<groupId>cn.techlog</groupId>
<artifactId>fortest</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<name>fortest Maven Webapp</name>
<!-- FIXME change it to the project's website -->
<url>http://www.example.com</url>
<distributionManagement>
<repository>
<id>releases</id>
<name>Release Repository</name>
<url>http://localhost:8081/repository/java/</url>
</repository>
<snapshotRepository>
<id>snapshots</id>
<url>http://localhost:8081/repository/java-snapshot/</url>
</snapshotRepository>
</distributionManagement>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.7</maven.compiler.source>
<maven.compiler.target>1.7</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<finalName>fortest</finalName>
<pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
<plugins>
<!-- 打jar包插件 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.0.2</version>
<configuration>
<excludes>
<exclude>**/*.properties</exclude>
</excludes>
</configuration>
</plugin>
<!-- 打包源码插件 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<version>3.0.1</version>
<configuration>
<attach>true</attach>
</configuration>
<executions>
<execution>
<phase>compile</phase>
<goals>
<goal>jar</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<artifactId>maven-clean-plugin</artifactId>
<version>3.0.0</version>
</plugin>
<!-- see http://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_war_packaging -->
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<version>3.0.2</version>
</plugin>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.7.0</version>
</plugin>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.20.1</version>
</plugin>
<plugin>
<artifactId>maven-war-plugin</artifactId>
<version>3.2.0</version>
</plugin>
<plugin>
<artifactId>maven-install-plugin</artifactId>
<version>2.5.2</version>
</plugin>
<plugin>
<artifactId>maven-deploy-plugin</artifactId>
<version>2.8.2</version>
</plugin>
</plugins>
</pluginManagement>
</build>
</project>
8. 打包上传
接下来我们执行 mvn deploy -e 就可以实现打包上传了。 通过页面,我们可以看到已经上传成功。
9. 参考资料
https://help.sonatype.com/repomanager3。 https://blog.csdn.net/smartbetter/article/details/55116889。