docker 安装Nexus
Nexus安装
1.下载Nexus3镜像:
docker pull sonatype/nexus3
2.创建持久化存储目录:
mkdir -p /usr/local/docker/nexus-data
chmod 777 -R /usr/local/docker/nexus-data
3.启动Nexus容器:
docker run -d -p 8081:8081 --name nexus -v /usr/local/docker/nexus-data:/nexus-data sonatype/nexus3
4.访问Nexus仪表盘:
在浏览器中输入 http://localhost:8081 来访问Nexus仪表盘
docker exec -it nexus3 cat /nexus-data/admin.password
查看默认密码
Nexus仓库配置以及创建仓库
刚安装好的nexus一共给我们创建了7个仓库(不同的nexus版本可能有一点差距),我们只需要关注Format为maven2的仓库即可,也就是一共有4个:
maven-central:该仓库用来代理 Maven 中央仓库,其策略为 Release,只会下载和缓存中央仓库中的发布版本的构件。
maven-releases:策略为 Release 的宿主仓库,用来部署公司或组织内部的发布版本构件。
maven-snapshots:策略为 Snapshot 的宿主仓库,用来部署公司或组织内部的快照版本构件。
maven-public:仓库组,默认聚合了以上三个仓库。
下面进行一个一个讲解:
(1)maven-central

我们也可以再新建一个代理仓库,然后代理到阿里云镜像地址。通过阿里云镜像下载依赖要比maven中央仓库快的多。

选择maven2 (proxy)

其他配置默认即可。然后代理地址写:
https://maven.aliyun.com/repository/public

(2)maven-public
maven-public仓库组就是将这几个仓库汇集到一块,然后项目使用nexus,不需要配置其他仓库的地址,只需要配置仓库组的地址即可。

(3)maven-releases
release仓库需要把这块改一下,设置为Allow redeploy代表允许我们对仓库中的依赖维护升级新版本,如果设置为disable redeploy意味着我们无法将升级版本上传上来。

Nexus配置用户角色
nexus预定了两个用户
- admin:最高权限
- 浏览仓库
- 搜索仓库
- 上传构建
- 新建修改仓库
- anonymous:没有默认密码,不可以登录管理平台,拥有的权限有如下:
- 浏览仓库
- 搜索仓库

Nexus配置用户角色
一般我们不建议maven当中直接去配置admin账户,因为admin账户有新增和删除仓库的权限,我们可以选择新增一个账户,只给这个账号赋予上传依赖和下载依赖的权限即可,由于nexus是用户角色制,所以新增账户前,首先我们需要新建一个角色。然后让角色只具备上传依赖和下载依赖的权限。然后再给用户赋予该角色权限。
(1)新增角色

Role ID和Role Name自定义即可。

具体的需要新增的权限如下:
nx-apikey-all
nx-repository-view-*-*-*
nx-repository-view-*-*-browse
nx-repository-view-*-*-read
nx-repository-view-maven2-*-*
nx-repository-view-maven2-*-browse
nx-repository-view-maven2-maven-public-browse
nx-repository-view-maven2-maven-public-read
nx-repository-view-maven2-maven-releases-*
nx-repository-view-maven2-maven-releases-browse
nx-repository-view-maven2-maven-releases-read
nx-repository-view-maven2-maven-snapshots-*
nx-repository-view-maven2-maven-snapshots-add
nx-repository-view-maven2-maven-snapshots-browse
nx-repository-view-maven2-maven-snapshots-read
别忘了右下角保存!
2)新增用户,并指定该角色

这时候可以使用新账号登录测试一下,登录后会发现他没有设置的权限,这就是我们要的效果!

Maven SNAPSHOT(快照)
快照版本的构件在发布时,Maven 会自动为它打上一个时间戳,有了这个时间戳后,当依赖该构件的项目进行构建时,Maven 就能从仓库中找到最新的 SNAPSHOT 版本文件
默认情况下对于快照本本的构件,Maven 会每天从仓库中获取一次更新,用户也可以在任何 Maven 命令中使用 -U 参数强制 Maven 检查更新。命令如下:mvn clean package -U

项目当中配置Nexus上传依赖
首先找到本地maven的setting.xml(在maven安装目录的conf目录下),打开后找到servers标签。加入以下内容
<servers>
<!-- 这是配置访问私有仓库的用户名密码 -->
<server>
<!-- id标签可以随便填,只需要在servers中唯一即可,后面很多地方会使用该id -->
<id>self-maven</id>
<username>deplyment</username>
<password>deplyment123</password>
</server>
</servers>

