之前已经介绍过Nexus 部署Maven私服仓库 今天说说关于将JAR(项目)发布到Maven私服。


这个需求是因为Web项目使用的Maven库是第三方的,而三方的这个库又不稳定(如版本的更新、网络中断),虽然做了个库代理下载了索引,但有一天这个第三方的库服务突然关闭了,然后就悲剧了……


这种悲剧在我的团队中就发生过,可能是对Maven库的理解不透彻,也可能是不清楚哪些JAR是私有的。不过怎样都好,出了问题就要解决,最初是想将缺少的JAR上传到本地Maven私服,但不通其法失败,为了降低对开发的影响,最后又换了一个第三方的库……


最近终于将这个问题解决了,突然发现原来是如此的简单……


先来说说sonatype Nexus OSS的仓库

wKioL1cfL9vR6Po4AAHXJxemGuA478.jpg

仓库类型:

    group: 仓库组。可将选定仓库添加到仓库组

    hosted: 宿主。自创建的文件放到此类型下

    proxy: 代理。

    virtual:虚拟。

仓库属性:

Policy

    Release:发布,既是代表稳定版本

    Snapshot:快照,代表开发版本

Download Remote Indexes :仓库远程索引,默认为False

Default Local Storage Location: 默认本地目录

Override Local Storage Location:重新本地存储位置


默认库:   

  • Central:该仓库代理Maven中央仓库,其策略为Release,因此只会下载和缓存中央仓库中的发布版本构件。

  • Releases:这是一个策略为Releases的宿主类型仓库,用来部署组织内部的发布版本构件。

  • Snapshots:这是一个策略为Snapshot的宿主类型仓库,用来部署组织内部的快照版本构件。

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

  • Apache Snapshots:这个一个策略为Snapshots的代理仓库,用来代理Apache Maven仓库的快照版本构件。

  • Codehaus SnapShots:这是一个策略为Snapshots的代理仓库,用来代理Cohehaus Maven仓库的快照版本构件。http://morrowind.blog.51cto.com/addblog.php

  • Sonatype Repositories:这是一个策略为Release的代理仓库,用来代理sonatype Maven仓库的快照版本构件。

  • Central M1 shadow : 用于提供中央仓库中M1格式的发布版本的构件镜像仓库


发布到Maven 中央仓库

Nexus上传:

    选择Releases仓库,在"Artifact Upload"属性卡内,选择“Select Artifacts(s) to Upload"上传需要发布的包,“GAV Definition” 选择 pom文件,如果没有pom文件在选GAV Parameters后手动指定包坐标。


使用Maven部署构件至Nexus

    选择Releases/Snapshots仓库,在"Configuration"属性卡内,确认“Deployment Policy“属性为 Allow Redeploy


    启用Deployment用户,Nexus默认有三个用户,其中Deployment用户用于部署项目

wKioL1cfQqWDZbLJAABPRueobME621.png

Deployment用户默认密码为deployment123,右键菜单可修改或重置密码

wKiom1cfQhqBI8j4AABVC8tMO0I077.png


在pom.xml中分别对Release版本和Snapshot版本配置部署仓库,其中id唯一,url分别对应私服中Releases和Snapshots仓库的Repository Path:

<uniqueVersion>表示是否为Snapshot版本分配一个包含时间戳的构建号,效果如下:

复制代码

    <distributionManagement>
        <snapshotRepository>
            <id>user-snapshot</id>
            <name>User Porject Snapshot</name>
            <url>http://localhost:8081/nexus/content/repositories/snapshots/</url>
            <uniqueVersion>true</uniqueVersion>
        </snapshotRepository>
        <repository>
            <id>user-release</id>
            <name>User Porject Release</name>
            <url>http://localhost:8081/nexus/content/repositories/releases/</url>
        </repository>
    </distributionManagement>


Nexus的仓库对于匿名用户只是只读的。为了能够部署构件,我们还需要再settings.xml中配置验证信息:

    <servers>
        <server>
            <id>user-release</id>
            <username>deployment</username>
            <password>deployment123</password>
        </server>
        <server>
            <id>user-snapshot</id>
            <username>deployment</username>
            <password>deployment123</password>
        </server>
        …        
    </servers>


其中,验证信息中service的id应该与POM中repository的id一致。

这样通过 maven 可以自动布置到Nexus私服中了。命令如下:

mvn clean deploy -Dmaven.test.skip=true

也可右键pom.xml -> Run As ->2 Maven build

302309511055471.png

发布成功后,在私服的仓库中就能看到了:

302311224183467.png


以上的方法都是网上能找到的正常方式,下面来说说我的实现方式。

前提是依赖包已包含pom.xml文件

假定有个jar文件夹,文件夹内都是项目需要的依赖包,并包含读应的pom.xml坐标文件。

将这个jar文件夹整个上传到nexus 某个宿主库的存储目录,如Releases库对应的存储目录为nexus2.8/sonatype-work/nexus/storage/releases,那将依赖和对于pom上传到这个目录下即可。

宿主仓库的“configuration“选项卡的“Default Local Storage Location“属性就是对应的存储目录。


当然,前提是要有服务器的权限


重新刷新nexus页面就可以看到了



参考:http://www.cnblogs.com/luotaoyeah/p/3817465.html


推荐:Maven 权威指南或Maven 实战