3

使用Nexus建立私服

私服不是Maven的概念,它仅仅是一种衍生出来的特殊的Maven仓库。
建立私服,可以降低中央仓库负荷、节省外网带宽、加速Maven构建、自己部署构件等,从而高效地使用Maven。

安装与启动

Nexus是典型的Java Web应用,有两种安装方式:war和自带Jetty包。(未找到Nexus3.10.0-04的war包)
Ps:运行Nexus3.10.0-04需要jre8,本文环境如下:

安装平台 Nexus版本 JDK版本
windows64位 Nexus3.10.0-04 jdk1.8.0_121

1)下载安装

下载地址:https://www.sonatype.com/down...
官方文档:https://help.sonatype.com/rep...

下载到指定目录并解压,我们可以看到解压后有通常两个文件

nexus-x.x.x Nexus运行所需要的文件,如运行脚本,依赖jar包等
sonatype-work 该目录包含Nexus生成的配置文件、日志文件、仓库文件等

2)运行Nexus

首先进入Nexus的bin目录(当然你也可以配置到环境变量Path中),执行如下命令

nexus.exe /run 安装并启动Nexus,类似于编译工作,执行一次即可,安装完成会启动Nexus
nexus.exe /start 开启Nexus服务
nexus.exe /stop 关闭Nexus服务
nexus.exe /restart 重启Nexus服务
nexus.exe /status 查看Nexus运行状态
nexus.exe /install 安装Nexus到本地服务
nexus.exe /uninstall 卸载Nexus本地服务

卸载Nexus:确保Nexus服务未启动,本地服务未安装Nexus,删除Nexus整个目录即可。

访问Nexus:http://localhost:8081
默认端口为8081,可到 etc/nexus-default.properties 修改端口
默认管理员账户:admin admin123

配置Nexus

进入Nexus页面,可查看Browse界面,登录管理员账户后,可在Browse界面上传构件,并进入Administration页面

Browse 查找构件,查看远程仓库 【上传构件,需登录管理员账户】
Administration 登录管理员账户可见,可进行仓库配置、用户权限管理、日志管理、系统设置等等

1)关于内置仓库

Nexus内置了4个仓库:

Name Type Format Version Pollcy Blob store 说明
maven-central proxy maven2 Release default 代理中央仓库
maven-release hosted maven2 Release default 第三方发布版本仓库
maven-snapshots hosted maven2 Snapshot default 第三方快照版本仓库
maven-public group maven2 —— default 仓库组,包含以上三个仓库

关于仓库说明

Type 设置仓库的类型
proxy 代理类型,代理远程仓库,如阿里镜像
hosted 宿主类型,内部项目的发布仓库(公司内部人员,发布上去存放的仓库)
group 仓库组类型,又叫组仓库,方便开发人员自己设定的仓库
Format maven2 其实还有maven1格式,并有virtual(虚拟类型)与之对应,本文暂不涉及,仅供了解
Version Pollcy 指定仓库存储什么类型的构件
Release 发布版本
Snapshot 快照版本
Mixed 发布版本和快照版本
Blob store 指定仓库存储目录地址,可在Blob Stores中创建新的目录

Nexus仓库分类的概念
clipboard.png

2)配置仓库

进入Administration - Repositories - Create repository

推荐仓库配置

Name Type Format Version Pollcy Blob store 说明
maven-release hosted maven2 Release default 存放内部项目的发布仓库
maven-snapshots hosted maven2 Snapshot default 存放内部项目的快照仓库
3rd-party hosted maven2 Release default 存放无法从公共仓库获得的第三方发布版本的构件仓库
aliyun-nexus proxy maven2 Release default 代理阿里云仓库
http://maven.aliyun.com/nexus...
maven-central proxy maven2 Release default 代理中央仓库
https://repo1.maven.org/maven2/
maven-public group maven2 —— default 按管理上述仓库,按上述顺序排序。

3)部署Maven从Nexus下载构件

1 使用POM设置远程仓库 + 插件仓库(详情可查看《Maven》阅读总结(二)Maven仓库)
只对当前Maven项目有效

<project>
    ...
    <repositories>
        <!-- 远程仓库 -->
        <repository>
            <id>...</id>
            <name>...</name>
            <url>...</url>
            <releases>
                <enabled>...</enabled>    <!-- 是否支持 -->
                <updatePolicy>...</updatePolicy>    <!-- 更新策略 -->
                <checksumPolicy>...</checksumPolicy>    <!-- 检验策略 -->
            </releases>
            <snapshots>
                <enabled>...</enabled>
                <updatePolicy>...</updatePolicy>
                <checksumPolicy>...</checksumPolicy>
            </snapshots>
        </repository>
    </repositories>
    <!-- 插件远程仓库 -->
    <pluginRepositories>
        <pluginRepository>
            <id>...</id>
            <name>...</name>
            <url>...</url>
            <releases>
                <enabled>...</enabled>
                <updatePolicy>...</updatePolicy>
                <checksumPolicy>...</checksumPolicy>
            </releases>
            <snapshots>
                <enabled>...</enabled>
                <updatePolicy>...</updatePolicy>
                <checksumPolicy>...</checksumPolicy>
            </snapshots>
        </pluginRepository>
    </pluginRepositories>
    ...
</project>

2 使用settings.xml配置
settings.xml并不直接支持repositories和pluginRepositories,
Maven提供了Profile机制,能让用户将仓库配置放到settings.xml

