美文网首页
搭建Maven 私服 (Android周边记录1)

搭建Maven 私服 (Android周边记录1)

作者: JakeWell | 来源:发表于2020-03-09 17:39 被阅读0次

搭建Maven 私服

本文整理目前网络上关于NEXUS搭建Maven私服的文章,记录关于如何搭建一个属于自己的Maven私服,以方便Android 项目的模块化,规范化的实现

私服的安装和使用

  • 下载maven服务器

    # 创建目录
    mkdir  nexus
    cd nexus
    # 下载软件
    wget http://download.sonatype.com/nexus/oss/nexus-2.10.0-02-bundle.tar.gz
    # 解压软件
    tar -zxvf nexus-2.10.0-02-bundle.tar.gz
    
  • 为了让nexus 能够正常运行,需要把nexus 用root 的权限来打开

    修改/home/lwk/nexus/nexus-2.10.0-02-bundle/nexus-2.10.0-02/bin/nexus 文件

    将 RUN_AS_USER 修改为root

image-20200103201907507.png
  • nexus 的相关操作

    ./nexus start
    ./nexus stop
    ./nexus status
    
    

    这里要注意一个问题 :

    ​ 因为nexus 是采用root 的权限来启动的,因此会遇到一个让你来输入密码的操作,而此时输入密码会遇到一个 su: 密码不正确 ,在这里需要为系统设置这个密码

    
    su passwd
    
    
  • nexus 的操作

    完成了上述操作,这时nexus 就已经启动了,这时我们需要打开nexus ,在浏览器输入

    
    localhost:8081/nexus
    
    

    然后我们可以看到nexus 的主界面

image-20200103203257457.png

这时,我们需要点击右上角的登录功能,默认的账号密码是 admin/admin123

  • 认识nexus

  • 左侧菜单

    artifact Search 搜索
    views\repositories 仓库
    security 安全相关的配置
    administration nexus一些相关配置
    help 一些没有用的关于啊啥的
    
  • 重点讲一下views\repositories , 其他的基本在Android 端不需要去考虑

    Public Repositories:仓库组
    3rd party:一般自己上传无法从公共仓库获得的第三方发布版本的依赖包、例如oracle的ojdbc等、
    Apache Snapshots:用了代理ApacheMaven仓库快照版本的构件仓库、一般不使用
    Central:用来代理maven中央仓库中发布版本构件的仓库
    Central M1 shadow:用于提供中央仓库中M1格式的发布版本的构件镜像仓库
    Releases:用来部署管理内部的发布版本构件的宿主类型仓库
    Snapshots:用来部署管理内部的快照版本构件的宿主类型仓库
    jybd_web_view: 这个是一个自己上传的仓库,并非nexus自带仓库
    
  • 点击repositories

    image-20200103204329412.png

  • 接下来,我们需要新建我们自己的仓库

    img

  • 然后进行相关配置

    img
  • 有几个需要重点说一下的点:

    1. Respository ID 是该仓库的唯一标示
    2. Respository Name 是显示在外面的仓库的名字
    3. Respository Policy 通常我们需要创建,一个release库 (对应 Release),一个snapshot 库 (对应Snapshot),这个很重要
    4. Deployment Policyt 这个需要修改成 Allow Redeploy

这时我们的仓库创建完毕了。

Android 端的配置

library 的上传

  1. 在项目根目录的grade.properties 文件中

# grade.properties
NEXUS_REPOSITORY_URL=http://localhost:8099/nexus/content/repositories/snapshots/
MC_AUDIO_RELEASE_URL=http://localhost:8099/nexus/content/repositories/mc_audio_release/
MC_AUDIO_SNAPSHOTS_URL=http://localhost:8099/nexus/content/repositories/mc_audio_snapshot/
POM_GROUPID=com.team_5zdh.android
POM_PACKAGING=aar
NEXUS_USERNAME=admin
NEXUS_PASSWORD=admin123
  1. 在项目根目录的gradle 文件中,添加我们需要引入的仓库
apply from: this.rootProject.file('imooc.gradle')
buildscript {
    repositories {
        jcenter()
        google()
        mavenCentral()
        maven {
            url MC_AUDIO_RELEASE_URL
            credentials {
                username 'admin'
                password 'admin123'
            }
        }
        maven {
            url MC_AUDIO_SNAPSHOTS_URL
            credentials {
                username 'admin'
                password 'admin123'
            }
        }
    }
    dependencies {
      .....
    }
}
allprojects {
    repositories {
        jcenter()
        google()
        maven { url "https://jitpack.io" }
        //此处为项目引入提供相关配置
        maven {
            url MC_AUDIO_RELEASE_URL
            credentials {
                username 'admin'
                password 'admin123'
            }
        }
        maven {
            url MC_AUDIO_SNAPSHOTS_URL
            credentials {
                username 'admin'
                password 'admin123'
            }
        }
    }
}
  1. 在我们自己封装的lib 库中的 build.gradle,进行相关配置
