一:基本概念
本地仓库
:
Maven一个很突出的功能就是jar包管理,一旦工程需要依赖哪些jar包,只需要在Maven的pom.xml配置一下,该jar包就会自动引入工程目录。初次听来会觉得很神奇,下面我们来探究一下它的实现原理。
首先,这些jar包肯定不是没爹没娘的孩子,它们有来处,也有去处。集中存储这些jar包(还有插件等)的地方被称之为
仓库
(Repository)。
不管这些jar包从哪里来的,必须存储在自己的电脑里之后,你的工程才能引用它们。类似于电脑里有个客栈,专门款待这些远道而来的客人,这个客栈就叫做
本地仓库
。
比如,工程中需要依赖spring-core这个jar包,在pom.xml中声明之后,maven会首先在本地仓库中找,如果找到了很好办,自动引入工程的依赖lib库即可。可是,万一找不到呢?实际上这种情况经常发生,尤其初次使用maven的时候,本地仓库肯定是空无一物的,这时候就要靠maven大展神通,去远程仓库去下载。
远程仓库
:
说到远程仓库,先从最核心的中央仓库开始,中央仓库是默认的远程仓库,maven在安装的时候,自带的默认中央仓库地址为
http://repo1.maven.org/maven2/
,此仓库由Maven社区管理,包含了绝大多数流行的开源Java构件,以及源码、作者信息、SCM、信息、许可证信息等。一般来说,简单的Java项目依赖的构件都可以在这里下载到。Maven社区提供了一个中央仓库的搜索地址:
http://search.maven.org/#browse
,可以查询到所有可用的库文件。
除了中央仓库,还有其它很多公共的远程仓库,如中央仓库的
镜像仓库
。全世界都从中央仓库请求资源,累死宝宝了,所以在世界各地还有很多中央仓库的镜像仓库。镜像仓库可以理解为仓库的副本,会从原仓库定期更新资源,以保持与原仓库的一致性。从仓库中可以找到的构件,从镜像仓库中也可以找到,直接访问镜像仓库,更快更稳定。
除此之外,还有很多各具特色的公共仓库,如果需要都可以在网上找到,比如Apache Snapshots仓库,包含了来自于Apache软件基金会的快照版本。
一般来讲,公司都会通过自己的私有服务器在局域网内架设一个仓库代理。
私服可以看作一种特殊的远程仓库
,代理广域网上的远程仓库,供局域网内的Maven用户使用。当Maven需要下载构件的时候,先从私服请求,如果私服上不存在该构件,则从外部的远程仓库下载,缓存在私服上之后,再为Maven的下载请求提供服务。
Maven私服有很多好处:
1.可以把公司的私有jar包,以及无法从外部仓库下载到的构件上传到私服上,供公司内部使用;
2.节省自己的外网带宽:减少重复请求造成的外网带宽消耗;
2.加速Maven构建:如果项目配置了很多外部远程仓库的时候,构建速度就会大大降低;
4.提高稳定性,增强控制:Internet不稳定的时候,maven构建也会变的不稳定,一些私服软件还提供了其他的功能
当前主流的maven私服有Apache的Archiva、JFrog的Artifactory以及Sonatype的
Nexus
。
上面提到的中央仓库、中央仓库的镜像仓库、其他公共仓库、私服都属于远程仓库的范畴。
如果maven没有在本地仓库找到想要的东西,就会自动去配置文件中指定的远程仓库寻找,找到后将它下载到你的本地仓库。如果连远程仓库都找不到想要的东西,maven很生气,累老子跑了一圈都没找到,肯定是你配置写错了,报错给你看。
Nexus
(发音[ˈnɛksəs],英文中代表“中心、魔枢”的意思)
是“开箱即用”的系统,不需要数据库,它使用文件系统加 Lucene 来组织数据,支持 WebDAV 与 LDAP 安全身份认证。Nexus 还提供了强大的仓库管理功能,构件搜索功能,它基于 REST,友好的 UI 是一个 extjs 的 REST 客户端,它占用较少的内存,基于简单文件系统而非数据库。Nexus 极大地简化了本地内部仓库的维护和外部仓库的访问。另外,Nexus 还可以在代理远程仓库的同时维护本地仓库,以降低中央仓库的负荷,节省外网带宽和时间。
本篇Nexus选择3.x版本,Nexus3.x相较2.x版本有很大的改变
-
从底层重构,从而提高性能,增强扩展能力,并改善用户体验
-
升级界面,增加更多的浏览、搜索和管理功能
-
提供安装包,使部署更简单(安装完自动添加成服务,省去手动添加的麻烦)
-
增加Docker、NuGet、npm、Bower的支持
-
提供新的管理接口,从而自动管理任务
-
注意:3.x版本只能运行在JVM8以上
总之,本地内部仓库在本地构建nexus私服的好处有
-
加速构建、稳定
-
节省带宽、节省中央maven仓库的带宽
-
控制和审计
-
能够部署第三方构件
-
可以建立本地内部仓库,可以建立公共仓库
这些优点使得Nexus日趋成为最流行的Maven仓库管理器。
![](https://i-blog.csdnimg.cn/blog_migrate/4c75bf2e7405e7ee15cc9aedd1fd7b5d.png)
二、进行安装
-
选用版本
centos 7.4
jdk 1.8
maven 3.5.2
nexus 3.9.0
-
验证java环境
java -version
![](https://i-blog.csdnimg.cn/blog_migrate/94307d79d914becdd2219c6138540f62.png)
-
创建管理用户(不是必须步骤,但为了更好管理,建议创建一个管理用户)
#使用root权限创建一个用户
adduser nexus
#给nexus用户添加sudo权限
# 1、给root添加写的权限
chmod u+w /etc/sudoers
# 2、编辑/etc/sudoers ,在root下添加nexus用户权限
nexus ALL=(ALL) ALL
# 3、保存后撤回写的权限
chmod u-w /etc/sudoers
-
下载nexus
# 切换nexus用户
su nexus
![](https://i-blog.csdnimg.cn/blog_migrate/225771f1c81c4d988794174473006613.png)
-
解压和安装
tar -zxvf nexus-3.9.0-01-unix.tar.gz
![](https://i-blog.csdnimg.cn/blog_migrate/798f6b827c2d8ac27772dc4bd61871a4.png)
#查看安装目录
ll nexus-3.9.0-01
# bin : 启动脚本和启动时的配置文件
# data : 数据存储目录
# etc : 配置文件
# lib : Apache Karaf的二进制包
# public : 公共资源
# System : 系统依赖的组件和插件
![](https://i-blog.csdnimg.cn/blog_migrate/c68191a734c2cbb793d7d6f2893360cf.png)
# 设置JDK版本(可选)
vim bin/nexus
![](https://i-blog.csdnimg.cn/blog_migrate/f6c810e3c19279bc8e34cda763f36cf3.png)
# 修改使用的用户(不建议使用root用户)
vim bin//nexus.rc
![](https://i-blog.csdnimg.cn/blog_migrate/c68191a734c2cbb793d7d6f2893360cf.png)
-
运行nexus
sh bin/nexus start
# 可选命令: {start|stop|run|run-redirect|status|restart|force-reload}
![](https://i-blog.csdnimg.cn/blog_migrate/43907eb67097b8ff2717e171c0b0b6ff.png)
-
验证安装,打开游览器输入: http://192.168.2.8:8081
-
注意是否开启了防火墙,如果开启了防火墙要将防火墙关闭或者设置8081端口通过
# 切换管理员帐户
su
# 设置8081端口
firewall-cmd --zone=public --add-port=8081/tcp --permanent
firewall-cmd --reload
-
当出现nexus主页说明已经安装成功,下面开始配置
![](https://i-blog.csdnimg.cn/blog_migrate/5f248b2b38a81377867321cda35e72e2.png)
-
将nexus添加到系统服务中在" /etc/systemd/system/"目录下新建 “ nexus.service”文件,将下面代码拷入
[Unit]
Description=nexus service
After=network.target
[Service]
Type=forking
# nexus安装目录
ExecStart=/opt/nexus/bin/nexus start
ExecStop=/opt/nexus/bin/nexus stop
User=nexus
Restart=on-abort
[Install]
WantedBy=multi-user.target
设置“
nexus.service”访问权限
chmod 755 nexus.service
添加到服务并启动
sudo systemctl daemon-reload
sudo systemctl enable nexus.service
sudo systemctl start nexus.service
三、配置Nexus
-
创建自己的代码仓库
点击Nexus“Sign in”,输入默认用户名(
admin)和默认密码(
admin123)登录,可以点击上面“设置”图标,在设置里面可以添加用户,角色,对接LDAP等设置
![](https://i-blog.csdnimg.cn/blog_migrate/68f8996c0badcf1cfc37942c4478def9.png)
点击“设置”
![](https://i-blog.csdnimg.cn/blog_migrate/05da78e141b60cf1bf9dc08bc22b837b.png)
-
添加角色
![](https://i-blog.csdnimg.cn/blog_migrate/8fdcd690463a3407ef697bc86c76df44.png)
-
添加用户并设置角色
![](https://i-blog.csdnimg.cn/blog_migrate/b39dfe4b1206724c3048027cf2c435d5.png)
创建完成后退出admin用户,验证deployment用户是否参加成功
切换回admin用户,点击Repository 下Repositorys创建仓库
![](https://i-blog.csdnimg.cn/blog_migrate/cb797098032c80dc336cff35def2f2db.png)
选择maven2(hostd)
![](https://i-blog.csdnimg.cn/blog_migrate/cb797098032c80dc336cff35def2f2db.png)
然后这里填写相关信息,创建仓库java
![](https://i-blog.csdnimg.cn/blog_migrate/c314bbabaeb5f9f0f49abfdbe82cf7ad.png)
查看创建的仓库
![](https://i-blog.csdnimg.cn/blog_migrate/4787c71b23b32c7b332e5be31e9847a9.png)
到此仓库就创建成功了
-
新增代理仓库
![](https://i-blog.csdnimg.cn/blog_migrate/3a809095ca7f33fd637c8b1829bba78b.png)
-
设置代理仓库
![](https://i-blog.csdnimg.cn/blog_migrate/1c76df9f004788d1e013ce8500e423a5.png)
-
Nexus仓库介绍
-
代理仓库(Proxy Repository) 顾名思义是代理第三方仓库,如 maven-central 、 nuget.org-proxy
-
版本策略(Version Policy)
-
Release:正式版
-
Snapshot:快照版本
-
Mixed:混合版本
-
-
布局策略:(Layout Policy)
-
Strict:严格
-
Permissive:宽松
-
-
-
宿主仓库(Hosted Repository) 存储本地上传的组件和资源的:如 maven-releases 、 maven-snapshots 、nuget-hosted
-
部署策略(Deployment Policy)
-
Allow Redeploy : 允许重新部署
-
Disable Redelop : 禁止重新部署
-
Read-Only : 只读
-
-
-
仓库组(Repository Group) 通常包含了多个代理仓库和宿主仓库,在项目中只要引入仓库组就可以下载到代理仓库和宿主仓库中的包,如: maven-public 、 nuget-group
-
四、与Maven集成
-
设置镜像库
<mirrors>
<mirror>
<!--该镜像的唯一标识符。id用来区分不同的mirror元素 -->
<id>nexus-public</id>
<!-- 所有仓库的构件都要从镜像下载 -->
<mirrorOf>*</mirrorOf>
<!-- 镜像名,起注解作用,应做到见文知意。可以不配置 -->
<name>nexus-public</name>
<!-- 私服的局域网地址-->
<url>http://192.168.2.9:8081/repository/maven-public/</url>
</mirror>
</mirrors>
节点<mirrors>下面可以配置多个镜像,<mirrorOf>用于指明是哪个仓库的镜像,上例中使用通配符“*”表明该私服是所有仓库的镜像,不管本地使用了多少种远程仓库,需要下载构件时都会从私服请求。
如果只想将私服设置成某一个远程仓库的镜像,使用<mirrorOf>指定该远程仓库的ID即可。
-
设置远程仓库
在<profiles><profile>节点中配置<repositories> 与<
pluginRepositories>
<profiles>
<profile>
<id>nexus-releases</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<repositories>
<repository>
<id>nexus-releases</id>
<name>nexus public repository</name>
<url>http://192.168.2.9:8081/repository/maven-public/</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>nexus</id>
<name>Nexus Plugin Repository</name>
<url>http://127.0.0.1:8081/repository/maven-public/</url>
<snapshots>
<enabled>true</enabled>
</snapshots>
<releases>
<enabled>true</enabled>
</releases>
</pluginRepository>
</pluginRepositories>
</profile>
</profiles>
可以配置多个远程仓库,用<id>加一区分,除此之外,
还有一个与<repositories>并列存在<pluginRepositories>节点,用来配置插件的远程仓库。
仓库主要存储两种构件。第一种构件被用作其它构件的依赖,最常见的就是各类jar包。这是中央仓库中存储的大部分构件类型。另外一种构件类型是插件,Maven插件是一种特殊类型的构件。由于这个原因,插件仓库独立于其它仓库。<pluginRepositories>节点与<repositories>节点除了根节点的名字不一样,子元素的结构与配置方法完全一样。
远程仓库有releases和snapshots两组配置,POM就可以在每个单独的仓库中,为每种类型的构件采取不同的策略。例如,有时候会只为开发目的开启对快照版本下载的支持,就需要把<releases>中的<enabled >设为“false”,而<snapshots>中的<enabled >设为“true”。
由于远程仓库的配置是挂在<profile>节点下面,如果配置有多个<profile>节点,那么就可能有多种远程仓库的设置方案,该方案是否生效是由它的父节点<profile>是否被激活决定的。
注意:
在开发中如果有严格的管理要求,可将SNAPSHOT和RELEASE单独配置
有插件依赖是配置插件仓库,默认会使用Maven中央仓库
-
设置发布权限
私服的作用除了可以给全公司的人提供maven构件的下载,还有一个非常重要的功能,就是开发者之间的资源共享。
一个大的项目往往是分模块进行开发的,各个模块之间存在依赖关系,比如一个交易系统,分为下单模块、支付模块、购物车模块等。现在开发下单模块的同学需要调用支付模块中的接口来完成支付功能,就需要将支付模块的某些jar包引入本地工程,才能调用它的接口;同时,开发购物车模块的同学需要调用下单模块的接口,来完成下单功能,他就需要依赖下单模块的某些jar包。这三个模块都在持续开发中,不可能将各自的源码传来传去支持对方的依赖。
解决的方式是这样,每个模块完成了某个阶段性的功能,都会将提供对外服务的接口打成jar包,传到公司的私服当中,谁要使用该模块的功能,只需要在pom.xml文件中声明一下,maven就会像下载其他jar包那样把它引入你的工程。
在开发过程中,在pom中声明的构件版本一般是快照版:
<dependency>
<groupId>com.viva.trade</groupId>
<artifactId>trade-pay</artifactId>
<version>1.0.2-SNAPSHOT</version>
</dependency>
各个模块会不断的上传新的jar包,如果本地项目依赖的是快照版,那么maven一旦发现该jar包有新的发布,就会将它下载下来替代以前的旧版本。比如,支付模块在测试的时候发现有个bug,修复了一下,然后将快照版发布到私服。而你只需要专注于下单模块的开发,所依赖的支付模块的更新由maven处理,不需要关心。一旦你开发的模块修复了一个bug,或者添加了一个新功能等修改,只需要将发布一次快照版本到私服即可,谁需要依赖你的接口谁自然会去私服下载,你也不用关心。
一般私服建立完毕之后不需要认证就可以访问,但是风险有多大,可以自己想象,比如有天女秘书不小心把她跟老板的艳照传到了私服,开发的同学就没心思干活了吧……所以私服的权限设置还是很有必要的。
这时就需要使用setting.xml中的servers元素了。需要注意的是,配置私服的信息是在pom文件中,但是认证信息则是在setting.xml中,这是因为pom文件往往是被提交到代码仓库中供所有成员访问的,而setting.xml是存放在本地的,这样是安全的。
在settings.xml中,配置具有发布发布版本和快照版本权限的用户:
-
在<servers>节点配置私服服务器
<servers>
<server>
<id>nexus-releases</id>
<username>deployment</username>
<password>deployment123</password>
</server>
<server>
<id>nexus-snapshots</id>
<username>deployment</username>
<password>deployment123</password>
</server>
</servers>
nexus-releases : 用于发布Release版本
nexus-snapshots : 用于发布Snapshots版本
Release版本与Snapshot版本的区分:
在项目中pom.xml 中设置的版本号添加SNAPSHOT标识都会发布为SNAPSHOT版本,没有
SNAPSHOT标识的都会发布为Release版本
SNAPSHOT版本会自动加一个时间作为标识,如:4.3.0-SNAPSHOT发布后变为4.3.0-20180305.114532-1.jar
上面的id是server的id,不是用户登陆的id,该id与distributionManagement中repository元素的id相匹配。maven是根据pom中的repository和distributionMnagement元素来找到匹配的发布地址:
-
在项目pom.xml中配置自动化部署构件
<distributionManagement>
<repository>
<id>nexus-releases</id>
<name>nexus public repository</name>
<url>http://192.168.2.9:8081/repository/maven-releases/</url>
</repository>
<snapshotRepository>
<id>nexus-snapshots</id>
<name>nexus public snapshots</name>
<url>http://192.168.2.9:8081/repository/maven-snapshots/</url>
</snapshotRepository>
</distributionManagement>
注意事项:
ID名称必须要与settings.xml中Server配置的ID名称保持一致
项目版本号中有SNAPSHOT标识的,会发布到Nexus Snapshots Repository ,否则发布到Nexus Release Repository ,并根据ID去匹配授权账号
-
部署到Nexus仓库
mvn deploy
五、与项目集成
这里我们使用IDEA新建一个Maven Project,命令为tests,并在其中新建一个类,供我们测试使用,配置pom.xml
<?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.0http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com</groupId>
<artifactId>tests</artifactId>
<version>1.0-SNAPSHOT</version>
<distributionManagement>
<repository>
<id>nexus-releases</id>
<name>nexus public repository</name>
<url>http://192.168.2.9:8081/repository/maven-releases/</url>
</repository>
<snapshotRepository>
<id>nexus-snapshots</id>
<name>nexus public snapshots</name>
<url>http://192.168.2.9:8081/repository/maven-snapshots/</url>
</snapshotRepository>
</distributionManagement>
<build>
<plugins>
<!-- 打jar包插件 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.0.2</version>
<configuration>
<classesDirectory>target/classes/</classesDirectory>
<archive>
<manifest>
<!-- 打包时 MANIFEST.MF文件不记录的时间戳版本 -->
<useUniqueVersions>false</useUniqueVersions>
<addClasspath>true</addClasspath>
<classpathPrefix>lib/</classpathPrefix>
</manifest>
<manifestEntries>
<Class-Path>.</Class-Path>
</manifestEntries>
</archive>
</configuration>
</plugin>
<!-- 打包源码插件 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<version>3.0.1</version>
<executions>
<execution>
<id>attach-sources</id>
<goals>
<goal>jar</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
路劲地址如下 copy
![](https://i-blog.csdnimg.cn/blog_migrate/8fdcd690463a3407ef697bc86c76df44.png)
然后使用maven命令打包上传Nexus
mvn clean source:jar package
mvn deploy -e
![](https://i-blog.csdnimg.cn/blog_migrate/dfb4dc9a4afae2c5db7ba9c229fabd1d.png)
到此上传成功
-
nexus镜像库
如果不在settings.xml中配置镜像库,在项目pom.xml中添加配置即可
<!-- nexus私服配置 -->
<repositories>
<repository>
<id>nexus</id>
<name>Nexus Repository</name>
<url>http://192.168.2.9:8081/repository/maven-public/</url>
<releases>
<enabled>true</enabled>
</releases>
<!--snapshots默认是关闭的,需要开启 -->
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>com</groupId>
<artifactId>tests</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
参考文档: