天天看点

Maven 使用Nexus创建私服

仓库管理软件: 

    私服不是maven的核心概念,它仅仅是一种衍生出来的特殊的maven仓库 

    有三种专门的maven仓库管理软件可以用来帮助大家建立私服: 

    apache基金会的archiva、jfrog的artifacotory和sonatype的nexus,archiva是开源的,artifacotory和nexus的核心也是开源的

    nexus分为开源版和专业版,开源版本基本gplv3许可证,其特性足以满足大部分maven用户的需要,特性如下: 

    较小的内存占用(最少仅为28mb) 

    基于extjs的友好界面 

    基于restlet的完全rest api 

    支持代理仓库、宿主仓库和仓库组 

    基于文件系统、不需要数据库 

    支持仓库索引和搜索 

    支持从界面上传maven构件 

    细粒度的安全控制

    nexus专业版本是需要付费购买的,对开源版本多如下特性: 

    一些专业安全控制 

    发布流程控制等需要的特性

安装nexus 

    nexus是典型的javaweb应用,它有两种安装包:包含jetty容器的bundle包,不包含web容器的war包 

    解压后直接运行即可

    解决压包含如下两个目录: 

    nexus-webapp-xxx:该目录包含了nexus运行所需要的文件,如启动脚本、依赖jar包等 

    sonatype-work:该目录包含nexus生成的配置文件、日志文件、仓库文件等

    其中,第一个目录是运行nexus所必需的,而且所有相同版本的nexus实例所包含的该目录内容都是一样的。 

    第二个目录不是必须的,是在运行的时候动态创建的 

    所以需要备份nexus的时候,默认备份sonatype-work目录就可以。

    在linux下面安装 

    warning - not recommended to run as root 

    **************************************** 

    if you insist running as root, then set the environment variable run_as_user=root before running this script

    在172.168.27.70服务器上操作 

    root用户操作(创建maven用户并赋权限) 

    groupadd -g 1000 maven 

    useradd -d /opt/maven/ -g 1000 maven 

    chown -r maven:maven /opt/maven 

    passwd maven 

    su - maven 

    上传至/opt/maven目录 

    unzip nexus-2.3.0-04-bundle.zip 

    ln -s nexus-2.3.0-04 nexus 

    cd nexus/bin 

    ./nexus start

    设置环境变量 

    vi .bashrc 

    增加如下内容: 

    export nexus_home=/opt/maven/nexus-2.3.0-04 

    export path=$path:$nexus_home/bin

    即可在任何目录运行nexus命令,如 

    nexus start

    usage: /opt/maven/nexus-2.3.0-04/bin/nexus { console | start | stop | restart | status | dump }

    用admin账号登录nexus(建议采用firefox登录,展示效果较好,在其他浏览器兼容器不好) 

    admin/admin123 

    deployment/deployment123

添加如下远程仓库: 

<a href="http://repository.jboss.org/maven2/">http://repository.jboss.org/maven2/</a> <a href="https://repository.sonatype.org/content/groups/forge/">https://repository.sonatype.org/content/groups/forge/</a>     alibaba  <a href="http://code.alibabatech.com/mvn/releases/">http://code.alibabatech.com/mvn/releases</a>  cloudera  <a href="https://repository.cloudera.com/artifactory/cloudera-repos">https://repository.cloudera.com/artifactory/cloudera-repos</a> <a href="http://mvnrepo.code.taobao.org/nexus/content/repositories/releases/">http://mvnrepo.code.taobao.org/nexus/content/repositories/releases/</a> <a href="http://172.168.27.70:8081/nexus/index.html#welcome">http://172.168.27.70:8081/nexus/index.html#welcome</a>

    配置时勾选:download remote indexes,这样nexus自动启动定时任务scheduled tasks下载索引 

    默认central是没有勾选download remote indexes,可以修改central的配置,下载中央仓库的索引 

    并在仓库组 public repositories中按以下顺序增加以上4个远程仓库 

    sonatype forge、apache releases、jboss releases、java net

登录nexus 

    nexus的默认管理员用户名和密码为admin/catt2013

nexus的仓库和仓库组 

    仓库有4种类型 

    group(仓库组)、hosted(宿主)、proxy(代理)、virtual(虚拟) 

    虚拟类型仓库的作用实际上是动态地将仓库内容格式转换,即也是为了服务maven1格式

    nexus内置的仓库 

    maven central: 代理maven中央仓库 

    releases: 一个策略为release的宿主类型仓库,用来部署组织内部的发布版本构件 

    snapshots: 一个策略为snapshot的宿主类型仓库,用来部署组织内部的快照版本构件 

    3rd party: 一个策略为release的宿主类型仓库,用来部署无法从公共仓库获得的第三方发布版本构件 

    apache snapshots: 一个策略为snapshot的代理仓库,用来代理apache maven仓库的快照版本构件 

    codehaus snapshots: 一个策略为snapshot的代理仓库,用来代理codehaus maven仓库的快照版本构件 

    google code: 一个策略为release的代理仓库,用来代理google code maven仓库的发布版本构件 

    java.net - maven 2:一个策略为release的代理仓库,用来代理java.net maven仓库的发布版本构件 

    public repositories:该仓库组将上述所有策略为release的仓库聚合并通过一致的地址提供服务 

    public snapshot repositories:该仓库组将上述所有策略为snapshot的仓库聚合并通过一致的地址提供服务

    仓库分类的概念 

    maven可以直接从宿主仓库下载构件;也可以从代理仓库下载构件, 

    而代理仓库会间接地从远程仓库下载并缓存构件;最后,为了方便,可以从 

    仓库组下载构件,而仓库组没有实际内容(图中用虚线表示),它会转向其包含 

    的宿主仓库或代理仓库获得实际构件的内容

nexus的索引与构件搜索 

    nexus通过维护仓库的索引来提供搜索功能,能在很大程度上方便maven用户定位构件坐标

    为了能够搜索maven中央仓库,首先需要设置nexus中的maven central代理仓库下载远程索引,需要注意的是: 

    这上配置的值默认是关闭的,此外,由于中央仓库的内容比较多,因此其索引文件比较大,nexus下载该文件也需要比较 

    长的时间。

    提供的搜索方式如下: 

    关键字搜索: 

    gav搜索:允许用户通过设置groupid、artifactid、version等信息来进行更有针对性的搜索 

    类名搜索:允许用户搜索包含某个java类的构件 

    校验搜索:(checksum search) 允许用户使用构件的校验(如通过spring-core-3.0.6.release.jar.sha1的内容)进行搜索

    有了中央仓库的索引,用户不仅能够搜索构件,还能够直接浏览中央仓库的内容。即nexus的索引浏览功能。在repositories页面中, 

    选择browse index选项卡,就能看到中央仓库内容的树形结构。

    以上的索引及浏览功能都是基于nexus索引而实现的,确切的应该称之为nexus-indexer 

    nexus能够遍历一个maven仓库所有的内容,搜集它们的坐标、校验和所含的java类信息,然后以nexus-indexer的形式保存起来。 

    中央仓库维护了这样的一个nexus-indexer,因此本地的nexus下载到这个索引之后,就能在此基础上提供搜索和浏览等服务。

    注意:不是任何一个公共仓库都提供nexus-indexer,对于那些不提供索引的仓库来说,无法对其进行搜索。

