Maven Nexus私有仓库搭建及Android Studio使用

本文介绍了如何搭建Maven Nexus私有仓库,包括下载、安装、配置及创建用户。此外,还详细讲解了如何在Android Studio中设置Module以自动上传开发包到Nexus,以及解决可能出现的问题,如aar引用问题。最后,讨论了项目中如何引用私库的开发包。

公司多个项目引用同一个库,每次更新库时需要通知所有项目更新,比较麻烦,因此需要将公共库放到私库中进行管理。

项目中引用了很多central中的开发库,每次都要重新加载,编译速度慢,可以通过私库的proxy模式将central中用到的开发库下载到公司服务器中,提高编译速度。

Nexus下载(免费)

Nexus Repository OSS

Windows版本下载下来是nexus-3.15.2-01-win64.zip,解压。

Nexus安装

请确保已安装了JDK8,如果没有安装,可在官网下载安装。

https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html

  • 运行中输入cmd,打开控制台;
  • 定位到nexus-3.15.2-01-win64\nexus-3.15.2-01\bin目录下;
  • 输入nexus.exe/run,等待安装;
  • 安装成功后,浏览器中输入http://127.0.0.1:8081/,进入Nexus Repository管理页面。
  • 点击右上角登录,默认账号密码为admin/admin123。
  • 也可在cmd中输入nexus.exe/install,安装到系统服务中,重启电脑将自动启动。

安装服务时如果输出Could not open SCManager,那么需要以管理员身份运行cmd。

Nexus配置

创建用户

默认的账户除了admin/admin123外,还有anonymous/anonymous。admin拥有所有配置权限,anonymous只能用于查看,不能上传开发包。我们可以为开发人员创建专属账户,创建步骤如下:

  • 进入设置\Security\Users,点击Create local user,进入创建用户页面;

在这里插入图片描述

  • 输入用户信息,点击下方的Create local user保存账户;

在这里插入图片描述

其他
  • nexus-3.15.2-01\etc\nexus-default.properties可配置默认端口和host及访问根目录;
  • nexus-3.15.2-01\bin\nexus.vmoptions可配置内存参数,防止占用内存太大;
  • 可修改maven-releases的部署策略为Allow redeploy,这样可以重复部署已存在的版本,而无需手动删除。不过Allow redeploy一般用于snapshots(快照),适用于开发调试过程中方便联调。

Module生成开发包自动上传Nexus(Android Studio)

  • 项目的gradle.properties中添加常量定义
#MAVEN需要的配置
POM_GROUP_ID=com.test.android
POM_ARTIFACT_ID=test
VERSION=1.0.0
RELEASE_URL=http://127.0.0.1:8081/repository/maven-releases/
SNAPSHOT_URL=http://127.0.0.1:8081/repository/maven-snapshots/
NAME=admin
PASSWORD=admin123

# 下面这部分POM的配置不是必须的,使用默认生成的也可以
# 库名称
POM_NAME=Test Library
# 库的打包格式为aar, 常见的还有jar
POM_PACKAGING=aar
# 库的描述
POM_DESCRIPTION=Test Library
# POM文件中指向你网站的地址
POM_URL=http://www.test.com.cn/
# SCM是指版本管理工具
POM_SCM_URL=http://www.test.com.cn/
POM_SCM_CONNECTION=http://www.test.com.cn/
POM_SCM_DEV_CONNECTION=http://www.test.com.cn/
# 你的开放协议相关信息
POM_LICENCE_NAME= Apache License Version 2.0
POM_LICENCE_URL= http://www.test.com.cn/
POM_LICENCE_DIST=Apache License Version 2.0
# 开发者的相关信息
POM_DEVELOPER_ID=test
POM_DEVELOPER_NAME=test
  • Module的build.gradle同级目录下添加maven_push.gradle
apply plugin: 'maven'
apply plugin: 'signing'

configurations {
    deployerJars
}

repositories {
    mavenCentral()
}

// 判断版本是Release or Snapshots
def isReleaseBuild() {
    return !VERSION.contains("SNAPSHOT")
}

// 获取仓库url
def getRepositoryUrl() {
    return isReleaseBuild() ? RELEASE_URL : SNAPSHOT_URL
}

afterEvaluate { project ->
    uploadArchives {
        repositories {
            mavenDeployer {
                beforeDeployment {
                    MavenDeployment deployment -> signing.signPom(deployment)
                }

                pom.version = VERSION
                pom.artifactId = POM_ARTIFACT_ID
                pom.groupId = POM_GROUP_ID

                repository(url: getRepositoryUrl()) {
                    authentication(userName: NAME, password: PASSWORD) // maven授权信息
                }

                // (非必须)库生成的pom.xml文件内容
                pom.project {
                    name POM_NAME
                    packaging POM_PACKAGING
                    description POM_DESCRIPTION
                    url POM_URL

                    scm {
                        url POM_SCM_URL
                        connection POM_SCM_CONNECTION
                        developerConnection POM_SCM_DEV_CONNECTION
                    }

                    licenses {
                        license {
                            name POM_LICENCE_NAME
                            url POM_LICENCE_URL
                            distribution POM_LICENCE_DIST
                        }
                    }

                    developers {
                        developer {
                            id POM_DEVELOPER_ID
                            name POM_DEVELOPER_NAME
                        }
                    }
                }
            }
        }
    }
}

// 进行数字签名
signing {
    // 当 发布版本 & 存在"uploadArchives"任务时,才执行
    required { isReleaseBuild() && gradle.taskGraph.hasTask("uploadArchives") }
    sign configurations.archives
}

// 以下内容非必须
// type显示指定任务类型或任务, 这里指定要执行Javadoc这个task,这个task在gradle中已经定义
task androidJavadocs(type: Javadoc) {
    // 设置源码所在的位置
    source = android.sourceSets.main.java.sourceFiles
}

// 生成javadoc.jar
task androidJavadocsJar(type: Jar) {
    // 指定文档名称
    classifier = 'javadoc'
    from androidJavadocs.destinationDir
}

// 生成sources.jar
task androidSourcesJar(type: Jar) {
    classifier = 'sources'
    from android.sourceSets.main.java.sourceFiles
}

// 产生相关配置文件的任务
artifacts {
    archives androidSourcesJar
    archives androidJavadocsJar
}
  • Module的build.gradle开头添加maven_push.gradle的引用
apply from: 'maven_push.gradle'
  • Gradle中对应Module的Tasks下运行uploadArchives

在这里插入图片描述

可能碰到的问题
  • 如果开发包中引用了aar,可能会出现上传成功但无法引用的问题,提示pom.xml文件中缺少group id,此时可将module的build.gradle中引用的aar改为provided方式,即使其不生成到pom.xml中。

    compile(name: 'testlibrary', ext: 'aar')
    

    应改为

    provided(name: 'testlibrary', ext: 'aar')
    

项目中引用私库的开发包

  • 项目的build.gradle中添加私库的地址;
allprojects {
    repositories {
        jcenter()
        google()
        maven {
            url 'http://127.0.0.1:8081/repository/maven-public/'
            // 或  url 'http://127.0.0.1:8081/repository/maven-releases/'
        }
    }
}
  • module的build.gradle中添加引用;
implementation 'com.test.android:test:1.0.0'

默认生成maven是aar格式,但是以上面的方法引用的时候只能加载到module本身的jar,因此引用的jar还需要单独添加引用。

因此,若module中有包含其他的jar,且不想再单独引用,可通过下面的方式引用:

implementation 'com.test.android:test:1.0.0@aar'

也可直接引用最新版本:

implementation 'com.test.android:test:latest.release@aar'

参考资料

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值