Nexus管理Android项目通用模块

	由于公司项目比较大,业务线众多,决定所有项目进行重构,业务模块化,便于统一管理。对于所有项目均依赖的基本架构和三方集成,当然要进行统一管理,即是使用Nexus。本文旨在梳理Android管理统一依赖框架的思路以及实现步骤。

一 、首先,
安装并运行Nexus私服,网上教程很多,可以自行查找,我这里用的是Nexus3,贴上一个我觉得还不错的教程点击这里,更改账号密码,将IP设置为本机局域网地址。
二、创建并编写通用模块。
新建Android Project,里面默认只有一个app module,我打算在此项目中编写基础依赖代码,作为通用模块提供给所有项目使用,需要新建library项目 :
File——>New ——>New Module——>Android Library
在这里插入图片描述

新建Library命名为mylibrary

在这里插入图片描述

在mylibrary中进行代码的编写,此处我只是新建了package,编写了两个类作为示例。注意,我在mylibrary module 的 build.gradle中引用了三方okhttp3.4.1,借此说明下文上传过程中的问题。
在这里插入图片描述

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])

    implementation 'com.android.support:appcompat-v7:28.0.0'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.2'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'

    implementation "com.squareup.okhttp3:okhttp:3.4.1"
}

三、上传文件至服务器(两种方式)
编写完成后,我们需要将代码上传到Nexus私服中,提供给局域网内的所有项目使用。
1.导出aar。即通过 Build ——> Make Module ‘mylibrary’,会在mylibrary目录下build下的outputs中生成aar文件,如下图
在这里插入图片描述
将此文件上传到Nexus中
在这里插入图片描述
将aar文件上传到自己新建的仓库中即可,上传过程如有问题多看几篇教程。。。
然而,问题来了,刚才我们引用的okhttp有没有一起被打包进来呢?亲测是没有的(下面会验证)。我在代码里不是写了个Data类嘛,如下:

public class Data {

    public Data(){ }

    private String name;
    
    public String getName() {
        return name;
    }
    
    public void setName(String name) {
        this.name = name;
        Log.e("tag",OkHttpClient.class.getName()+"");
    }
    
}

在setName()中打印了OKhttpClient的类名。
现在我将在另外一个新项目中开始使用我的基础框架代码。
(1) 在Project的build.gradle(注意,是工程的配置文件而不是module的)添加如下代码

allprojects {
    repositories {
        google()
        jcenter()
        maven {
            url 'http://10.0.51.19:8081/repository/4th/'
        }


    }
}

即添加了maven地址,该url就是我的Nexus私服中的仓库url。
(2)在新项目的app module的build.gradle文件中,dependencies下添加

implementation 'org.mavenexe:mavena:2.0.0@aar'

这里注意不要写错了,注意两个冒号,GroupId和ArtifactId,还有后面的@aar,不然将无法找到。这种导出aar的方式,是需要@aar的。
这样Sync之后我们就已经成功在新项目中依赖了aar。但是,当我们在新项目中,调用框架Data类的setName()方法时,项目会直接crash,报找不到okHttpClient类

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Data data = new Data();
        data.setName("name");

    }
}

所以,这种方式并不能使得新项目自动导入基础框架中引用的三方框架。

2.脚本方式上传(推荐)。
这种方式就比较有优势了,下面介绍用法。
在mylibrary module的build.gradle中,顶部添加

apply plugin: 'maven'

然后继续添加脚本语言,与android和dependencies同级即可,在最外层。将如下定义的这几个值都替换成自己创建的Nexus相关值。

def MAVEN_LOCAL_PATH = 'http://10.0.51.19:8081/repository/4th/'
def ARTIFACT_ID = 'mavenuseother'
def VERSION_NAME = '1.0.0'
def GROUP_ID = 'com.mavenuse'
def ACCOUNT = 'admin'
def PASSWORD = 'haha123'

//脚本:将Lib打成aar包上传至maven私有库
uploadArchives {
    repositories {
        mavenDeployer {
            repository(url:MAVEN_LOCAL_PATH ){
                authentication(userName: ACCOUNT, password: PASSWORD)}
            pom.project {
                groupId GROUP_ID
                artifactId ARTIFACT_ID
                version VERSION_NAME
                packaging 'aar'
            }
        }
    }
}

然后Sync,会发现在Android Studio右侧的Gradle任务列表中mylibrary目录下出现uploadArchives,如下:
在这里插入图片描述
点击uploadArchives,开始上传,上传成功后,就可以在自己创建的Nexus私服中,看到上传的文件了。

在这里插入图片描述
下面就可以在别的项目中依赖了,使用方式和第一种方式相似,唯一区别是,不需要再加上后缀@aar,并且,Sync后Gradle会自动替我们导入基础框架中用到的三方依赖,即okhttp,所以最终项目也可以成功跑起来。
这种方式,可以看到,在Nexus中生成了一个pom文件,点击,右边会出现:
在这里插入图片描述
点击链接Path,
在这里插入图片描述
这个xml文件中会罗列出我们上传基础框架依赖的三方框架,所以我们在Sync的时候,Gradle就会通过jcenter去找三方的库并下载(我的理解),我们在配置maven url时,上面还有google( )和jcenter( ),编译时,是按照顺序往下找,如果能在google( )中找到,就下载下来,不会继续在jcenter找,按照我的配置,最后才会找到我的Nexus。

内容基本介绍完了,当然真正在实现过程中,如果项目比较复杂,会遇到各种报错,资源文件冲突、依赖版本冲突等,结尾罗列一些可能遇到的问题:
(1)Manifest merger failed with multiple errors, see logs
这个错误太笼统,一般出现之后,在terminal中执行如下命令:
gradlew processDebugManifest --stacktrace,就可以在控制台打印的日志中看到比较详细的错误,一般会是AndroidManifest,xml的冲突,或者是minSDKVersion之类的冲突,都会显示出来。
(2)如果只报cant resolve依赖,那肯定是配置有问题,或者是设置了代理找不到本地服务。

文尽于此,如有不妥,望指正!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值