<settings>
    ...
    <profiles>
        <profile>
            <id>...</id>    <!-- 指定profile的id,此profile包含了相关仓库配置 -->
            <repositories>
                <!-- 远程仓库 -->
                <repository>
                    <id>...</id>
                    <name>...</name>
                    <url>...</url>
                    <releases>
                        <enabled>...</enabled>    <!-- 是否支持 -->
                        <updatePolicy>...</updatePolicy>    <!-- 更新策略 -->
                        <checksumPolicy>...</checksumPolicy>    <!-- 检验策略 -->
                    </releases>
                    <snapshots>
                        <enabled>...</enabled>
                        <updatePolicy>...</updatePolicy>
                        <checksumPolicy>...</checksumPolicy>
                    </snapshots>
                </repository>
            </repositories>
            <!-- 插件远程仓库 -->
            <pluginRepositories>
                <pluginRepository>
                    <id>...</id>
                    <name>...</name>
                    <url>...</url>
                    <releases>
                        <enabled>...</enabled>
                        <updatePolicy>...</updatePolicy>
                        <checksumPolicy>...</checksumPolicy>
                    </releases>
                    <snapshots>
                        <enabled>...</enabled>
                        <updatePolicy>...</updatePolicy>
                        <checksumPolicy>...</checksumPolicy>
                    </snapshots>
                </pluginRepository>
            </pluginRepositories>
        </profile>
    </profiles>
    
    <activeProfiles>
        <!-- 激活指定Profile,当执行Maven构建时,激活的Profile会将仓库的配置应用到项目中 -->
        <activeProfile>...</activeProfile>    
    </activeProfiles>
    ...
</settings>

3 Maven镜像配置
在配置远程仓库和远程插件仓库后,Maven还是会访问中央仓库。
通过镜像配置,Maven对任何仓库的构件下载请求都会转到私服中。

<settings>
    ...
    <mirrors>
        <mirror>
            <id>nexus</id>    <!-- 匹配所有远程仓库,访问镜像仓库 -->
            <name>my nexus</name>
            <mirrorOf>*</mirrorOf>
            <url>http://localhost:8081/repository/maven-public/</url>
        </mirror>
    </mirrors>
    <profiles>
        <profile>
            <id>nexus</id>    <!-- 指定profile的id,此profile包含了相关仓库配置 -->
            <repositories>
                <!-- 远程仓库 -->
                <repository>
                    <id>central</id>    <!-- 覆盖超级POM中央仓库,开启快照版本支持 -->
                    <url>http://central</url>
                    <releases>
                        <enabled>true</enabled>
                    </releases>
                    <snapshots>
                        <enabled>true</enabled>
                    </snapshots>
                </repository>
            </repositories>
            <!-- 插件远程仓库 -->
            <pluginRepositories>
                <pluginRepository>
                    <id>central</id>    <!-- 覆盖超级POM中央插件仓库,开启快照版本支持 -->
                    <url>http://central</url>
                    <releases>
                        <enabled>true</enabled>
                    </releases>
                    <snapshots>
                        <enabled>true</enabled>
                    </snapshots>
                </pluginRepository>
            </pluginRepositories>
        </profile>
    </profiles>
    
    <activeProfiles>
        <!-- 激活指定Profile,当执行Maven构建时,激活的Profile会将仓库的配置应用到项目中 -->
        <activeProfile>nexus</activeProfile>    
    </activeProfiles>
    ...
</settings>

将远程仓库和插件仓库的id都设置为central,覆盖超级POM中央仓库的配置。
同时因为镜像配置,仓库和插件仓库的url已无关紧要,因为所有请求都会通过镜像访问私服地址。
配置仓库和插件仓库的主要目的是开启对快照版本下载的支持,当Maven需要下载发布版或快照版本时,它首先检查central,看该类型的构件是否支持,得到正面回答之后,再根据镜像匹配规则转而访问私服仓库地址。

4 部署构件至Nexus

1 使用Maven部署构件至Nexus

a)配置POM设置发布仓库 快照仓库

<project>
    ...
    <distributionManagement>
        <repository>
            <id>nexus-releases</id>
            <name>Nexus Release Repository</name>
            <url>http://localhost:8081/repository/maven-releases/</url>
        </repository>
        <snapshotRepository>
            <id>nexus-snapshots</id>
            <name>Nexus Snapshots Repository</name>
            <url>http://localhost:8081/repository/maven-snapshots/</url>
        </snapshotRepository>
    </distributionManagement>
    ...
</project>

b)Nexus的仓库对于匿名用户是只读的,实现部署构件,还需要在settings.xml中配置认证信息

<settings>
    ...
    <servers>
        <server>
            <id>nexus-releases</id>
            <username>admin</username>
            <password>******</password>
        </server>
        <server>
            <id>nexus-snapshots</id>
            <username>admin</username>
            <password>******</password>
        </server>
        <server>
            <id>3rd-party</id>
            <username>admin</username>
            <password>******</password>
        </server>
    </servers>
    ...
</settings>

2 手动部署第三方构件至Nexus
a)可在Nexus上传构件,设置坐标
b)使用mvn deploy:deploy-file插件目标

mvn deploy:deploy-file -Dfile=x -DgroupId=x -DartifactId=x -Dversion=x -Dpackaging=x -DrepositoryId=3rd-party -Durl=http://localhost:8888/repository/3rd-party/

roylion
204 声望25 粉丝

读书破万卷