私服简介
私服是架设在局域网的一种特殊的远程仓库,目的是代理远程仓库及部署第三方构件。有了私服之后,当 Maven 需要下载构件时,直接请求私服,私服上存在则下载到本地仓库;否则,私服请求外部的远程仓库,将构件下载到私服,再提供给本地仓库下载。

我们可以使用专门的 Maven 仓库管理软件来搭建私服,比如:Apache Archiva,Artifactory,Sonatype Nexus。这里我们使用 Sonatype Nexus。
Nexus是常用的私用Maven服务器,一般是公司内部使用。
安装Nexus
Nexus 专业版是需要付费的,这里我们下载开源版 Nexus OSS。Nexus 提供两种安装包,一种是包含 Jetty 容器的 bundle 包,另一种是不包含容器的 war 包。下载地址:http://www.sonatype.org/nexus/go下载2.x的文件。
###解压到本地磁盘  #### 使用管理员权限打开dos,在dos下执行命令安装私服  #### 启动服务  你可以通过nexus 查看有哪儿些命令!!! 访问私服url:http://localhost:8081/nexus/ 登陆:admin/admin123 ### 私服仓库类型 - hosted 宿主仓库:主要用于部署无法从公共仓库获取的构件(如 oracle 的 JDBC 驱动)以及自己或第三方的项目构件; - proxy 代理仓库:代理公共的远程仓库; - virtual 虚拟仓库:用于适配 Maven 1版本; - group 仓库组:Nexus 通过仓库组的概念统一管理多个仓库,这样我们在项目中直接请求仓库组即可请求到仓库组管理的多个仓库。  ### 搜索构件 为了更好的使用 Nexus 的搜索,我们可以设置**所有** proxy 仓库的 Download Remote Indexes 为 true,即允许下载远程仓库索引。  索引下载成功之后,在 Browse Index 选项卡下,可以浏览到所有已被索引的构件信息,包括坐标、格式、Maven 依赖的 xml 代码:  有了索引,我们就可以搜索了:  ### 配置Maven使用私服 私服搭建成功,我们就可以配置 Maven 使用私服,以后下载构件、部署构件,都通过私服来管理。 #### 上传jar包到私服: #### 1.在maven目录下conf/settings.xml.认证:配置用户名密码<!-- 在项目发布到私服的时候,会用到账号和密码或者在用第三方镜像的时候,也可能会用到账号和密码。 -->
<servers>
<server>
<id>releases</id>
<username>admin</username>
<password>admin321</password>
</server>
<server>
<id>snapshots</id>
<username>admin</username>
<password>admin321</password>
</server>
</servers>
2.在将要上传的项目的pom.xml中配置jar包上传路径url
<distributionManagement>
<repository>
<id>releases</id>
<url>http://localhost:8081/nexus/content/repositories/releases/</url>
</repository>
<snapshotRepository>
<id>snapshots</id>
<url>http://localhost:8081/nexus/content/repositories/snapshots/</url>
</snapshotRepository>
</distributionManagement>
注意:这两个id要对上,否则会因为找不到账号密码而没有权限上传文件:
3.执行命令发布项目到私服(上传)
命令:deploy
从私服下载jar包:
有两种:
第一:通过配置镜像实现,把settings.xml的mirror的地址配置为私服地址。用*拦截所有仓库请求。拦截所有仓库请求即本地仓库找不到就会从mirror私服里面查找。私服找不到,不会查找中央服务器。因为是拦截所有仓库请求。
第二:通过在pom.xml或者在setttings.xml中配置repositories。
第一种:
在 settings.xml 文件中,为所有仓库配置一个镜像仓库,镜像仓库的地址即私服的地址(这儿我们使用私服公共仓库组 Public Repositories 的地址):
<!-- 配置镜像,mirrorOf为*时是拦截所有的仓库请求,mirrorOf和pom.xml及settings.xml中的repositories有很大的关系。 -->
<!-- repositories的repository中的id就是仓库名,查找jar包顺序为,默认先查找本地仓库,本地仓库没有就查找repository的远程仓库中是否有该jar包,如果没有就从中央仓库(central)中查找。 -->
<!-- mirrorOf如果设置为*,那么就会拦截所有的repository仓库名的请求。 -->
<!-- 也就是说如果mirrorOf值设置为central,那么默认就只是拦截从中央仓库查找jar包的请求,即修改了默认中央仓库的地址 -->
<mirrors>
<mirror>
<id>nexus</id>
<mirrorOf>*</mirrorOf><!-- 建议别用*否则会拦截所有的仓库请求,如果url指定的服务器中没有该jar包,那么就麻烦了。一般设置为central,因为最后查找jar包的地址就是central。当然,你也可以把镜像的地址配置为私服的,然后把mirrorOf设置为*,因为私服是中央仓库、公司的jar包、第三方jar包的集合啊。-->
<url>http://{ip:port}/nexus/content/groups/public</url>
</mirror>
</mirrors>
扩展:Repository与Mirror
定义:
其实,mirror表示的是两个Repository之间的关系,在maven配置文件(setting.xml)里配置了<mirrors><mirror>..........</mirror></mirrors>,即定义了两个Repository之间的镜像关系。
目的
配置两个Repository之间的镜像关系,一般是出于访问速度和下载速度考虑。
例如, 有一个项目,需要在公司和住所都编码,并在项目pom.xml配置了A Maven库。在公司,是电信网络,访问A库很快,所以maven管理依赖和插件都从A库下载;在住所,是网通网络,访问A库很慢,但是访问B库很快。这时,在住所的setting.xml里,只要配置一下<mirrors><mirror>....</mirror></mirrors>,让B库成为A库的mirror,即可不用更改项目pom.xml里对于A库的相关配置。
如果该镜像仓库需要认证,则配置setting.xml中的<server></server>即可。
第二种:
在pom.xml中配置:
- repositories是用来下载依赖jar包的,如果想要下载插件,请使用另外的配置。
<!-- 公司Maven私服Nexus地址用于下载 -->
<repositories>
<repository>
<id>releases</id>
<name>Internal Releases</name>
<url>http://{ip:port}/nexus/content/repositories/releases</url>
</repository>
<repository>
<id>Snapshots</id>
<name>Internal Snapshots</name>
<url>http://{ip:port}/nexus/content/repositories/snapshots</url>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>plugs</id>
<url>私服地址</url>
</pluginRepository>
</pluginRepositories>
由于第二种方式是在pom.xml中配置的,只能够在当前项目中生效,如果想要所有项目都从私服中下载,请用下面的配置:
1、在maven目录下conf/settings.xml。配置模板
<profile>
<!--profile的id-->
<id>dev</id>
<repositories>
<repository>
<!--仓库id,repositories可以配置多个仓库,保证id不重复-->
<id>nexus</id>
<!--仓库地址,即nexus仓库组的地址-->
<url>http://localhost:8081/nexus/content/groups/public/</url>
<!--是否下载releases构件-->
<releases>
<enabled>true</enabled>
</releases>
<!--是否下载snapshots构件-->
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
</repositories>
<pluginRepositories>
<!-- 插件仓库,maven的运行依赖插件,也需要从私服下载插件 -->
<pluginRepository>
<!-- 插件仓库的id不允许重复,如果重复后边配置会覆盖前边 -->
<id>public</id>
<name>Public Repositories</name>
<url>http://localhost:8081/nexus/content/groups/public/</url>
</pluginRepository>
</pluginRepositories>
</profile>
2、激活模板
<activeProfiles>
<activeProfile>dev</activeProfile>
</activeProfiles>
提示:
<releases><enabled>true</enabled></releases>告诉Maven可以从这个仓库下载releases版本的构件,而<snapshots><enabled>false</enabled></snapshots>告诉Maven不要从这个仓库下载snapshot版本的构件。禁止从公共仓库下载snapshot构件是推荐的做法,因为这些构件不稳定,且不受你控制,你应该避免使用。当然,如果你想使用局域网内组织内部的仓库,你可以激活snapshot的支持。
关于<repositories>的更详细的配置及相关解释,请参考:http://www.sonatype.com/books/maven-book/reference_zh/apas02s08.html。
至于<pluginRepositories>,这是配置Maven从什么地方下载插件构件(Maven的所有实际行为都由其插件完成)。该元素的内部配置和<repository>完全一样,不再解释。
参考博客:(下面几篇博客很重要,你可以一篇一篇打开阅读,进行选择性阅读!!!)
http://www.jianshu.com/p/e4a3ab0298df
http://www.cnblogs.com/lzxianren/p/5142838.html
http://blog.youkuaiyun.com/isea533/article/details/21560089
http://blog.youkuaiyun.com/taiyangdao/article/details/52287856