一、 安装私有仓库的好处:
好处总结:
- a项目组发布项目,b项目组引用。
- 对开源组件做二次开发,并代替远程仓库的开源组件
- 项目依赖提前缓存在私用仓库,减少服务器带宽
好处详解:
首先我们要明确一点,就是为什么我们要搭建Maven私服?
在很早之前,相信很多程序员,都经历过拷贝jar包到项目里的时代,这种方式不仅麻烦,而且还有很多弊端,比如说,jar包冲突、容易被人植入恶意代码,后面像maven这种项目构建工具逐渐流行起来了,大家通过maven来管理自己的项目的依赖,maven官方维护了一个中央仓库,官方将常见项目的依赖都放到了里面,通过这种方式,我们可以非常方便的在中央仓库,找到可靠、安全的项目依赖。
我们在日常开发中,写了一个比较好用的项目A,我们希望这个项目不仅仅能用到当前的项目中,并且希望公司的其他项目,甚至其他项目组都可以使用这个工具,如果把代码来回拷贝到其他项目,显然不是一个好的选择,如果这个项目发现了新的bug,只能通过替换代码的方式来修复bug。
除此之外,这个项目是有一定保密性质的,是不能对外开放的,基于以上这些原因那么我们就需要自己搭建maven私服,通过我们自己定义maven的GAV坐标,将我们自己开发的项目上传到maven私服,这样其他项目直接通过引入这个项目A的maven依赖,就可以像使用其他类库一样使用我们自己编写的项目了。
还有一种情况是,有一个开源项目公司正在使用,但是,出于业务的要求,我们需要针对这个开源项目做二次开发,这样我们就不能直接使用maven中央仓库的依赖了,此时也可以将二次开发的项目上传到maven私服供公司内部使用。
通过使用maven私服,可以加快我们搭建一个新项目的速度,私服还可以帮助缓存远程仓库的依赖来节省带宽。
二、准备工作
Nexus 是一个强大的、开箱即用的 Maven 仓库管理器,它极大地简化了本地内部仓库的维护和外部仓库的访问,本文将使用Nexus来搭建maven私服,在搭建之前我们先要做一些准备工作。
- 安装JDK,这里选择JDK8,安装过程不再赘述
- 安装maven,这里选择maven3.6.3,推荐3.6+
- Nexus版本选择Nexus3
https://link.zhihu.com/?target=https%3A//www.sonatype.com/products/repository-oss-downloadNexus
由于是国外的网站所以打开和下载速度都比较慢,下载太慢的同学可以从百度网盘中下载,提取码: n71a。
https://link.zhihu.com/?target=https%3A//pan.baidu.com/s/1Hl3u1hCVj8Equ4lioaITZw
三、搭建私服
将安装包拷贝到这个目录
# cp nexus-3.37.1-01-unix.tar.gz /usr/local
解压安装包
# tar -zxvf nexus-3.37.1-01-unix.tar.gz
启动Nexus
cd /usr/local/nexus-3.37.1-01/bin/
./nexus run &
我在启动的时候,遇到了端口号冲突,因为默认的端口8081已经被占用,
需要我们修改配置文件来修改Nexus的默认端口号,如果没有发生冲突则可以忽略这一步。
修改默认配置文件
# cd /usr/local/nexus-3.37.1-01/etc/
# vim nexus-default.properties
这里我将端口号修改为8889,保存配置重启项目。
启动成功,如图所示。
开启8889端口远程访问
firewall-cmd --zone=public --add-port=8889/tcp --permanent
success
重新加载防火墙配置
firewall-cmd --reload
就可以访问成功了
设置开机启动
# ln -s /usr/local/nexus-3.37.1-01/bin/nexus /etc/init.d/nexus3
# chkconfig --add nexus3
# chkconfig nexus3 on
设置运行用户为root
vim /usr/local/nexus-3.37.1-01/bin/nexus.rc
根据自身的需求可以去修改Nexus的数据和日志存储位置。
# vim /usr/local/nexus-3.37.1-01/bin/nexus.vmoptions
-XX:LogFile=../sonatype-work/nexus3/log/jvm.log
-Dkaraf.data=../sonatype-work/nexus3
-Dkaraf.log=../sonatype-work/nexus3/log
到这里,Nexus的搭建工作基本已经完成了。
三、配置Nexus
点击右上角进行登录
按照提示的路径去获取密码,用户名为admin。
登录成功之后按照指引重新设置新的密码,之后会让我们选择是否允许匿名访问也就是说不需要对访问的用户进行身份认证,这里选择不能匿名访问。
之后我们可以浏览系统里面已经存在的仓库,下面主要介绍下面这四个仓库的作用。
- maven-central:maven 中央库,默认从 http://repo1.maven.org/maven2 / 拉取 jar
- maven-releases:发行版依赖仓库
- maven-snapshots:快照依赖仓库
- maven-public:仓库分组,把上面三个仓库组合在一起对外提供服务,在本地 maven 基础配置 settings.xml 中使用。
从上图中,我们可以看到四个仓库的类型,我们来学习Nexus仓库的类型,Nexus 默认的仓库类型有以下四种:
- group(仓库组类型):又叫组仓库,用于方便开发人员自己设定的仓库;
- hosted(宿主类型):内部项目的发布仓库(内部开发人员,发布上去存放的仓库);
- proxy(代理类型):从远程中央仓库中寻找数据的仓库,可以去选择被代理的远程仓库;
- virtual(虚拟类型):虚拟仓库(这个基本用不到,主要使用上面三种类型的仓库);
点击设置图标,进入到仓库页面。
首先来看,maven-central这个仓库,它的类型是proxy,也就是代理其他远程仓库,打开配置确实这个仓库代理了maven中央仓库。
maven-releases和maven-snapshots这两个仓库分别表示快照仓库和发布版本的仓库,前面已经介绍过了,类型是普通类型的宿主仓库,如果不清楚快照和发布版本的区别,非常推荐看一本书——《maven实战》。
maven-public是一个组类型的仓库,打开它的配置可以看到,默认已经将上述三个仓库组合在一起了,一起对外部提供服务。
我们在这里创建一个新的proxy类型作为练习,我们去代理阿里云远程的镜像仓库,之后也组合到maven-public仓库上,这样我们下载依赖的速度也会提升,点击创建仓库。
选择代理类型的仓库
填写名称,填写代理远程仓库地址,点击下方按钮创建完成。
配置maven-public代理,并保存
到此为止,我们就已经配置好nexus。
四、如何使用私服?
首先我们来配置项目运行本地的settings.xml文件,首先配置server节点,设置对应的用户名和密码。这里server的id(注意不是用户登录的id),该id与distributionManagement中repository元素的id相匹配,后面会逐一介绍,maven需要指定仓库的依赖依赖,就会拿着我们配置好的用户名和密码去访问远程仓库。
<servers>
<server>
<id>nexus</id>
<username>admin</username>
<password>ll98765432</password>
</server>
<server>
<id>releases</id>
<username>admin</username>
<password>ll98765432</password>
</server>
<server>
<id>snapshots</id>
<username>admin</username>
<password>ll98765432</password>
</server>
</servers>
配置镜像
<mirror>
<id>nexus</id>
<mirrorOf>*</mirrorOf>
<url>http://10.211.55.161:8889/repository/maven-public</url>
</mirror>
配置profile,第一个profile指定运行环境为jdk1.8,第二个profile指定maven私服仓库,这里设置的仓库的id就是和上面server标签中设置的id进行匹配的,并且开启了下载snapshot构件和release构件,最后激活了上面设置的两个profile。
<profile>
<!--ID用来确定该profile的唯一标识-->
<id>jdk-1.8</id>
<activation>
<activeByDefault>true</activeByDefault>
<jdk>1.8</jdk>
</activation>
<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>
<profile>
<!--profile 的 id-->
<id>dev</id>
<repositories>
<repository>
<!--仓库 id,repositories 可以配置多个仓库,保证 id 不重复-->
<id>nexus</id>
<!--仓库地址,即 nexus 仓库组的地址-->
<url>http://10.211.55.161:8889/repository/maven-public/</url>
<!--是否下载 releases 构件-->
<releases>
<enabled>true</enabled>
</releases>
<!--是否下载 snapshots 构件-->
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
</repositories>
<pluginRepositories>
<!-- 插件仓库,maven 的运行依赖插件,也需要从私服下载插件 -->
<pluginRepository>
<!-- 插件仓库的 id 不允许重复,如果重复后边配置会覆盖前边 -->
<id>nexus-public</id>
<name>Public Repositories</name>
<url>http://10.211.55.161:8889/repository/maven-public/</url>
</pluginRepository>
</pluginRepositories>
</profile>
</profiles>
<activeProfiles>
<!-- 激活的profile -->
<activeProfile>dev</activeProfile>
<activeProfile>jdk-1.8</activeProfile>
</activeProfiles>
新建一个common-util的项目,正如这个项目的名字,它是一个通用的工具,我们要将它上传到maven私服,让其他引用它的项目使用它。
项目pom.xml配置如下,distributionManagement标签中配置的是发布项目时,正式的仓库和快照仓库,当我们执行mvn deploy命令的时候,会根据我们项目的版本号来判定会发布到哪个仓库,如下,现在项目的版本是SNAPSHOT的,所以deploy会被发布到snapshots仓库。
<?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.wzy</groupId>
<artifactId>common-util</artifactId>
<version>1.0.0-SNAPSHOT</version>
<!-- 构件执行deploy命令时,发布到的目的库,根据版本号是否以-SNAPSHOT结束来判断 -->
<distributionManagement>
<!-- 项目正式库 -->
<repository>
<id>releases</id>
<name>nexus-releases</name>
<url>http://10.211.55.161:8889/repository/maven-releases/</url>
</repository>
<!-- 代码快照版本库(版本号以SNAPSHOT结尾的构件) -->
<snapshotRepository>
<id>snapshots</id>
<name>nexus-snapshots</name>
<url>http://10.211.55.161:8889/repository/maven-snapshots/</url>
</snapshotRepository>
</distributionManagement>
</project>
我们在项目中编写一个工具类,这个类内容并不重要,主要为了展示给其他项目使用,内容如下:
package com.wzy;
/**
* 字符串工具类
* @author wzy
* @version 1.0
* @date 2022/5/25 11:01 下午
*/
public class CustomStringUtils {
/**
* 判断字符串是否为空
* @param targetStr 目标字符串
* @return 是否为空
*/
public static boolean isNotBlank(String targetStr) {
return targetStr != null &&
targetStr.length() > 0 &&
!"".equals(targetStr.trim());
}
}
点击deploy命令,即可发布到私服的快照仓库。
打开Nexus3,查看maven-snapshots仓库,看到了的依赖。
新建一个my-project项目
引入common-util项目的maven依赖,pom文件如下,并reimport重新导入依赖。
<?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.wzy</groupId>
<artifactId>my-project</artifactId>
<version>1.0.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>com.wzy</groupId>
<artifactId>common-util</artifactId>
<version>1.0.0-SNAPSHOT</version>
</dependency>
</dependencies>
</project>
编写测试类,测试是否正常导入工具类,导入是正常的并且可以得到正确的运行结果。
package com.wzy;
/**
* 测试主方法
* @author wzy
* @version 1.0
* @date 2022/5/25 11:27 下午
*/
public class Main {
public static void main(String[] args) {
String targetStr1 = " ";
String targetStr2 = "hello";
System.out.println(CustomStringUtils.isNotBlank(targetStr1));
System.out.println(CustomStringUtils.isNotBlank(targetStr2));
}
}
运行结果:
五、总结
本文首先和大家探讨了,为什么要搭建一个私服,知道为什么要这么做,才能更好的理解整个过程,后面介绍了如何搭建、配置、使用私服,希望看到这篇文章的小伙伴都能动手实践一下,搭建maven私服本身并不难,但需要结合maven相关的一些基础知识,如果对这方面不是很了解的同学可以看《Maven实战》这本书,相信你能找到你想要的答案。