//上传maven配置
uploadArchives {
    repositories {
        mavenDeployer {
           repository(url: MC_AUDIO_RELEASE_URL) {
                authentication(userName: NEXUS_USERNAME, password: NEXUS_PASSWORD)
            }
            snapshotRepository(url: MC_AUDIO_SNAPSHOTS_URL) {
               authentication(userName: NEXUS_USERNAME, password: NEXUS_PASSWORD)
            }
            pom.project {
                name pomName
                version pomVersionName
                description pomDescription
                artifactId artifactIdVal
                groupId POM_GROUPID
                packaging POM_PACKAGING
            }
        }
    }
}

  1. 最后通过android studio 中的gradle 按钮
image-20200103210915976.png

或者 通过命令行,在项目根目录下执行


./gradlew uploadArchives

来进行library 的上传。

library 的下载

  • 依赖库的下载,相对比较简单

    1. 根目录 build.gradle 的相关配置
    allprojects {
        repositories {
            jcenter()
            google()
            maven { url "https://jitpack.io" }
            //此处为项目引入提供相关配置
            maven {
                url MC_AUDIO_RELEASE_URL
                credentials {
                    username 'admin'
                    password 'admin123'
                }
            }
    
            maven {
                url MC_AUDIO_SNAPSHOTS_URL
                credentials {
                    username 'admin'
                    password 'admin123'
                }
            }
        }
    
    1. 在需要使用的工程中,导入需要使用的library、
    
    implementation 'com.team_5zdh.android:mc_audio_release:1.0.1'
    
    

这样整个仓库的流程就完全走通了

其他需要注意的知识点

release 和 snapshot 仓库的区别与正确使用

​ 我们已经将将依赖构件上传到 release 仓库中,如果没有修改版本号,再次上传,就会上传失败,并提示如下错误:

Error:Execution failed for task ‘:nexuslibrary:uploadArchives’.
Could not publish configuration ‘archives’

Failed to deploy artifacts: Could not transfer artifact 
com.dr:nexuslibrary:aar:1.0.0 from/to remote 

(http://localhost:8081/repository/maven-releases/): Failed to transfer file: 

http://localhost:8081/repository/maven-releases/com/dr/nexuslibrary/1.0.0/nexuslibrary-1.0.0.aar. Return code is: 400, 

ReasonPhrase: Repository does not allow updating assets: maven-releases.

原因在于,release 仓库不能重复上传同一版本号,版本不能覆盖,只能迭代。

snapshot 仓库允许版本覆盖。当我上传多次上传同一个版本到 snapshot 仓库,会自动在版本号上添加时间戳来区分。

  • 那么问题来了,为什么存在这两个仓库?这个区别的存在意义是什么呢?

​ 试想你是一个三方库的开发者,三方库是对外暴露的,1.0.0 已经在为其他程序服务,同时它本身存在问题也在继续开发迭代。此刻正在开发新版本 1.0.1,公司的小伙伴在同步从 Nexus 私库下载 1.0.1 最新改动版本测试。

​ 稳定对外开放的版本,放到 release 仓库。版本不能覆盖,保证外部使用不受版本更新的影响。

​ 迭代开发的不稳定版本,放到 snapshot 仓库。版本可覆盖,小伙伴测试的时候,不需要修改依赖的版本号,最多需要清除下 Maven 的依赖缓存,就可以下载到最新的版本。

​ 上面提到的 目前 maven-releases 和 maven-snapshots 是 hosted 类型的仓库是 Nexus 默认创建的两个仓库,实际工作中,我们可以自定义创建仓库,自己规定为 release 库和 snapshot 库。下面给出两者的正确使用姿势,方便以后使用:

  • release库(发布库)使用规则及场景

    • 场景:

      release库是存放稳定版本包的仓库,线上发布的程序都应从release库中引用正确版本进行使用。

    • 使用规则:
      release库仓库名中带有“releases”标识,
      release 库不允许删除版本;
      release 库不允许同版本覆盖;
      release库上传的jar包版本号(version)不能以“-SNAPSHOT”结束(版本号中的SNAPSHOT是release版和snapshot版区别的唯一标识);
      第三方包(非公司内部开发)仅可引用 release 版
      最好提供源码包 sources.jar 和方法文档 javadoc.jar,方便引用方使用。

  • snapshot库(快照库)使用规则及场景

    • 场景:
      snapshot库是存放中间版本包的仓库,代表该库中依赖包的程序处于不稳定状态。当代码在开发过程中有其他程序需要引用时,可以提供snapshot版用于调试和测试。由于snapshot库的包依然处于测试状态,所以随时可以上传同版本最新包来替换旧包,基于这种不稳定状态,maven允许snapshot库中的包被编译时随时更新最新版,这就可能会导致每次打包编译时同一个版本jar会包含不同的内容,所以snapshot库中的包是不能用来发布的;

    • 使用规则:
      snapshot 库仓库名中带有“snapshots”标识,
      snapshot 库可以删除版本;
      snapshot 库可以实现版本覆盖;
      第三方包(非公司内部开发)不允许引用 snapshot 版
      快照库上传的版本号(version)必须以“-SNAPSHOT”结束,并上传至私服后系统将自动将“-SNAPSHOT”替换为时间戳串(本地代码引用时依然用“-SNAPSHOT”结束的版本号,无需替换时间戳),一个快照包线上将存在至少两个版本。

相关文章

网友评论

      本文标题:搭建Maven 私服 (Android周边记录1)

      本文链接:https://www.haomeiwen.com/subject/konpdhtx.html