Maven私服的搭建和应用
Maven私服的搭建和应用
私服概念
如果一个团队中有几百个人在开发一些项目,都是采用maven的方式来组织项目,那么我们每个人都需要从远程仓库中把需要依赖的构件下载到本地仓库,这对公司的网络要求也比较高,为了节省这个宽带和加快下载速度,可以在公司内部局域网内部可以架设一台服务器,这台服务器起到一个代理的作用,公司里面的所有开发者去访问这个服务器,这台服务器将需要的构件返回给我们,如果这台服务器中也没有需要的构件,那么这个代理服务器会去远程仓库中查找,然后将其先下载到代理服务器中,然后再返回给开发者本地的仓库。
此外,公司内部有很多项目之间会相互依赖,架构组的成员需要开发一些jar包给其他组使用。可以将自己jar发布到私服中给其他开发者使用,如果没有私服,可能需要手动发给别人或者上传到共享机器中,不过管理起来不是很方便。
私服优点
【1】加速maven构件的下载速度
【2】节省宽带,加速项目构建速度
【3】方便部署自己的构件以供他人使用
【4】提高maven的稳定性,中央仓库需要本机能够访问外网,而如果采用私服的方式,只需要本机可以访问内网私服
maven仓库管理软件:帮助搭建私服
- Apache基金会的archiva
- JFrog的Artifactory
- Sonatype的Nexus(常用)
私服搭建
1.Window10中安装Nexus私服
Nexus是java开发,有时需要依赖java环境(JDK环境)
下载完成后解压zip文件 ,运行解压后的nexus-3.66.0-02/bin目录下的nexus.exe
nexus.exe /run
如果启动过程输出下列异常可忽略
java.io.UnsupportedEncodingException: Encoding GBK is not supported yet (feel free to submit a patch)
浏览器中打开http://localhost:8081,登陆默认用户名为admin
,密码是第一次启动的时候自动生成的(参考密码文件位置:安装目录/sonatype-work/nexus3/admin.password)可以修改密码(修改为000000)
nexus默认启动端口号8081,可以修改nexus-3.66.0-02\etc\nexus-default.properties文件,修改默认配置
nexus(使用java开发的web项目),内置了jetty web容器,可以直接运行
2.Nexus仓库分类和使用
Nexus仓库分类
代理仓库
代理仓库主要是让使用者通过代理仓库来间接访问外部的第三方远程仓库的,如通过代理仓库访问
maven中央仓库、阿里的maven仓库等等。代理仓库会从被代理的仓库中下载构件,缓存在代理仓库中以供maven用户使用。
在nexus中创建一个阿里云的maven代理仓库,选择create repository
,选择maven2(proxy)
,随后输入远程仓库的信息
填充仓库信息,然后点击下方创建仓库确认
仓库名称:maven-aliyun
版本选择:Release,表示从这个仓库中下载稳定版的构件
阿里云仓库地址:https://maven.aliyun.com/repository/public
创建完成,随后在页面中查看创建好的仓库信息
宿主仓库
宿主仓库主要是给内部开发者用的,主要有2点作用
1)将私有的一些构件通过nexus中网页的方式上传到宿主仓库中给其他开发者使用
2)将自己开发好一些构件发布到nexus的宿主仓库中以供其他开发者使用
仓库组
maven用户可以从代理仓库和宿主仓库中下载构件至本地仓库,为了方便从多个代理仓库和宿主仓库下载构件,maven提供了仓库组,仓库组中可以有多个代理仓库和宿主仓库,而maven用户只用访问一个仓库组就可以间接的访问这个组内所有的仓库,仓库组中多个仓库是有顺序的,当maven用户从仓库组下载构件时,仓库组会按顺序依次在组内的仓库中查找组件,查找到了立即返回给本地仓库,所以一般情况会将速度快的放在前面。
仓库组内部实际上是没有构件内容的,他只是起到一个请求转发的作用,将maven用户下载构件的请求转发给组内的其他仓库处理。
nexus默认有个仓库组 maven-public :其核心内容包括仓库组URL、仓库组成员(对应不同的仓库),可以将自己创建的仓库配置到仓库组中
3.Maven配置从nexus下载构建
方式1:pom.xmll配置
配置说明
在网页中获取到仓库组对外地址
pom.xml配置(id自定义,不和本地Maven中央仓库冲突即可;url为访问的目标仓库URL)
<repositories>
<repository>
<id>maven-nexus</id>
<url>http://localhost:8081/repository/maven-public/</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
</repositories>
nexus私服需要有用户名和密码登录才能访问,需要有凭证,凭证需要在settings.xml文件中配置,在 ~/.m2/settings.xml
文件的 servers 元素中加入如下内容
<server>
<id>maven-nexus</id>
<username>admin</username>
<password>000000</password>
</server>
# 需注意此处的id对应需要和pom.xml中引用配置的id一致,通过id关联找到凭证信息
# username、password则根据私服设置去编辑
测试
1)创建一个Maven项目,随后参考上述内容配置pom.xml内容,检测配置即可
2)此处为了区分现有的maven配置,单独copy一份nexus-settings.xml
,修改对应本地仓库路径和server配置
<localRepository>E:\repo\maven-repo\nexus-repo\repo</localRepository>
<servers>
<!-- nexus私服配置 -->
<server>
<id>maven-nexus</id>
<username>admin</username>
<password>000000</password>
</server>
</servers>
<!-- 取消掉原有的镜像配置(原配置了中央仓库、aliyun仓库,现通过私服引入不需要配置这里,目的是为了测试是否能正常从私服加载数据) -->
<mirrors>
</mirrors>
如果镜像没有清理,则maven中看到的是多个仓库配置
项目maven配置:
随后在项目中配置pom.xml:配置仓库路径,并且引入一个jar测试是否能够正常引入
<dependencies>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.62</version>
</dependency>
</dependencies>
<repositories>
<repository>
<id>maven-nexus</id>
<url>http://localhost:8081/repository/maven-public/</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
</repositories>
执行maven compile指令(确认控制台输出是否从私服拉取内容)
方式2:镜像配置
配置maven文件
如果没有单独指定,默认是在用户目录下的 ~/.m2/settings.xml
(此处server的id和mirroes的id要一致方能构建)
<localRepository>E:\repo\maven-repo\nexus-repo\repo</localRepository>
<servers>
<!-- nexus私服配置 -->
<server>
<id>maven-nexus</id>
<username>admin</username>
<password>000000</password>
</server>
</servers>
<!-- 配置镜像 -->
<mirrors>
<mirror>
<id>mirror-nexus</id>
<mirrorOf>*</mirrorOf>
<name>nexus镜像</name>
<url>http://localhost:8081/repository/maven-public/</url>
</mirror>
</mirrors>
Maven项目pom.xml配置
此时maven项目中不需要单独配置仓库,只需要正常引入依赖即可,其会从setting中装配(修改了maven配置文件需要在Maven项目中刷新一下配置)
<dependencies>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.62</version>
</dependency>
</dependencies>
清理掉对应本地仓库中的com.alibaba内容,然后执行mvn compile
指令测试是否正常拉取
出现下面问题检查这个url是否可以正常访问,本地启动的nexus(不小心关掉了)导致访问出错,重启后再次访问重试
4.本地构建发布到私服
方式1:使用maven部署构建到私服
创建maven项目的时候,会有一个pom.xml文件,里面有个version元素,这个是这个构件的版本号,默认是 1.0-SNAPSHOT ,这个以 -SNAPSHOT 结尾的表示是个快照版本,叫做 SNAPSHOT 版本,快照版本一般是不稳定的,会反复发布、测试、修改、发布。而最终会有一个稳定的可以发布的版本,是没有 -SNAPSHOT 后缀的,这个叫做 release 版本。
而nexus私服中存储用户的构件是使用的宿主仓库,这个我们上面也有说过,nexus私服中提供了两个默认的宿主仓库分别用来存放 SNAPSHOT 版本和 release 版本,如下图:
操作步骤
1)修改pom.xml(对应URL参考nexus中配置)
<distributionManagement>
<repository>
<id>release-nexus</id>
<url>http://localhost:8081/repository/maven-releases/</url>
<name>nexus私服中宿主仓库->存放/下载稳定版本的构件</name>
</repository>
<snapshotRepository>
<id>snapshot-nexus</id>
<url>http://localhost:8081/repository/maven-snapshots/</url>
<name>nexus私服中宿主仓库->存放/下载快照版本的构件</name>
</snapshotRepository>
</distributionManagement>
2)修改settings.xml(配置对应 server,配置访问凭据)
<server>
<id>release-nexus</id>
<username>admin</username>
<password>000000</password>
</server>
<server>
<id>snapshot-nexus</id>
<username>admin</username>
<password>000000</password>
</server>
此处server的id分别对应pom.xml中的distributionManagement中不同版本的仓库配置
3)修改完成,执行mvn deploy指令
执行这个命令,会对构件进行打包,然后上传到私服
上传成功则访问:
http://localhost:8081/repository/maven-snapshots/(快照版本库)
http://localhost:8081/repository/maven-releases/(release版本库)
根据提示跳转,发现其在对应管理页下(因为version指定的版本是<version>1.0-SNAPSHOT</version>
,所以是将快照版本发到主仓库,如果要发布release版本则可修改version配置:)
发布的包如果要被其他开发者引用,则可查看jar对应的构件坐标
注意事项
snapshot属于快照版本,同一个snapshot版本的构件可以重复部署到私服中,如果私服中已经存在了则会进行覆盖掉。
而release是稳定版本的构件,重复部署会报错(这点可以验证一下)
方式2:手动部署第三方构建到私服
通过官网管理页面配置,比如第三方发的一个包,比如短信发送商的jar包,这个包远程仓库是不存在的,要把这个包上传到私服供所有开发使用
Maven项目自行mvn package
指令,随后在对应target包下查看生成的jar(将jar上传)(因为仓库对应的是release,所以此处要调整version生成相应的release版本)
此时会存在一个问题,因为前面已经通过mvn deploy发布了一个1.0release版本的,此处如果重复上传会提示错误(此处可以调整版本号信息,例如1.1)
上传完成,访问http://localhost:8081/#browse/browse:maven-releases