配置maven从nexus下载构件 

    在pom中为maven配置仓库和插件仓库,这样的配置只对当前maven项目有效,在实际应用中,需要在settings.xml中配置。 

    这样对所有本机maven项目有效。但是settings。xml并不支持直接配置repositories和pluginrepositories, 

    可以通过profile机制进行配置

    &lt;profiles&gt; 

        &lt;profile&gt; 

            &lt;id&gt;nexus&lt;/id&gt; 

            &lt;repositories&gt; 

                &lt;repository&gt; 

                    &lt;id&gt;nexus&lt;/id&gt; 

                    &lt;name&gt;nexus repository&lt;/name&gt; 

                    &lt;releases&gt; 

                        &lt;enabled&gt;true&lt;/enabled&gt; 

                    &lt;/releases&gt; 

                    &lt;snapshots&gt; 

                    &lt;/snapshots&gt; 

                &lt;/repository&gt; 

            &lt;/repositories&gt; 

            &lt;pluginrepositories&gt; 

                &lt;pluginrepository&gt; 

                &lt;/pluginrepository&gt; 

            &lt;/pluginrepositories&gt; 

        &lt;/profile&gt; 

    &lt;/profiles&gt; 

    &lt;activeprofiles&gt; 

        &lt;activeprofile&gt;nexus&lt;/activeprofile&gt; 

    &lt;/activeprofiles&gt; 

    这样的配置已经能让本机所有的maven项目从nexus私服下载构件,但还会不时地访问中央仓库central 

    如果希望所有maven下载请求都通过nexus,以全面发挥私服的作用,就需要配置镜像。 

    &lt;mirrors&gt; 

        &lt;mirror&gt; 

            &lt;mirrorof&gt;*&lt;/mirrorof&gt; 

        &lt;/mirror&gt; 

      &lt;/mirrors&gt;

部署构件至nexus 

    宿主仓库的主要作用是存储组织内部的,或者一些无法从公共仓库中获得的第三方构件,供项目项目使用。

    用户可以配置maven自动部署构件至nexus的宿主仓库,也可以通过界面手工上传构件

    使用maven部署构件至nexus(在所在项目的pom.xml中配置) 

    &lt;distributionmanagement&gt; 

        &lt;repository&gt; 

            &lt;id&gt;nexus-releases&lt;/id&gt; 

            &lt;name&gt;nexus releases repository&lt;/name&gt; 

        &lt;/repository&gt; 

        &lt;snapshotrepository&gt; 

            &lt;id&gt;nexus-snapshots&lt;/id&gt; 

            &lt;name&gt;nexus snapshots repository&lt;/name&gt; 

        &lt;/snapshotrepository&gt; 

    &lt;/distributionmanagement&gt;

    nexus的仓库对于匿名用户是只读的,为了能够部署构件,需要在settings.xml中配置认证信息

       &lt;servers&gt; 

         &lt;server&gt; 

        &lt;id&gt;nexus-releases&lt;/id&gt; 

        &lt;username&gt;admin&lt;/username&gt; 

        &lt;password&gt;admin123&lt;/password&gt; 

        &lt;/server&gt; 

        server&gt; 

        &lt;id&gt;nexus-snapshots&lt;/id&gt; 

      &lt;/servers&gt;

    手工部署第三方构件至nexus 

    针对由于许可证的因素无法公共地放在公共仓库中,还有大量的小型项目,没有把自己的构件分发到中央仓库,可以手工下载到本地, 

    然后通过nexus的界面上传到私服中。

    上传第三方构件,上传至3rd party宿主仓库

nexus的权限管理 

    访问控制模型 

    nexus是基于权限(privilege)做访问控制的,服务器的每一个资源都有相应的权限来控制。因此用户执行特定的操作时就必须有必要的权限。

    nexus预定义的三个用户,这三个用户对应了三个权限级别: 

    admin/admin123:拥有对nexus服务的完全控制 

    deployment/deployment123:能够访问nexus,浏览仓库内容、搜索、并且上传部署构件,但无法对nexus进行任何配置 

    anonymous:对应了所有未登录的匿名用户,可以浏览仓库并进行搜索。

    为项目分配独立的仓库 

    为每个项目分配独立的仓库,并且只将仓库的部署、修改、和删除权限赋予该项目成员,其他用户只能读取、下载和搜索该仓库的内容。

    有了仓库之后,就需要创建基于仓库的增、删、改、查权限,在nexus中,这样的权限是基于repository target建立的, 

    repository target实际上是一系列表达式,在访问仓库某路径下面的内容的时候,nexus会将仓库路径与repository target的 

    正则表达式一一匹配,以检查权限是否正确。

    先建立repository target,然后根据repository target建立对应的privileges, 建立包含如上权限的角色, 

    根据需要将其分配给项目的团队成员。

nexus的调度任务 

    nexus提供了一系列可配置的调度任务来方便用户管理系统。