首页 > 代码库 > Maven学习笔记(八):使用Nexus创建私服

Maven学习笔记(八):使用Nexus创建私服

     通过建立自己的私服,就可以降低中央仓库负荷、节省外网宽带、加速Maven构建、自己部署构件等,从而有效地使用Maven。Nexus是当前最流行的Maven仓库管理软件。     

   

Nexus简介:

     Nexus分为开源版和专业版,其中开源版本基于GPLv3许可证,其特性足以满足大部分Maven用户的需求。以下是一些Nexus开源版本的特性:
  • 较小的内存占用(最少仅为28M)
  • 基于ExtJS的友好界面
  • 基于Restlet的完全REST API
  • 支持代理仓库、宿主仓库和仓库组
  • 基于文件系统,不需要数据库
  • 支持仓库索引和搜索
  • 支持从界面上传Maven构件
  • 细粒度的安全控制
     Nexus专业版是需要付费购买的,除了开源版本的所有特性之外,它主要包含一些企业安全控制、发布流程控制等需要的特性。     

安装Nexus:

     Nexus是典型的Java web应用,它有两种安装包,一种是包含Jetty容器的Bundle包,另一种是不包含Web容器的war包。
下载Nexus:
     从http://www.sonatype.org/下载最新的nexus,当前可以下载最新的Bundle包是nexus-2.9.1-02-bundle.tar.gz或者nexus-2.9.1-02-bundle.zip,也可以下载war包nexus-2.9.1-02.war。
Bundle方式安装Nexus:
     Nexus的Bundle自带了Jetty容器,因此用户不需要额外的Web容器就能直接启动Nexus。首先将Bundle文件解压,这时就会得到如下两个子目录:
  • nexus-2.9.1-02/:该目录包含了Nexus运行所需要的文件,如启动脚本、依赖jar包等。
  • sonatype-work/:该目录包含Nexus生成的配置文件、日志文件、仓库文件等
     其中,第一个目录是运行Nexus所必需的,而且所有相同版本Nexus实例所包含的该目录内容都是一样的。而第二个目录不是必需的,nexus会将不同用户在不同机器上使用的Nexus的不同配置和仓库内容放在其中。当用户需要备份Nexus的时候,默认备份sonatype-work/目录,因为该目录包含了用户特定的内容。
     在Windows操作系统上,用户需进入nexus-2.9.1-02/bin/jsw/windows-x86-32/子项目,然后直接运行console-nexus.bat脚本就能启动Nexus。
     这时,打开浏览器访问http://localhost:8081/nexus/就能看到Nexus的界面。
     要停止Nexus,可以在命令行按Ctrl+C键。
     在nexus-2.9.1-02/bin/jsw/windows-x86-32/目录下还有其他一些脚本:
  • install-nexus.bat:将Nexus安装成Windows服务
  • uninstall-nexus.bat:卸载Neuxs Windows服务
  • start-nexus:启动Neuxs Windows服务
  • stop-nexus:停止Neuxs Windows服务
     借助Windows服务,用户就可以让Nexus伴随着Windows自动启动,非常方便。
     关于Bundle安装的一个常见问题是端口冲突。Nexus Bundle默认使用的端口是8081,如果该端口已经被其他应用程序占用,或者你想使用80端口开发Nexus服务,则编辑文件nexus-2.9.1-02/conf/plexus.properties,找到属性application-port,按需要将默认值8081改成其他端口号,然后保存该文件,重启Nexus便可。
WAR方式安装Nexus:
     Nexus还提供一个可以直接部署到Web容器中的war包。该包支持主流的Web容器,如Tomcat、Glassfish、Jetty和Resin。
     以tomcat为例,把war包放在tomcat的webapps目录下,然后启动tomcat。
     然后访问http://localhost:8080/nexus/就能看到Nexus的界面了。
登陆Nexus:
     Nexus的权限控制很完善,默认的Nexus访问都是匿名的,而匿名用户仅包含一些最基本的权限,要获得更高的权限,就必须以管理员方式登录。单击界面右上角的Log In进行登陆,Nexus的默认管理员用户名和密码为admin/admin123。


Nexus的仓库与仓库组:

     Nexus包含了各种类型的仓库概念,包括代理仓库、宿主仓库和仓库组等。每一种仓库都提供了丰富实用的配置参数,方便用户根据需要进行定制。
Nexus内置的仓库:
     单击Nexus界面左边导航栏中的Repository链接,就能在界面右边看到当前nexus所包含的所有仓库。
     从中可以看到仓库有四种类型:group(仓库组)、hosted(宿主)、proxy(代理)和virtual(虚拟)。此外仓库还有一个属性为Policy(策略),表示该仓库为发布(Release)版本仓库还是快照(Snapshot)版本仓库。最后两列的值为仓库的状态和路径。
     下面解释一下各个仓库的用途:
  • Maven Central:该仓库代理Maven中央仓库,其策略为Release,因此只会下载和缓存中央仓库中的发布版本构件。
  • Releases:这是一个策略为Releases的宿主类型仓库,用来部署组织内部的发布版本构件。
  • Snapshots:这是一个策略为Snapshot的宿主类型仓库,用来部署组织内部的快照版本构件。
  • 3rd party:这是一个策略为Release的宿主类型仓库,用来部署无法从公共仓库获得的第三方发布版本构件。
  • Apache Snapshots:这个一个策略为Snapshots的代理仓库,用来代理Apache Maven仓库的快照版本构件。
  • Codehaus SnapShots:这是一个策略为Snapshots的代理仓库,用来代理Cohehaus Maven仓库的快照版本构件。
  • Google Code:这是一个策略为Release的代理仓库,用来代理Google Code Maven仓库的发布版本构件。
  • java. net -Maven 2:这是一个策略为Release的代理仓库,用来代理java.net Maven仓库的发布版本构件。
  • Public Repository:该仓库组将上诉所有策略为Release的仓库聚合并通过一致的地址提供服务。
  • Public Snapshot Repositories:该仓库组将上述所有策略为Snapshot的仓库聚合并通过一致的地址提供服务。
