一学就会,一用就废Nexus3.30.0-01踩坑记录

前言

在进行Android开发的时候,我们引用第三方开源库时都是如下所示:

arduino 复制代码
implementation 'com.android.support:appcompat-v7:28.0.0'

然而,在工作时我们会发现,并不是所有代码都可以对外开放的,当项目很多的时候,想使用一些通用的模块时,就不得不复制粘贴然后引用它。

频繁复制粘贴只是小事情,毕竟大家都是老CV工程师了,最痛苦的是当A项目发现模块的一个小bug,此时B、C、D等等使用了这个模块的项目都要改一遍,非常的痛苦。

Nexus

使用Nexus搭建一个私有代码库,就可以像引用第三方开源库一样引用自己的私有模块。我们直接进入教程,本文使用的版本为Nexus3.30.0-01,操作系统为window。

下载

www.sonatype.com/product/rep...

下载这一步比较简单,只需要填写邮箱等信息,就可以进行下载,3种操作系统的版本都支持。

下载完成以后进行解压,可以得到nexus-3.30.0-01和sonatype-work两个文件夹

  • nexus-3.30.0-01 : 包括nexus服务运行的各种文件
  • sonatype-work : 仓库缓存文件,如果需要备份仓库,备份这个文件夹即可

启动服务

进入./nexus-3.30.0-01/bin/文件夹,在此文件夹下以管理员身份运行CMD

注意:一定要以管理员身份运行

依次执行以下命令:

shell 复制代码
nexus.exe/install       //用于下载nexus服务

nexus.exe/start         //用于启动nexus服务

进行nexus管理

在成功启动服务以后,既可以在浏览器输入**http://localhost:8081** 打开nexus提供的管理页面。如果你的nexus搭建在另一台内网服务器或者云端上,你可以输入**http://Ip:8081/**

如果你不想使用8081这个端口,可以在./nexus-3.30.0-01/etc/nexus-default.properties文件中进行修改

nexus默认提供了2个账号admin(管理员)和anonymous(访客)。首次登录admin的密码保存在./sonatype-work/nexus3/文件夹下。首次登录页面也会有这一方面的引导。登录后可看到如下图的页面

下面对一些常用的选项进行说明:

仓库

Nexus将仓库分为三种即group、hosted、proxy

  • group:顾名思义,它是仓库组,可以将多个仓库整合为一个仓库。例如我们定义了一个仓库组A,并且把B、C、D三个仓库添加进A组,那么我们通过引用A的依赖就可以调用到BCD的内容。
  • hosted:本地仓库,表示该仓库为本机创建的,简单说就是你的私有代码库
  • proxy:代理仓库,nexus的另一大功能,代理就通过这种类型的仓库实现。

Nexus默认会帮我们创建几个仓库,可以直接拿来用,如果你想做一些定制化的操作,可以学习更高级的用法,这里我只做简单的使用。

注意:默认创建的仓库会有两个hosted仓库,分别为maven-releases和maven-snapshots两个,简单来说它们就和"release-debug"之间的关系一样。

权限

Nexus默认提供了两种权限(Role),即nx-admin和nx-anonymous,在创建账号(User)的时候可以选择对应的权限赋予这个账号。初次使用我们不做过多的权限介绍,我们直接使用admin即可

配置Gradle进行模块上传

  1. 首先我们在gradle.properties文件定义好一些全局变量
groovy 复制代码
# Maven仓库的URL
MAVEN_REPO_RELEASE_URL=http://localhost:8081/repository/maven-releases/

# 登录nexus ossde的用户名
NEXUS_USERNAME=admin

#登录nexus oss的密码
NEXUS_PASSWORD=0b854d20-9884-4d57-9e8e-63cdec1ab3c5

# groupid最终引用时的名字
GROUP_ID=com.mot.test

# 对应Mavern的artifactId
POM_ARTIFACT_ID=test

# version
VERSION_NAME=0.0.1
  1. 其次我们在需要上传的moudle,修改其build.gradle
groovy 复制代码
apply plugin: 'maven'   //引用maven插件

uploadArchives {
    configuration = configurations.archives
    repositories {
        mavenDeployer {
            repository(url: MAVEN_REPO_RELEASE_URL) {
                authentication(userName: NEXUS_USERNAME, password: NEXUS_PASSWORD)
            }
            pom.project {
                version VERSION_NAME
                artifactId POM_ARTIFACT_ID
                groupId GROUP_ID
            }
        }
    }
}

配置完以上以后,就可以在Android Studio提供的Gradle插件中上传模块了,双击如下图所示的插件

上传成功以后就可以再网页上查看到对应的aar包

如果在这里出现了上传失败的情况,那会可能是如下两种情况出现了问题:

  1. 账号密码对应的权限不够,或者账号密码错误。
  2. 仓库设置了"Disable redeploy",导致相同版本号上传失败,如下图所示

配置Gradle依赖私有代码库

到了这一步,我们已经可以将自己的模块上传至nexus了,接下来是最后一步了,这一步也是比较坑的。

  1. 首先配置全局build.gradle
groovy 复制代码
allprojects {
    repositories {
        maven {
            url 'http://localhost:8081/repository/maven-public/'
            credentials {
                username 'admin'
                password '0b854d20-9884-4d57-9e8e-63cdec1ab3c5'
            }
        }
        google()
        jcenter()
    }
}
  1. 其次配置需要使用依赖的模块的build.gradle
groovy 复制代码
implementation 'com.mot.test:test:0.0.1'
// 引用格式为:
// implementation 'GROUP_ID:POM_ARTIFACT_ID:VERSION_NAME'
// 与上一步对应的全局变量相对应

配置完成以后,点击sync gradle 可能会出现 ERROR: Unable to resolve dependency for... 的问题,总结了以下解决方法。

  • 全局build.gradle 配置maven 的url、账号和密码时,填写错误。url可以在nuexs网页上复制

  • 检查你上传的模块,是否还依赖了其他的第三方SDK。如果你依赖了第三方的SDK例如一个指纹模块,别的厂商给你提供了一个aar文件,然后你在本地libs内引用了。这种情况需要将第三方aar文件单独上传到nuexs上,然后模块中在引用,如下图所示:

上传完成以后,在自己的模块中引用:

groovy 复制代码
implementation 'com.mot.othersdk:test:0.0.1@aar'

//注意这里一定要加上@aar后缀,不然默认会去找jar类型,也会提示Unable to resolve dependency

相关推荐
StackNoOverflow12 小时前
MySQL Explain 返回列详解:从入门到实战,附 SQL 与避坑大全
android
CYRUS_STUDIO21 小时前
Frida 检测与对抗实战:进程、maps、线程、符号全特征清除
android·逆向
csj501 天前
安卓基础之《(28)—Service组件》
android
lhbian1 天前
PHP、C++和C语言对比:哪个更适合你?
android·数据库·spring boot·mysql·kafka
catoop1 天前
Android 最佳实践、分层架构与全流程解析(2025)
android
ZHANG13HAO1 天前
Android 13 特权应用(Android Studio 开发)调用 AOSP 隐藏 API 完整教程
android·ide·android studio
田梓燊1 天前
leetcode 142
android·java·leetcode
angerdream1 天前
Android手把手编写儿童手机远程监控App之JAVA基础
android
菠萝地亚狂想曲1 天前
Zephyr_01, environment
android·java·javascript
sTone873751 天前
跨端框架通信机制全解析:从 URL Schema 到 JSI 到 Platform Channel
android·前端