Gradle:Maven方式上传Library

引言

在单一项目中,特别是模块化的开发模式下,我们通常会抽出一些全局共用的逻辑,放在一个 base-xxx 之类的模块里,在其他模块中,通过
implementation project(path: ':base-xxx')的方式进行模块依赖。

但开头也有提到,这种形式多用于单项目内部。如果需要跨项目使用同一个模块,就不太合适了。虽然借助svn、git等版本控制工具也可以同步代码,但需要对文件夹单独进行版本管理,即外部文件夹属于一个git项目,内部文件夹属于另一个git项目,这种复杂的目录关系和文件管理会造成很强的歧义,而且引入了很多不必要的管理工作。

对于这种公用模块,更好的管理办法是将其当作一个单独的项目来维护。使用方就不再关心起具体的实现,只需要对其输出物进行依赖即可。
简单来看的话,可以把输出的aar或jar包直接拿来用,但使用aar包有一个显著的缺陷:依赖传递丢失
gradle脚本的依赖项里,使用 implementationapi 声明的依赖作用域不同,其中 api 可以对外暴露自身依赖,使用方也同步获得对应依赖。但打包成aar或jar后,这部分信息就丢失了。
而在Maven机制中,对依赖的管理是依靠pom文件实现的,dependencies中添加的依赖项会同时下载对应的包和pom文件,本文我们就一起来看看怎么通过gradle脚本上传自己的库,完成gradle依赖的支持。

参考文档:https://docs.gradle.org/current/userguide/publishing_setup.html


上传者举例

gradle工具对maven的支持可以说很完善了,在模块的gradle脚本文件中引用与简单配置即可。下面贴出完整的子项目脚本,以及对应说明:

apply plugin: 'com.android.library'
apply plugin: 'maven'

android {
    compileSdkVersion 30

    defaultConfig {
        minSdkVersion 21
        targetSdkVersion 30
        versionCode 1
        versionName "1.0"
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
        debug {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    api 'com.squareup.okhttp3:okhttp:4.7.2'
    api 'com.squareup.retrofit2:retrofit:2.9.0'
    implementation 'com.squareup.okhttp3:logging-interceptor:4.7.2'
}

// ------------- 以下为上传相关配置 -------------
task androidSourcesJar(type: Jar) {
    archiveClassifier.set('sources')
    from android.sourceSets.main.java.sourceFiles
}

artifacts {
    archives androidSourcesJar
}

mavenDeploy {
    repositories {
        mavenDeployer {
            repository(url: https://nexus.simple.net/repository/android-releases/) {
                authentication(userName: xxxxxx, password: xxxxxx)
            }
            pom.project {
                groupId com.simple
                artifactId base-xxx
                version 1.3.25
                packaging 'aar'
            }
        }
    }
}

关键部分说明:

  • apply plugin: 'maven' 引入maven脚本支持,可以使用其中的方法和能力

  • mavenDeploy 定义一个闭包,名字随意,这个就是我们要直接执行的命令

  • repository 指定maven仓库地址和对应用户信息;可以是mavenCentral,可以是自建的nexus,也可以是本地文件夹路径uri。

  • groupId 所属组,推荐直接使用包名

  • artifactId 名称,不解释

  • version 发布的版本,注意与android.defaultConfig中的versionCode、versionName区分,与这两者完全无关,maven中只认这个版本名。

  • artifacts (非必要)用于声明组件,其中指定对应task:androidSourcesJar,会在打包时执行,将 源码 也打包发布。

aar和jar包中的是编译过后的class文件,注释信息都丢失了,很多变量名和参数名也会变成var1、var2这种,如果是内部使用,建议同时打包源码,方便开发人员阅读与调试。


本地模拟仓库环境

在私库环境不具备时,可以使用本地文件夹暂时代替,用于验证编译过程。对maven来说,只需要指定一个url,能往其中写入文件与下载对应文件即可,我们将一个本地路径转成uri即可使用:

apply plugin: 'com.android.library'
apply plugin: 'maven'

android {
    ......
}

dependencies {
    ......
}

mavenDeploy {
    repositories {
        mavenDeployer {
            repository(url: uri("/Users/wwf/Desktop/env/localRepo"))
            pom.project {
                groupId com.simple
                artifactId base-xxx
                version 1.3.25
            }
        }
    }
}

抛开源码,简化过后就可以得到上面的脚本了,其实 **** 也可以不配置,会根据项目名和模块名生成对应的 groupId 和 artifactId,版本号为unspecified,但还是建议明确声明。
执行gradle命令:gradle mavenDeploy,注意执行目录。
成功后即可在对应文件夹中发现如下文件:

随便截个图.jpg


使用者举例

与我们日常开发相同,需要在项目根脚本中指定要查找依赖的目标仓库。以mavenCentral为例:

---------- build.gradle  in root projec ----------

buildscript {
    repositories {
        // 等效于mavenCentral()
        maven { url "https://repo1.maven.org/maven2/" }
    }

    dependencies {
        classpath 'com.android.tools.build:gradle:4.1.0'
        ......
        ......
    }
}

allprojects {
    repositories {
        // 等效于mavenCentral()
        maven { url "https://repo1.maven.org/maven2/" }
    }
}

其中 allprojects 下的 repositories 中声明的是子项目查找的仓库。如果书接上文,使用本地仓库,就需要配置一个本地路径url,使用maven储存协议:

buildscript {
    ......
}

allprojects {
    repositories {
        // 等效于mavenCentral()
        maven { url "https://repo1.maven.org/maven2/" }
        maven { url: uri("/Users/wwf/Desktop/env/localRepo") }
    }
}

配置好后就可以像使用远程仓库中其他依赖一样,使用本地仓库中的包啦!


全文完,如有不足请多指教,共同进步。

转载请注明出处,@via 小风风吖-Gradle:Maven方式上传Library 蟹蟹。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,875评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,569评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,475评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,459评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,537评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,563评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,580评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,326评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,773评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,086评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,252评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,921评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,566评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,190评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,435评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,129评论 2 366
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,125评论 2 352

推荐阅读更多精彩内容