Nexus仓库的分类的概念:
     示意图如下:

     从图中可以看到,Maven可以直接从宿主仓库下载构件;Maven也可以从代理仓库下载构件,而代理仓库会间接地从远程仓库下载并缓存构件;最后,为了方便,Maven可以从仓库组下载构件,而仓库组没有实际内容,它会转向其包含的宿主仓库或者代理仓库获得实际构件的内容。

Nexus的索引与构件搜索:

     对于Nexus我们常用的功能是搜索一个构件。Nexus通过维护一个索引来提供搜索功能,能在很大程度上方便Maven用户定位构件坐标。
     为了能够搜索Maven中央库,首先需要设置Nexus中Maven Central代理仓库下载远程索引。需要注意的是,默认这个配置的值是关闭的。


     有了索引,用户就可以搜索Maven构件了。Nexus左边导航栏有一个快捷搜索框,输入关键字就可以进行搜索了。          
     在搜索的结果中单击某一项,会在界面的下端浮出一个更具体的构件信息面板。

     该面板中除了显示构件的坐标,还包含了一段XML依赖声明,用户可以直接复制粘贴到项目的POM中。除了简单的关键字搜索,在Nexus中还提供了GAV搜索、类名搜索和检验和搜索等功能,用户可以单击搜索页面左上角的下拉菜单选择高级搜索功能:
  • GAV搜索(GAV Search) :允许用户通过设置GroupId、ArtifactId和Version等信息来进行更有针对性的搜索。
  • 类名搜索(Classname Search) :允许用户搜索包含某个Java类的构件。
  • 校验和搜索(checksum Search):允许用户直接使用构件的检验和来搜索该构件

配置Maven从Nexus下载构件:

     在POM中可以设置项目从私服中下载构件,但是实际应用中,我们通常想要所有项目都从私服中下载构件,这时就需要我们在setting.xml文件配置。setting.xml并不支持直接配置repositories和pluginRepositories,但是Maven能使用Profile机制,能让用户将仓库配置放到setting.xml的profile中。在实际应用中,我们希望的是所有下载请求都通过私服,所以我们还需要用到镜像的配置。
     配置范例如下:
<settings>
     ...
     <mirrors>
          <mirror>
               <id>nexus</id>
               <mirrorOf>*</mirrorOf>
               <url>http://localhost:8081/nexus/content/groups/public</url>
          </mirror>
     </mirrors>
     <profiles>
          <profile>
               <id>nexus</id>
               <repositories>
                    <repository>
                         <id>central</id>
                         <url>http://central</url>
                         <release><enabled>true</enabled></release>
                         <snapshots><enabled>true</enabled></snapshots>
                    </repository>
               </repositories>
                <pluginRepositories>
                    <repository>
                         <id>central</id>
                         <url>http://central</url>
                         <release><enabled>true</enabled></release>
                         <snapshots><enabled>true</enabled></snapshots>
                    </repository>
               </pluginRepositories>
          </profile>
     </profiles>
     <activeProfiles>
          <activeProfile>nexus</activeProfile>
     </activeProfiles>
     ...
</settings>
    这里的仓库及插件仓库配置,它们的id都为central,也就是说,覆盖了超级POM中央仓库的配置,它们的url已无关紧要,因为所有请求都会通过镜像访问私服地址。配置仓库及插件仓库的主要目的是开启对快照版本下载的支持,当Maven需要下载发布版或快照版构件的时候,它首先检查central,看该类型的构件是否支持,得到正面的回答之后,再根据镜像匹配规则转而访问私服仓库地址。

部署构件至Nexus:

     我们经常将组织内部的,或者一些无法从公共仓库中获得的第三方构件上传到宿主仓库中,供大家使用。用户可以配置Maven自动部署构件至Nexus的宿主仓库,也可以通过界面上传构件。
使用Maven部署构件至Nexus:
     日常开发生成的快照版本构件可以直接部署到Nexus中策略为Snapshot的宿主仓库中,项目正式发布的构件则应该部署到Nexus中策略为Release的宿主仓库中。下面展示一段典型的配置:
<project>
     ...
     <distributionManagement>
          <repository>
               <id>nexus-release</id>
               <name>Nexus Release Repository</name>
               <url>http://localhost:8081/nexus/content/repositories/</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中配置认证信息,如下:
<settings>     
     ...
     <servers>
          <server>   
               <id>nexus-release</id>
               <username>admin</username>
               <password>*****</password>
          </server>
               <id>nexus-snapshots</id>
               <username>admin</username>
               <password>*****</password>
     </servers>                    
     ...
</settings>
手动部署:
     有时,我们需要将手动部署构件到仓库中。
     要上传第三方构件,首先选择一个宿主仓库,然后在页面的下方选择Artifact Upload选项卡。在上传构件的时候,Nexus要求用户确认其Maven坐标,如果该构件是通过Maven构建的,那么可以在GAV Definition下拉列表中选择From POM,否则选择GAV Parameters,用户需要为该构件定义一个Maven坐标。


Maven学习笔记(八):使用Nexus创建私服