大家公司用的 Maven 私服就是这么搭建的

我是风筝,公众号「古时的风筝」,一个兼具深度与广度的程序员鼓励师,一个本打算写诗却写起了代码的田园码农! 文章会收录在 JavaNewBee 中,更有 Java 后端知识图谱,从小白到大牛要走的路都在里面。git

差很少全部的 Java 开发者应该都用过 Maven 的吧,若是你没用过,那可能你正在用的是 Gradle,若是这俩你都没用过,那就有点不太正常了。顺道说一句,在 Gradle 眼里,Maven 什么的都是垃圾。程序员

Maven 做为 Java 项目管理工具,它不只能够用做包管理,还有许多的插件,能够支持整个项目的开发、打包、测试、部署等一系列行为。github

而包管理又是其核心功能,除非是我的项目,咱们获取包都是从中央仓库或者 github 获取,可是公司项目呢,为了提供高速,通常都会搭建公司内部或者团队内部的 Maven 私服仓库。docker

为何要搭建私服

当咱们再 pom 文件中依赖了某个包后,若是在没有作特殊配置(也就是使用 maven 的默认配置)的状况下,Maven 会首先到本地仓库去搜索,若是本地仓库没有此依赖包,会到中央仓库获取,默认的中央仓库地址是 http://repo1.maven.org/maven2,服务器在国外,可想而知,速度是没办法保证的。有时候运气很差,晚上拉下来一个开源项目,执行 Maven 包安装,早上睡醒了一看,还没下载完,你说来气不。shell

固然国内也有相应的仓库,好比阿里的,速度仍是很好的。后端

可是通常来说,公司甚至团队内部都会搭建一个 Maven 私服,一来稳定性能够获得保证,再者,好比公司内部的一些基础包或者项目的经过工具包之类的,也能够放到上面来,从而提升项目开发的灵活度。浏览器

例如公司有一个底层工具包,没有私服的状况下,咱们拿到这个包,要将它安装到本地仓库,须要执行以下命令:bash

mvn install:install-file 
-Dfile=common-util-0.0.1-SNAPSHOT.jar 
-DgroupId=com.kite 
-DartifactId=common-util
-Dversion=0.0.1-SNAPSHOT 
-Dpackaging=jar

一旦作了修改,本地还须要从新执行命令,是否是很麻烦。服务器

私服搭建流程

Nexus 是用来搭建 Maven 私服的,能够说是最好的免费工具了,它的官网上是这样说的:“世界上第一个也是惟一的无偿使用的仓库解决方案”。目前的最新版本是 OSS 3.x。提供了针对 Windows、Unix、OS X 三种系统的版本。maven

这里只简单说明 Linux 下的安装方式,若是是下载的最新版本,它对系统内存和 jdk 版本是有要求的,要求内存大于4G,jdk 最低是1.8版本。

  1. 下载包,并解压缩,运行命令
tar -zxvf nexus-version-unix.tar.gz
  1. 进入 nexus-version/bin/`` 目录,执行命令 ./nexus start`

  2. 访问 默认的 8081 端口便可

没错,就是这么简单。

一般状况下,以上三步就能够完成安装,若是有问题,而且提示“ NOT RECOMMENDED TO RUN AS ROOT ”,能够经过修改 /bin/nexus 文件,在其中加入 RUN_AS_USER=root ,而后从新启动便可。

另外,若是是 docker 环境,能够直接获取 nexus 的镜像完成安装。例如我在 mac 上直接搜索了 nexus,而后下载并启动便可。

初识 Nexus

当咱们经过地址,在浏览器上访问 nexus 的首页,是下图这样子的:

默认的帐号名是 admin,密码是 admin123。管理员登陆后,能够在设置页面管理角色、用户等其余一系列的操做。例如建立一个角色,给角色设置某一仓库的管理权限,而后向这个角色中添加人员。具体操做不作过多介绍,一看就明白。

管理员还能够管理仓库,不过通常来讲,默认的那几个仓库就能够了。默认有以下几个仓库:

几种 type 是什么意思

proxy:这是代理方式,它是用来代理中央仓库的,例如咱们依赖的包在本地仓库没有,就会到私服获取,私服没有的话,会到中央仓库先把包下载到这里,而后再下载到本地仓库;

hosted:指的是咱们公司或团队内部的包,而且 hosted 类型的仓库会分为 releases 和 snapshots 两个,前者是正式版,后者通常是开发测试版;

group:它的目的就是把多个仓库组合起来,而后咱们项目中只须要配置上这个类型的仓库地址,就能够把它里面组合的几个仓库都关联上。

在项目中使用

获取依赖包

若是是普通项目成员,不须要向私服发布包的,只须要在 pom 文件中加入如下配置便可。

<repositories>
      <repository>
            <id>maven-public</id>
            <name>maven-public</name>
            <url>http://nexus.local:32768/repository/maven-public/</url>
            <snapshots>
               <enabled>true</enabled>
            </snapshots>
       </repository>
</repositories>

其中 id 要和你的仓库名称一致,url 就是私服的仓库地址,就是 type 为 group 的那个,它组合了一个 proxy 类型的和两个 hosted 类型的仓库。设置 snapshots 的 enabled 为ture,表示容许下载 snapshots 版本的包。

发布(deploy)包

  1. 若是须要向仓库中发布包的,首先须要对仓库有权限才能够,没有权限的用户是没办法发布的。

打开 maven 的配置文件 setting.xml ,找到 servers 节点,而后在其中添加一个 server 节点。

用户名和密码也能够是管理员帐号,或者管理员新建立的帐号,制药对仓库有添加权限便可。

<server>
            <id>nexus-releases</id>
            <username>admin</username>
            <password>admin123</password>
        </server>

        <server>
            <id>nexus-snapshots</id>
            <username>admin</username>
            <password>admin123</password>
        </server>

请注意上面的 id,一下子在 pom 文件中还会用到。

  1. 而后须要在 pom 文件中配置下面的内容:
<distributionManagement>
        <repository>
            <id>nexus-releases</id>
            <name>maven-releases</name>
            <url>http://nexus.local:8081/repository/maven-releases/</url>
        </repository>
        <snapshotRepository>
            <id>nexus-snapshots</id>
            <name>maven-snapshots</name>
            <url>http://nexus.local:8081/repository/maven-snapshots/</url>
        </snapshotRepository>
</distributionManagement>

咱们看到其中配置了一个 repository ,另外还有一个 snapshotRepository,上面表示的是 releases 版。一样注意 id 要和 setting.xml 里 server 下的 id 一致,否则会出现权限问题。url 分别指定 maven-releases 和 maven-snapshots 的地址。

只要在项目中配置 <version>1.0-SNAPSHOT</version> 这样,带有 SNAPSHOT 的就会到 snapshots 仓库,若是不加 SNAPSHOT 就会到 releases 仓库。

还有要注意的是,你要发布的包不该该是上级,也就是不能有 parent 依赖。不然在获取依赖的时候会有问题。

  1. 最后执行 mvn clean deploy 命令,便可发布包到私服仓库中。

经过以上配置和操做,就能够完成包的发布过程。

最后

若是你的团队内部用了本身的私服仓库,那基本上都是用的这种方式。若是使用过程当中出现什么问题,能够怀疑是私服是否是坏了。好比咱们团队中以前用的 Maven 私服就挂过。


壮士且慢,先给点个赞吧,老是被白嫖,身体吃不消!

我是风筝,公众号「古时的风筝」。一个兼具深度与广度的程序员鼓励师,一个本打算写诗却写起了代码的田园码农!你可选择如今就关注我,或者看看历史文章再关注也不迟。