搭建Maven私服是一个架构师必备的基础技能,一般大中型互联网企业都会搭建自己的Maven私服,私服是一种特殊的远程仓库,它是架设在局域网内的仓库服务,私服代理广域网上的远程仓库,供局域网内的用户使用。当Maven需要下载构件的时候,它从私服请求,如果 私服上不存在该构件,则从外部远程仓库下载,缓存在私服上之后,再为Maven的下载请求提供服务。
Maven私服的优点
- 节省自己的外网带宽,大量对于外部仓库的重复请求会消耗带宽,利用私服代理外部仓库,可以消除对外的重复构件下载,降低带宽的压力。
- 加速Maven构建,不停地连接请求外部仓库十分的耗时,Maven在执行构建的时候不停地检查远程仓库的数据。利用私服,Maven只检查局域网的数据,提高构建的速度。
- 部署自己内部的第三方构件,当某个构件无法从任何一个外部远程仓库获得。建立私服之后,便可以将这些构件部署到私服,供内部的Maven项目使用。
- 提高稳定性,增强控制, Maven构建高度依赖于远程仓库,因此,当网络不稳定的时候,Maven构建也会变得不稳定,甚至无法构建。私服缓存了大量构建,即使暂时没有网络,Maven也可以正常的运行。
- 降低中央仓库的负荷,使用私服可以避免很多对中央仓库的重复下载,降低中央仓库的压力。
随着微服务、分布式的兴起,一个项目被拆分为n个应用进行部署,应用之间彼此互相依赖,比如一个服务一般会对外提供一个服务列表供外部调用,而这个服务列表一般是以jar包的形式,搭建了Maven私服,可以方便的从私服上下载其他服务的jar包,提供开发效率。
注意:Maven私服一般搭建在公司的内网,无法通过外网访问。
Nexus
Nexus是Maven仓库管理器,也可以叫Maven的私服。Nexus是一个强大的Maven仓库管理器,它极大地简化了自己内部仓库的维护和外部仓库的访问。利用Nexus你可以只在一个地方就能够完全控制访问和部署在你所维护仓库中的每个Artifact。Nexus是一套“开箱即用”的系统不需要数据库,它使用文件系统加Lucene来组织数据。
如下是Maven私服的工作方式
Docker搭建Maven私服
第一步,安装Nexus
docker pull sonatype/nexus3
第二步,启动Nexus
docker run -d -p 8081:8081 --name nexus -v /home/nexus-data:/var/nexus-data --restart=always sonatype/nexus3
第三步,访问http:ip:8081/即可访问Nexus
第四步,点击右上角Sign IN登录,默认用户名密码网上都是说的admin/admin123,这里提示的是admin.password中的密码,我们可以使用docker查找一下
sudo docker exec -it 3ad11ac2dbe6 /bin/bash
使用此命令进入容器内部,3ad11ac2dbe6是容器ID,
bash-4.4$ cd /nexus-data/
bash-4.4$ vi admin.password
这个字符串就是默认密码。
第五步,登录成功按照提示修改密码即可。
第六步,查看Nexus创建的默认仓库
这里解释一下这些仓库类型的含义:
- proxy:远程仓库的代理,比如说nexus配置了一个central repository的proxy,当用户向这个proxy请求一个artifact的时候,会现在本地查找,如果找不到,则会从远程仓库下载,然后返回给用户。
- hosted:宿主仓库,用户可以把自己的一些仓库deploy到这个仓库中。
- group:仓库组,是nexus特有的概念,目的是将多个仓库整合,对用户暴露统一的地址,这样就不需要配置多个仓库地址。
第七步,创建仓库
创建仓库,点击Create repository,然后选择maven2(hosted)然后输入仓库名称test-repository。在version policy中选择这个仓库的类型,这里选择release,在Deployment policy中选择Allow redeploy。
第八步,创建用户
第九步,测试应用推送到Nexus,修改Maven的配置文件settings.xml,添加私服的配置
<servers>
<server>
<id>test-repository</id>
<username>testuser</username>
<password>testuser</password>
</server>
</servers>
第十步,创建一个Maven项目,命名为nexusdemo1,并提供一个方法sayHello
第十一步,修改Idea的Maven配置
第十二步,修改pom文件指定仓库地址
<?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>com.curise.nexus</groupId>
<artifactId>nexusdemo1</artifactId>
<version>1.0-RELEASE</version>
<!--指定仓库地址-->
<distributionManagement>
<repository>
<!--此名称要和settings.xml中设置的ID一致-->
<id>test-repository</id>
<url>http://192.168.1.10:8081/repository/test-repository/</url>
</repository>
</distributionManagement>
<build>
<plugins>
<!--发布代码Jar插件-->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-deploy-plugin</artifactId>
<version>2.7</version>
</plugin>
<!--发布源码插件-->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<version>2.2.1</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>jar</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
注意:版本必须是RELEASE,因为仓库设置的类型为RELEASE
url是如下图的内容:
第十三步,打包发布到私服,如果你使用mvn deploy命令的方式发布,需要注意环境变量的Maven地址是否指向了此项目使用的Maven地址。
第十四步,回到网站搜索nexusdemo1jar包,至此就已经成功把jar包发布到Maven私服
第十五步,测试从Maven私服下载依赖,先从本地仓库删除掉nexusdemo1jar包
第十六步,创建Maven项目引入此nexusdemo1依赖,注意仓库地址用的repositories标签
第十七步,测试