创建私服的好处是?java
能够下降中央仓库负荷、节省外网带宽、加速Maven构建、本身部署构件等,从而高效地使用Mavenweb
三种专门的Maven仓库管理软件是?数据库
1、Apache基金会的Archiva缓存
2、JFrog的Artifactory安全
3、Sonatype的Nexus服务器
Archiva是开源的,Artifactory和Nexus的核心也是开源的网络
Nexus也是当前最流行的Maven仓库管理软件app
Nexus的由来eclipse
2005年12月,Tamas Cservenak因为受不了匈牙利电信ADSL的低速度,开始着手开发Proximity——一个很简单的Web应用,它能够代理并缓存Maven构件,当Maven须要下载构件的时候,就不须要反复依赖于ADSLwebapp
到了2007年,Sonatype邀请Tamas参与建立一个更酷的Maven仓库管理软件,这就是后来的Nexus
Nexus分为开源版和专业版
专业版...收费,除了开源版本的全部特性以外,主要包含一些企业安全控制、发布流程控制等须要的特性,地址http://www.sonatype.com/products/nexus/community
开源版本基于GPLv3许可证,其特性足以知足大部分Maven用户的须要
Nexus开源版本的特性
1、较小的内存占用(最少仅为28MB)
2、基于ExtJS的友好界面
3、基于Restlet的彻底REST API
4、支持代理仓库、宿主仓库和仓库组
5、基于文件系统,不须要数据库
6、支持仓库索引和搜索
7、支持从界面上传Maven构件
8、细粒度的安全控制
Nexus的两种安装包
1、一种是包含Jetty容器的Bundle包
2、另外一种是不包含Web容器的war包
下载Nexus
地址:http://nexus.sonatype.org/downloads/下载最新版本的Nexus
包含jetty容器的包,nexus-latest-bundle.zip、nexus-latest-bundle.tar.gz
不包含jetty容器的包,nexus-latest-webapp.war
使用Bundle方式安装Nexus
Nexus的Bundle自带Jetty容器,所以不须要额外的Web容器就能直接启动Nexus
解压该nexus-latest-bundle.zip,包含两个目录:
1、nexus-2.6.4-02,该目录包含了Nexus运行所须要的文件,如启动脚本、依赖jar包等
2、sonatype-work,该目录包含Nexus生成的配置文件、日志文件、仓库文件等
上面两个目录的进一步说明
1、第一个目录是运行Nexus所必须的
2、第二个目录不是必须的,Nexus会在运行的时候动态建立该目录,当用户须要备份Nexus时,默认备份sonatype-work目录,由于该目录包含了用户特定的内容
在Windows操做系统上启动Nexus
1、将nexus加入环境变量
2、打开:E:\maven\nexus\nexus-2.6.4-02\bin\jsw\conf\wrapper.conf
修改:wrapper.java.command=D:\Java\jdk1.7.0_03\bin\java
3、在命令行执行nexus install安装nexus服务
4、执行nexus start启动nexus服务
5、访问地址http://localhost:8081/nexus/
内置仓库有四种类型:group(仓库组)、hosted(宿主)、proxy(代理)和virtual(虚拟)
仓库格式有两种maven2和maven1
仓库的Policy(策略),表示该仓库为发布(Release)版本仓库仍是快照(Snapshot)版本仓库状态和路径等信息
注意:maven1格式的仓库省略,因为虚拟类型仓库的做用其实是动态地将仓库内容格式转换,也省略
Nexus内置的仓库介绍
1、Maven Central:该仓库代理Maven中央仓库,其策略为Release,所以只会下载和缓存中央仓库中的发布版本构件
2、Releases:这是一个策略为Release的宿主类型仓库,用来部署组织内部的发布版本构件
3、Snapshots:这是一个策略为Snapshot的宿主类型仓库,用来部署组织内部的快照版本构件
4、3rd party:这是一个策略为Release的宿主类型仓库,用来部署没法从公共仓库得到的第三方发布版本构件
5、Apache Snapshots:这是一个策略为Snapshot的代理仓库,用来代理Apache Maven仓库的快照版本构件
6、Codehaus Snapshots:这是一个策略为Snapshot的代理仓库,用来代理Codehaus Maven仓库的快照版本构件
7、Google Code:这是一个策略为Release的代理仓库,用来代理Google Code Maven仓库的发布版本构件
8、java.net - Maven 2:这是一个策略为Release的代理仓库,用来代理java.net Maven仓库的发布版本构件
9、Public Repositories:该仓库组将上述全部策略为Release的仓库聚合并经过一致的地址提供服务
10、Public Snapshot Repositories:该仓库组将上述全部策略为Snapshot的仓库聚合并经过一致的地址提供服务
举个简单的例子解释上面各类仓库之间的关系
假设某公司创建了Maven项目X,公司内部创建了Nexus私服,为全部Maven项目提供服务。项目X依赖于不少流行的开源类库如JUnit等,这些构件都能从Maven中央仓库得到,所以Maven Central代理仓库会被用来代理中央仓库的内容,并在私服上缓存下来,X还依赖某个Google Code的项目,其构件在中央仓库中不存在,只存在于Google Code的仓库中,所以上述列表中的Google Code代理仓库会被用来代理并缓存这样的构件。X还依赖于Oracle的JDBC驱动,因为版权的因素,该类库没法从公共仓库得到,所以公司管理员将其部署到3rd party宿主仓库中,供X使用。X的快照版本构件成功后会被部署到Snapshots宿主仓库中,供其余项目使用。当X发布正式版本的时候,其构件会被部署到Release宿主仓库中。因为X用到了上述列表中的不少仓库,为每一个仓库声明Maven配置又比较麻烦,所以能够直接使用仓库组Public Repositories 和Public Snapshot Repositproies,当X须要JUnit的时候,它直接从Public Repositories下载,Public Repositories会选择Maven Central提供实际的内容
建立Nexus宿主仓库
1、根据本身的须要填入仓库的ID和名称
2、Repository Type表示该仓库的类型
3、Provide用来肯定该仓库的格式,通常来讲,选择默认的Maven2 Repository
4、Default Local Storage Location表示该仓库的默认存储路径
5、Override Local Storage Location能够用来配置自定义的仓库目录位置
6、在Access Settings小组中,Deployment Policy用来配置该仓库的部署策略,选项有只读(禁止部署)、关闭从新部署(同一构件只能部署一次)以及容许从新部署
7、Allow File Browsing表示是否容许浏览仓库内容,通常选True
8、Include in Search表示是否对该仓库进行索引并提供搜索
9、Publish URL用来控制是否经过URL提供服务,若是选False,当访问该仓库的地址时,会获得HTTP 404 Not Found错误
10、Not Found Cache TTL 表示当一个文件没有找到后,缓存这一不存在信息的时间,以默认值1440分钟为例,若是某文件不存在,那么在以后的1440分钟内,若是Nexus再次获得该文件的请求,它将直接返回不存在信息,而不会查找文件系统。这么作是为了不重复的文件查找操做以提高性能
建立Nexus代理仓库
1、Repository Type的值为proxy
2、Remote Storage Location远程仓库地址
3、Download Remote Indexes表示是否下载远程仓库的索引,有些远程仓库拥有索引,下载其索引后,即便没有缓存远程仓库的构件用户仍是可以在本地搜索和浏览哪些构件的基本信息
4、CheckSum Policy配置校验和出错的策略,用户能够选择忽略、记录警告信息或者拒绝下载,当远程仓库须要认证的时候,这里的Authentication配置就能派上用场
5、Expiration Settings的Artifact Max Age和Metadata Max Age,其中前者表示构件缓存的最长时间,后者表示仓库元数据文件缓存的最长时间
6、Artifact Max Age默认值为-1,表示构件缓存后就一直保存着,再也不从新下载
7、Metadata Max Age默认值为1440分钟,表示每隔一天从新缓存代理的构件
8、Http Request Settings 配置Nexus访问远程仓库时HTTP请求的参数
建立Nexus仓库组
仓库组所包含的仓库的顺序决定了仓库组遍历其所含仓库的次序,所以最好将经常使用的仓库放在前面,当用户从仓库组下载构件的时候,就可以尽快地访问到包含构件的仓库
一个简单的需求,搜索
Maven中央仓库有几十万构件供用户使用,但有时咱们每每仅仅指导某个关键字,如Ehcache,而不知道其确切的Maven坐标。Nexus经过维护仓库的索引来提供搜索功能,能在很大程度上方便Maven用户定位构件所标
搜索Maven中央库
1、首先须要设置Nexus中的Maven Central代理仓库下载远程索引,将Download Remote Indexes设置成true默认是false
2、在左边导航栏中的Scheduled Tasks,点击能够看到系统调度任务,若是状态为RUNNING表示正在下载
3、Nexus界面左边导航栏有一个快捷搜索,在其中输入关键字后,单击搜索按钮就能快速获得搜索结果
关于中央仓库的索引的说明
1、有了中央仓库的索引,用户不只可以搜索构件,还可以直接浏览中央仓库的内容,这即是Nexus的索引浏览功能
2、在Repositories页面中,选择Browse Index选项卡,就能看到中央仓库内容的树形结构
3、搜索及浏览功能都是基于Nexus索引而实现的,确切地应该称之为nexus-indexer。
4、Nexus可以遍历一个Maven仓库全部的内容,搜集它们的坐标、校验和及所含的Java类信息,而后以nexus-indexer的形式保存起来。
5、中央仓库维护了这样的一个nexus-indexer,所以本地地Nexus下载到这个索引以后,就能在此基础上提供搜索和浏览等服务。
6、须要注意的是,不是任何一个公共仓库都提供nexus-indexer,对于那些不提供索引的仓库来讲,咱们就没法对其进行搜索
在POM中配置Nexus仓库
<project>
...
<repositories>
<repository>
<id>nexus</id>
<name>Nexus</name>
<url>http://localhost:8081/nexus/content/groups/public/</url>
<releases>
<enabled>true</enable>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
</repositores>
<pluginRepositories>
<pluginRepository>
<id>nexus</id>
<name>Nexus</name>
<url>http://localhost:8081/nexus/content/groups/public/</url>
<releases>
<enabled>true</enable>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</pluginRepository>
</pluginRepositores>
...
</project>
这样的配置只对当前的Maven项目有效,在好实际的应用中,咱们每每想要经过一次配置就能让本机全部的Maven项目都使用本身的Maven私服,这个时候就应该在settings.xml文件中进行配置
可是settings.xml并不支持直接配置repositories和pluginRepositories,所幸Maven还提供了Profile机制,能让用户将仓库配置放到settings.xml中的Profile
在settings.xml中配置Nexus仓库
<settings>
...
<profiles>
<profile>
<repositories>
<repository>
<id>nexus</id>
<name>Nexus</name>
<url>http://localhost:8081/nexus/content/groups/public/</url>
<releases>
<enabled>true</enable>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
</repositores>
<pluginRepositories>
<pluginRepository>
<id>nexus</id>
<name>Nexus</name>
<url>http://localhost:8081/nexus/content/groups/public/</url>
<releases>
<enabled>true</enable>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</pluginRepository>
</pluginRepositores>
</profile>
</profiles>
<activeprofiles>
<activeProfile>nexus</activeProfile>
</activeprofiles>
...
</settings>
对上述配置进行说明
1、该配置中使用了一个id为nexus的profile,这个profile包含了相关的仓库配置,同时配置中又使用activeProfile元素将nexus这个profile激活,这样当执行Maven构建的时候,激活的profile会将仓库配置应用到项目中
2、可是这样配置,Maven除了从Nexus下载构件以外,还会不时地访问中央仓库central,咱们但愿得是全部Maven下载请求都仅仅经过Nexus,以全面发挥私服的做用,这就须要借助镜像了
配置镜像让Maven只使用私服
<settings>
...
<mirrors>
<mirror>
<id>nexus</id>
<mirrorOf>*</mirrorOf>
<url>http://localhost:8081/nexus/content/groups/public</url>
</mirror>
</mirrors
...
</settings>
1、若是配置了镜像,全部的仓库配置都会失效
2、配置仓库及插件仓库的主要目的是开启对快照版本下载的支持
3、当Maven须要下载发布版或快照版构件的时候,它首先检查central,看该类型的构件是否支持,获得正面的回答以后,再根据镜像配置规则转而访问私服仓库地址
使用Maven部署构件至Nexus
平常开发生成的快照版本构件能够直接部署到Nexus中策略为Snapshot的宿主仓库中,项目正式发布的构件则应该部署到Nexus中策略为Release的宿主仓库中
配置Maven部署构件至Nexus
<project>
...
<distributionManagement>
<repository>
<id>nexus-releases</id>
<name>Nexus Releases Repository</name>
<url>http://localhost:8081/nexus/content/repositories/releases</url>
</repository>
<snapshotRepository>
<id>nexus-snapshots</id>
<name>Nexus Snapshots Repository</name>
<url>http://localhost:8081/nexus/content/repositories/snapshots</url>
</snapshotRepository>
</distributionManagement>
...
</project>
Nexus的仓库对于匿名用户是只读的,为了可以部署构件,还须要在settings.xml中配置认证信息
为部署构件至Nexus配置认证信息
<settings>
...
<servers>
<server>
<id>nexus-release</id>
<username>admin</username>
<password>*****</password>
</server>
<server>
<id>nexus-snapshots</id>
<username>admin</username>
<password>*****</password>
</server>
</servers>
...
</settings>
手动部署第三方构件至Nexus
1、某些Java Jar文件 (如Oracle)的JDBC驱动,因为许可证的因素,它们没法公开地放在公共仓库中,此外还有大量得小型开源项目,它们没有把本身的构件分发到中央仓库,也没有维护本身的仓库,所以也没法从公共仓库得到
2、这个时候用户就须要将这类构件手动下载到本地,而后经过Nexus的界面上传到私服
3、通常选择宿主仓库如3rd party,而后再页面的下方选择Artifact Upload选项卡。在上传构件的时候,Nexus要求用户肯定其Maven坐标,若是该构件是经过Maven构件的,那么能够在GAV Definition下拉列表中选择From POM,不然就选GAV Parameters
4、定义好坐标以后,单机Select Artifact(s) to Upload按钮从本机选择要上传的构件,而后单机Add Artifact按钮将其加入到上传列别中
5、Nexus循序用户一次上传一个主构件和多个附属构件(Classifier),单机页面下方的Upload Artifact(s)按钮将构件上传到仓库中
在组织中使用Nexus的时候每每会有一些安全性需求,例如但愿只有管理员才能配置Nexus,只有某些团队成员才能部署构件,或者更细一些的要求,例如每一个项目都有本身的Nexus宿主仓库,且只能部署项目构件至该仓库中
Nexus提供了全面的权限控制特性,能让用户自由的根据须要配置Nexus用户、角色、权限等
Nexus的访问控制模型
1、Nexus是基于权限(Privilege)作访问控制的,服务器的每个资源都有相应的权限来控制,所以用户执行特定的操做时就必须拥有必要的权限
2、管理员必须以角色 (Role)的方式将权限赋予Nexus用户
Nexus的预约义用户
Nexus预约义了三个用户,分别是admin、deployment、anonymous
这三个用户对应的三个权限级别:
1、admin,该用户拥有对Nexus服务的彻底控制,默认密码位admin123
2、deployment,该用户可以访问Nexus,浏览仓库内容,搜索,而且上传部署构件,可是没法对Nexus进行任何配置,默认密码为deployment123
3、anonymous,该用户对应了全部未登陆的匿名用户,它们能够浏览仓库并进行搜索
Nexus预约义的一些经常使用且重要的角色:
1、UI:Basic UI Privileges,包含了访问Nexus界面必须的最基本的权限
2、UI:Repository Browser,包含了浏览仓库页面所须要的权限
3、UI:Search,包含了访问快速搜索栏及搜索页面所须要的权限
4、Repo:All Repositories (Read),给予用户读取全部仓库内容的权限,没有仓库的度权限,用户将没法在仓库页面上看到实际的仓库内容,也没法使用Maven从仓库下载构件
5、Repo:All Repositores (Full Control),给予用户彻底控制全部仓库内容的权限。用户不只能够浏览,下载构件,还能够部署构件及删除仓库内容
6、Nexus Anonymous Role,特殊的匿名用户角色,默认配置下没有登陆的用户都会拥有该匿名角色的权限。这个匿名用户角色实际包含了上述所列角色中,除了Repo:All Repositories (Full Control)以外的全部角色所包含的权限。也就是说,匿名用户能够访问基本的Nexus界面、浏览仓库内容及搜索构件
7、UI:Logs and Config Files包含了访问系统日志及配置文件所须要的权限
Nexus包含的几种类型的调度任务
1、Download Indexes:为代理仓库下载远程索引
2、Empty Trash:清空Nexus的回收站,一些操做 (如删除仓库文件)实际是将文件移到了回收站中
3、Evict Unused Proxied Items From Repository Caches:删除代理仓库中长期未被使用的构建缓存
4、Expire Repository Caches:Nexus为代理仓库维护了远程仓库的信息以免没必要要的网络流量,该任务清空这些信息以强制Nexus去从新获取远程仓库的信息
5、Publish Indexes:将仓库索引起布成可供m2eclipse和其余Nexus使用的格式
6、Purge Nexus Timeline:删除Nexus的时间线文件,该文件用于创建系统的RSS源
7、Rebuild Maven Metadata Files:基于仓库内容从新建立仓库元数据文件maven-meta-data.xml,同时从新建立每一个文件的校验和md5和sha1
8、Reindex Repositories:为仓库编撰索引
9:Remove Snapshots From Repository:以可配置的方式删除仓库的快照构件
10:Synchronize Shadow Repository:同步虚拟仓库的内容 (服务于Maven 1)