建立私服的好处是?
可以降低中央仓库负荷、节省外网带宽、加速Maven构建、自己部署构件等,从而高效地使用Maven
三种专门的Maven仓库管理软件是?
1、Apache基金会的Archiva
2、JFrog的Artifactory
3、Sonatype的Nexus
Archiva是开源的,Artifactory和Nexus的核心也是开源的
Nexus也是当前最流行的Maven仓库管理软件
Nexus的由来
2005年12月,Tamas Cservenak由于受不了匈牙利电信ADSL的低速度,开始着手开发Proximity——一个很简单的Web应用,它可以代理并缓存Maven构件,当Maven需要下载构件的时候,就不需要反复依赖于ADSL
到了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)