Nexus的简单使用及setting.xml、pom.xml配置
具体私库搭建可自行百度如:
https://blog.****.net/luozhonghua2014/article/details/81583510
本文主要简单介绍nexus及项目中的使用
Nexus介绍
Nexus是一个强大的Maven仓库管理器,它极大地简化了本地内部仓库的维护和外部仓库的访问。
Nexus在代理远程仓库的同时维护本地仓库,以降低*仓库的负荷,节省外网带宽和时间,Nexus私服就可以满足这样的需要。
Nexus是一套“开箱即用”的系统不需要数据库,它使用文件系统加Lucene来组织数据。
Nexus支持WebDAV与LDAP安全身份认证。
Nexus还提供了强大的仓库管理功能,构件搜索功能,它基于REST,友好的UI是一个extjs的REST客户端,它占用较少的内存,基于简单文件系统而非数据库。
为什么要构建Nexus私服?
如果没有Nexus私服,我们所需的所有构件都需要通过maven的*仓库和第三方的Maven仓库下载到本地,而一个团队中的所有人都重复的从maven仓库下载构件无疑加大了仓库的负载和浪费了外网带宽,如果网速慢的话,还会影响项目的进程。很多情况下项目的开发都是在内网进行的,连接不到maven仓库怎么办呢?开发的公共构件怎么让其它项目使用?这个时候我们不得不为自己的团队搭建属于自己的maven私服,这样既节省了网络带宽也会加速项目搭建的进程,当然前提条件就是你的私服中拥有项目所需的所有构件。
总之,在本地构建nexus私服的好处有:
1)加速构建;
2)节省带宽;
3)节省*maven仓库的带宽;
4)稳定(应付一旦*服务器出问题的情况);
5)控制和审计;
6)能够部署第三方构件;
7)可以建立本地内部仓库;
8)可以建立公共仓库
这些优点使得Nexus日趋成为最流行的Maven仓库管理器。
搭建Nexus私库需要配置Java环境
Nexus默认的仓库类型主要有以下三种:
group(仓库组类型):又叫组仓库,用于方便开发人员自己设定的仓库;
hosted(宿主类型):内部项目的发布仓库(内部开发人员,发布上去存放的仓库);
proxy(代理类型):从远程*仓库中寻找数据的仓库(可以点击对应的仓库的Configuration页签下Remote Storage Location属性的值即被代理的远程仓库的路径);
maven-central:maven*库,默认从https://repo1.maven.org/maven2/拉取jar
maven-releases:私库发行版(正式版本),用来部署管理内部的发布版本构件的宿主类型仓库
maven-snapshots:私库快照(调试版本),用来部署管理内部的快照版本构件的宿主类型仓库
maven-public:仓库分组,把上面三个仓库组合在一起对外提供服务,在本地maven基础配置settings.xml中使用。
仓库组通常包含了多个代理仓库和宿主仓库,在项目中只要引入仓库组就可以下载到代理仓库和宿主仓库中的包,也可以直接从宿主仓库、代理仓库下载。
自定义构建的仓库组代理仓库的顺序为(可理解为检索jar的顺序):releases,snapshots,3rd party,central。
Nexus默认的端口是8081,可以在etc/nexus-default.properties配置中修改。
Nexus默认的用户名密码是admin/admin123
使用Nexus时首先需要修改maven-releases仓库的Deployment pollcy为:Allow redeploy(登陆后才有设置按钮)
需要打包上传的模块下的pom.xml文件中添加如下配置(配置介绍在篇底):
<distributionManagement>
<repository>
<id>nexus</id>
<name>maven-releases</name>
<url>http://localhost:8081/repository/maven-releases/</url>
</repository>
<snapshotRepository>
<id>nexus</id>
<name>maven-snapshot</name>
<url>http://localhost:8081/repository/maven-snapshots/</url>
</snapshotRepository>
</distributionManagement>
name自定义,url对应maven-releases、maven-snapshots的地址
根据项目版本号判断上传相应的仓库如:
<version>0.0.1-SNAPSHOT</version>管理调试版本的仓库:maven-snapshots
<version>0.0.1</version>管理正式版本的仓库:maven-releases
Maven文件setting.xml中servers标签内添加如下配置:
<server>
<id>nexus</id>
<username>admin</username>
<password>admin123</password>
</server>
id对应pom.xml中id,用户名密码为nexus的用户密码
打包上传到私库(IDEA中):
需要下载用户上传私库中的jar时,在相关项目的需要依赖的模块下pom.xml添加如下配置:
<repositories>
<repository>
<id>nexus</id>
<name>maven-public</name>
<url>http://localhost:8081/repository/maven-public/</url>
</repository>
</repositories>
url为组仓库的地址
及相关依赖如:
<dependency>
<groupId>com.chengjia</groupId>
<artifactId>provider-service</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
pom.xml文件中<distributiomManagement>配置
<!-- 使用分发管理将本项目打成jar包,直接上传到指定服务器 -->
<distributionManagement>
<!--正式版本-->
<repository>
<!-- nexus服务器中用户名:在settings.xml中<server>的id-->
<id>nexus</id>
<!-- 这个名称自己定义 -->
<name>maven-releases</name>
<!-- 上传地址 -->
<url>http://localhost:8081/repository/maven-releases/</url>
</repository>
<!--快照,调试版-->
<snapshotRepository>
<id>nexus</id>
<name>maven-snapshot</name>
<url>http://localhost:8081/repository/maven-snapshots/</url>
</snapshotRepository>
</distributionManagement>
< repository >节点下的< id >对应maven的setting.xml文件中的server的id
<!--maven连接nexus需要验证用户名和密码,否则会报401错误-->
<servers>
...
<server>
<id>nexus</id>
<username>admin</username>
<password>admin123</password>
</server>
</servers>
当pom.xml中版本号后加上了-SNAPSHOT时,项目打包上传到地址:http://localhost:8081/repository/maven-snapshots/
<version>0.0.1-SNAPSHOT</version>
正式版本打包上传需要去掉-SNAPSHOT
maven的setting配置文件中mirror标签、pom.xml文件repository标签
repository标签
maven里有两种仓库,本地仓库和远程仓库。
远程仓库相当于公共的仓库,大家都能看到。
本地仓库是你本地的缓存副本,只有你看的到,主要起缓存作用。
当你向仓库请求插件或依赖的时候,会先检查本地仓库里是否有。
如果有则直接返回,否则会向远程仓库请求,并被缓存到本地仓库。
如果项目中没有配置仓库则默认请求的远程仓库为:http://repo1.maven.org/maven2
相当于pom.xlm配置:
<repository>
<snapshots>
<enabled>false</enabled>
</snapshots>
<id>central</id>
<name>Maven Repository Switchboard</name>
<url>http://repo1.maven.org/maven2</url>
</repository>
远程仓库可以在工程的pom.xml文件里指定:
<repositories>
<repository>
该镜像的唯一定义符
<id>nexus</id>
<name>maven-public</name>
构建系统会优先考虑使用该URL,而非使用默认的服务器URL
<url>http://localhost:8081/repository/maven-public/</url>
</repository>
</repositories>
mirror标签
mirror相当于一个拦截器,它会拦截maven对remote repository的相关请求,把请求里的remote repository地址,重定向到mirror里配置的地址。
如maven默认远程仓库地址为:http://repo1.maven.org/maven2,唯一定义符(id)为:central,我们想将仓库地址修改为:http://localhost:8081/repository/maven-public/可以在setting文件中的<mirrors>标签内添加如下配置:
<mirror>
<id>nexus</id>
<mirrorOf>central</mirrorOf>
<name>local nexus</name>
<url>http://localhost:8081/repository/maven-public/</url>
</mirror>
mirrorOf标签内容central是要替代的仓库的id。
高级镜像配置
为了满足一些复杂的需求,Maven还支持更高级的镜像配置:
1.<mirrorOf>*</mirrorOf>
匹配所有远程仓库。
2.<mirrorOf>external:*</mirrorOf>
匹配所有远程仓库,使用localhost的除外,使用file://协议的除外。也就是说,匹配所有不在本机上的远程仓库。
3.<mirrorOf>repo1,repo2</mirrorOf>
匹配仓库repo1和repo2,使用逗号分隔多个远程仓库。
4.<mirrorOf>*,!repo1</miiroOf>
匹配所有远程仓库,repo1除外,使用感叹号将仓库从匹配中排除。
需要注意的是,由于镜像仓库完全屏蔽了被镜像仓库,当镜像仓库不稳定或者停止服务的时候,Maven仍将无法访问被镜像仓库,因而将无法下载构件。