maven配置好了,接下来去maven项目中设置:
在你想上传的模块的pom文件中,写入:
<distributionManagement>
<repository>
<!--注意这个id一定要填写我们maven的setting.xml当中配置的id-->
<id>self-maven</id>
<url>http://ip:port/repository/maven-releases/</url>
</repository>
<snapshotRepository>
<!--注意这个id一定要填写我们maven的setting.xml当中配置的id-->
<id>self-maven</id>
<url>http://ip:port/repository/maven-snapshots/</url>
</snapshotRepository>
</distributionManagement>
distributionManagement:负责将指定的构件部署到 Nexus 指定的仓库中。
repository:代表上传release版本存储的仓库地址
snapshotRepository:代表上传snapshot版本存储的仓库地址
标签中的 id,就是上面我们配置的server id,maven会通过这个id去server中拿用户名密码去访问私服仓库。
标签中的url,就是对应仓库的地址:仓库的url复制即可,注意对应仓库,弄反了是传不上去的

会根据该模块的版本进行自动选择,如果你的版本号带有SNAPSHOT如:<version>0.0.1-SNAPSHOT</version>,那么会上传到SNAPSHOT仓库,release也是这个道理,如果版本号不存在这两个单词,如1.0.0,那么会选择release仓库上传。
(1)接下来我们进行测试,首先第一步准备一个不是web工程的项目,如下:

(2)然后进行以下步骤:

当然也可以直接运行maven命令:mvn clean deploy -DskipTests
(3)deploy执行完不报错的话就上传成功了。

(4)由于我的项目设置的是1.0-SNAPSHOT,也就是SNAPSHOT版本,所以他会自动上传到maven-snapshots仓库当中,如下:

项目当中配置Nexus下载依赖
接下来,配置本地maven。还是打开setting.xml,然后添加一个如下配置:
<profiles>
<profile>
<id>nexus</id>
<!--声明一个或多个远程仓库 -->
<repositories>
<!-- 声明一个 Nexus 私服上的仓库 -->
<repository>
<!--仓库id,这个id就是上面配置的账号密码id -->
<id>self-maven</id>
<!-- 仓库的名称 -->
<name>nexus</name>
<!--仓库的地址 -->
<url>http://localhost:8081/repository/maven-public/</url>
<!-- 是否开启该仓库的 release 版本下载支持 -->
<releases>
<enabled>true</enabled>
</releases>
<!-- 是否开启该仓库的 snapshot 版本下载支持 -->
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
</repositories>
<!-- 声明一个或多个远程插件仓库 -->
<pluginRepositories>
<!--声明一个 Nexus 私服上的插件仓库 -->
<pluginRepository>
<!--插件仓库 id -->
<id>self-maven</id>
<!--插件仓库 名称 -->
<name>nexus</name>
<!-- 配置的插件仓库的地址 -->
<url>http://localhost:8081/repository/maven-public/</url>
<!-- 是否开启该插件仓库的 release 版本下载支持 -->
<releases>
<enabled>true</enabled>
</releases>
<!-- 是否开启该插件仓库的 snapshot 版本下载支持 -->
<snapshots>
<enabled>true</enabled>
</snapshots>
</pluginRepository>
</pluginRepositories>
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
</properties>
<!-- 默认该profile生效 -->
<activation>
<activeByDefault>true</activeByDefault>
</activation>
</profile>
</profiles>
以上配置中使用了一个 id 为 nexus 的 profile,这个 profile 中包含了与仓库相关的配置,同时配置中activeByDefault为true。当本机有 Maven 项目构建时,profile 中的仓库配置就会应用到项目中。配置当中的url就配置我们的仓库组地址即可:

Nexus 私服通常会与镜像(mirror)结合使用,使 Nexus 成为所有远程仓库的私服,这样不仅可以从 Nexus 中获取所有所需构件,还能将配置集中到 Nexus 私服中,简化 Maven 本身的配置。
我们可以创建一个匹配任何仓库的镜像,镜像的地址为 Nexus 中仓库的地址,这样 Maven 对于任何构件的下载请求都会被拦截跳转到 Nexus 私服中,在maven的setting.xml当中配置,其具体配置如下。
<mirrors>
<mirror>
<id>self-maven</id>
<name>nexus name</name>
<mirrorOf>*</mirrorOf>
<url>http://localhost:8081/repository/maven-public/</url>
</mirror>
</mirrors>
- d:之前server的id,访问仓库组也要拿用户名密码
- mirrorOf:
*代表所有的依赖都从私服找 - url:就是仓库组的,还是去仓库组右边copy即可
这样的话项目就完全依赖于nexus仓库了,假如一旦nexus挂了,整个项目都没办法下载包了,这时候可以将镜像替换为阿里云,这样一来除了公司内部包无法下载,最起码中央仓库的包还是可以下载的。
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
Nexus构件搜索

手动上传构件
(1)准备一个项目,版本号不要是SNAPSHOT版本的
(2)mvn clean install,进行打包

(3)在 Nexus 界面的upoad上传,默认是只允许上传releases仓库。

生成的就是一个带有该项目坐标的pom。

如果该jar包还有其他依赖,那么需要手动上传pom.xml文件,就不能点击上面的generate生成了,通过点击add another asset 增加,操作如下


也可以执行命令
mvn deploy:deploy-file \
-DgroupId=crypt -DartifactId=bic-iii \
-Dversion=1.2.4 -Dpackaging=jar \
-Dfile=bic-iii-1.2.22.jar \
-Durl=http://120.46.128.78:8081/repository/maven-releases \
-DrepositoryId=self-maven
mvn deploy:deploy-file \
-DgroupId=com.example \
-DartifactId=thirdparty \
-Dversion=1.0.0 \
-Dpackaging=jar \
-Dfile=path/to/your/thirdparty.jar \
-Durl=http://your-nexus-server/repository/your-repository/ \
-DrepositoryId=your-repository
关于nexus代理仓库状态

online-remote available:表示该被代理仓库可用
online-ready to connect:并不是代理仓库用不了。而是你根本还没有一个依赖去访问这个被代理仓库,nexus也不知道这个被代理仓库能不能用,所以它只能展示为待连接状态。
新建的代理仓库都是 online-ready to connect状态。
代理仓库还有一个如下配置:

Blocked:假如选中相相当于禁用该代理仓库。
Auto blocking:该配置:表示代理仓库会根据每次请求被代理仓库的响应来决定是否暂停请求这个被代理仓库,请求无响应就会block。
<?xml version="1.0" encoding="UTF-8"?>
<settings xmlns="http://maven.apache.org/SETTINGS/1.2.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.2.0 http://maven.apache.org/xsd/settings-1.2.0.xsd">
<localRepository>D:\\maven</localRepository>
<servers>
<server>
<!-- id标签可以随便填,只需要在servers中唯一即可,后面很多地方会使用该id -->
<id>self-maven</id>
<username>admin</username>
<password>Lr12138.+</password>
</server>
</servers>
<profiles>
<profile>
<id>nexus</id>
<!--声明一个或多个远程仓库 -->
<repositories>
<!-- 声明一个 Nexus 私服上的仓库 -->
<repository>
<!--仓库id,这个id就是上面配置的账号密码id -->
<id>self-maven</id>
<!-- 仓库的名称 -->
<name>nexus</name>
<!--仓库的地址 -->
<url>http://120.46.128.78:8081/repository/maven-public/</url>
<!-- 是否开启该仓库的 release 版本下载支持 -->
<releases>
<enabled>true</enabled>
</releases>
<!-- 是否开启该仓库的 snapshot 版本下载支持 -->
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
</repositories>
<!-- 声明一个或多个远程插件仓库 -->
<pluginRepositories>
<!--声明一个 Nexus 私服上的插件仓库 -->
<pluginRepository>
<!--插件仓库 id -->
<id>self-maven</id>
<!--插件仓库 名称 -->
<name>nexus</name>
<!-- 配置的插件仓库的地址 -->
<url>http://120.46.128.78:8081/repository/maven-public/</url>
<!-- 是否开启该插件仓库的 release 版本下载支持 -->
<releases>
<enabled>true</enabled>
</releases>
<!-- 是否开启该插件仓库的 snapshot 版本下载支持 -->
<snapshots>
<enabled>true</enabled>
</snapshots>
</pluginRepository>
</pluginRepositories>
<!-- 默认该profile生效 -->
<activation>
<activeByDefault>true</activeByDefault>
</activation>
</profile>
</profiles>
<mirrors>
<mirror>
<!-- 之前server的id,访问仓库组也要拿用户名密码-->
<id>self-maven</id>
<name>nexus name</name>
<!-- *代表所有的依赖都从私服找-->
<mirrorOf>*</mirrorOf>
<url>http://120.46.128.78:8081/repository/maven-public/</url>
</mirror>
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
</mirrors>
</settings>
修改内存大小
nexus官方配置里默认是2703M的内存占用,而如果你机器只有2G的话那么是跑不起来的,但是修改下jvm启动参数还是可以做到运行起来的。
启动nexus容器后停止服务修改配置参数
- 停止docker
service docker stop
- 复制docker容器ID后进入/var/lib/docker/containers/目录
# 列出所有的容器
docker ps -a
# 复制上容器ID
cd /var/lib/docker/containers/
# 筛选出容器完整ID(或者你cd 容器ID前缀再按TAB键后面的就自动补全了)
ll |grep 800902c098d2
# 拿到筛选出完整ID后进入容器ID目录
cd 800902c098d245ed33387153151f2de63367c7240860e9aa5ee658e65dbd7264/
- 编辑配置文件 vi config.json或者是vi config.v2.json
修改参数
xms是初始堆内存大小
xmx是最大堆内存大小
后面那个是触发FullGC的大小
我建议修改为2048,如果你电脑真的只有2G内存,那建议你修改成1900等数值,选择你合适的数字。
- 修改完后保存退出,再次启动docker服务
service docker start
#查看下占用内存情况
docer stats nexus

浙公网安备 33010602011771号