android 發(fā)布aar到私有倉庫

發(fā)布aar到私有倉庫大概分為兩種方案:

方案一: 利用 maven 插件:

  1. 在項(xiàng)目根目錄下新建 upload.gradle 文件:
apply plugin: 'maven'

afterEvaluate { module ->
    // 將源碼打包發(fā)布
    task androidSourcesJar(type: Jar) {
        classifier = 'sources'
        from android.sourceSets.main.java.srcDirs
    }

    // 將類說明文檔打包發(fā)布
    tasks.withType(Javadoc) {
        // 設(shè)置編碼
        options.encoding = 'UTF-8'
    }
    task androidJavadoc(type: Javadoc) {
        source = android.sourceSets.main.java.srcDirs
        classpath += project.files(android.getBootClasspath().join(File.pathSeparator))
        destinationDir = file("./javadoc/")
        // 忽略錯(cuò)誤
        failOnError false
    }
    task androidJavadocJar(type: Jar, dependsOn: androidJavadoc) {
        classifier = 'javadoc'
        from androidJavadoc.destinationDir
    }

    artifacts {
        archives androidSourcesJar
        archives androidJavadocJar
    }

    uploadArchives {
        repositories {
            mavenDeployer {
                repository(url: MAVEN_URL) {
                    authentication(userName: MAVEN_USER_NAME, password: MAVEN_PWD)
                }
                pom.artifactId = ARTIFACT_ID
                pom.groupId = GROUP_ID
                pom.version = android.defaultConfig.versionName
                pom.packaging = PACKAGE_TYPE
            }
            doLast {
                println "upload aar success."
            }
        }
    }
}
  1. 在項(xiàng)目的根目錄的 gradle.properties 中添加配置項(xiàng):
# 發(fā)布私有倉庫的地址梯码,我這里是本機(jī)地址
MAVEN_URL=file://localhost/e:/deploy/
# 如果私有倉庫有賬號(hào)蘸劈,這里為賬號(hào)
MAVEN_USER_NAME=admin
# 如果私有倉庫有密碼晾腔,這里為密碼
MAVEN_PWD=123456
# 包的類型,會(huì)寫到 pom 文件中
PACKAGE_TYPE=aar
# 包的分組名,和 ARTIFACT_ID 對(duì)應(yīng)
GROUP_ID=com.colbert.lib
  1. 在要發(fā)布的 library 項(xiàng)目的目錄下新建 gradle.properties 文件
# 庫的名稱何吝,引用時(shí)配合GROUP_ID忆某,implementation 'com.colbert.lib:log:1.0.0'
ARTIFACT_ID=log

4.在 library 項(xiàng)目的目錄下的 build.gradle 文件引用改 upload.gradle 文件

apply from: '../upload.gradle'

至此,同步gradle之后奏路,gradle 任務(wù)列表中多了個(gè) uploadArchives 的任務(wù)畴椰,運(yùn)行之后即可在倉庫中看到發(fā)布的aar包。

以上是針對(duì) library 項(xiàng)目中沒有 flavor 的情況鸽粉,但如果 library 中含有 flavor斜脂,例如:

library 項(xiàng)目中有以下配置:

flavorDimensions 'push'
productFlavors {
    excludePush {
        dimension 'push'
    }
    includePush {
        dimension 'push'
    }
}

運(yùn)行 uploadArchives 任務(wù)會(huì)任何庫都不會(huì)發(fā)布,需要加以下配置:

android {
    // 默認(rèn)發(fā)布的配置触机,必須加
    defaultPublishConfig 'excludePushRelease'
}

加了上面的配置帚戳,你會(huì)發(fā)現(xiàn)可以發(fā)布了,但生成的庫的 pom 沒有依賴信息儡首,所以我們要重新寫一個(gè) upload.gradle 文件片任,添加依賴信息。

在 library 的項(xiàng)目文件加下蔬胯,新建 upload.gradle 文件:

afterEvaluate { project ->
    def RELEASE_BUILD_TYPE = "Release"

    // 將源碼打包發(fā)布
    task androidSourcesJar(type: Jar) {
        classifier = 'sources'
        from android.sourceSets.main.java.srcDirs
    }

    // 將類說明文檔打包發(fā)布
    tasks.withType(Javadoc) {
        // 設(shè)置編碼
        options.encoding = 'UTF-8'
    }
    task androidJavadoc(type: Javadoc) {
        source = android.sourceSets.main.java.srcDirs
        classpath += project.files(android.getBootClasspath().join(File.pathSeparator))
        destinationDir = file("./javadoc/")
        // 忽略錯(cuò)誤
        failOnError false
    }
    task androidJavadocJar(type: Jar, dependsOn: androidJavadoc) {
        classifier = 'javadoc'
        from androidJavadoc.destinationDir
    }

    artifacts {
        archives androidSourcesJar
        archives androidJavadocJar
    }

    uploadArchives {
        repositories {
            mavenDeployer {
                repository(url: MAVEN_URL) {
                    authentication(userName: MAVEN_USER_NAME, password: MAVEN_PWD)
                }
                android.libraryVariants.all { variant ->
                    def name = "${variant.name}"
                    addFilter(name) { artifact, file ->
                        // 只上傳 release 包
                        name.contains(RELEASE_BUILD_TYPE)
                    }
                    pom(name).artifactId = archivesBaseName + "-" + flavorName
                    pom(name).version = android.defaultConfig.versionName
                    pom(name).groupId = GROUP_ID
                    pom(name).packaging = 'aar'
                    // 在 pom 文件中加入依賴
                    pom(name).withXml {
                        def root = asNode()
                        def dependenciesNode = root["dependencies"][0] ?: root.appendNode("dependencies")
                        def addDependency = {
                            if (it.group == null || it.version == null || it.name == null || it.name == "unspecified") {
                                // 忽略
                                return
                            }
                            def dependencyNode = dependenciesNode.appendNode('dependency')
                            dependencyNode.appendNode('groupId', it.group)
                            dependencyNode.appendNode('artifactId', it.name)
                            dependencyNode.appendNode('version', it.version)
                            if (it.hasProperty('optional') && it.optional) {
                                dependencyNode.appendNode('optional', 'true')
                            }
                            if (!it.transitive) {
                                def exclusionNode = dependencyNode.appendNode('exclusions').appendNode('exclusion')
                                exclusionNode.appendNode('groupId', '*')
                                exclusionNode.appendNode('artifactId', '*')
                            } else if (!it.properties.excludeRules.empty) {
                                def exclusionsNode = dependencyNode.appendNode('exclusions')
                                it.properties.excludeRules.each { rule ->
                                    def exclusionNode = exclusionsNode.appendNode('exclusion')
                                    exclusionNode.appendNode('groupId', rule.group ?: '*')
                                    exclusionNode.appendNode('artifactId', rule.module ?: '*')
                                }
                            }
                        }
                        configurations.api.allDependencies.each addDependency
                        configurations.implementation.allDependencies.each addDependency
                        configurations.compile.allDependencies.each addDependency
                        if (!flavorName.isEmpty()) {
                            def flavorNameLower = flavorName.toLowerCase()
                            android.productFlavors.each {
                                def flavor = it.name
                                if (flavorNameLower.contains(flavor.toLowerCase())) {
                                    configurations["${flavor}Implementation"].allDependencies.each addDependency
                                    configurations["${flavor}Api"].allDependencies.each addDependency
                                    configurations["${flavor}Compile"].allDependencies.each addDependency
                                }
                            }
                            configurations["${name}Implementation"].allDependencies.each addDependency
                            configurations["${name}Api"].allDependencies.each addDependency
                            configurations["${name}Compile"].allDependencies.each addDependency
                            configurations["${flavorName}Implementation"].allDependencies.each addDependency
                            configurations["${flavorName}Api"].allDependencies.each addDependency
                            configurations["${flavorName}Compile"].allDependencies.each addDependency
                        }
                    }
                }
            }
            doLast {
                println "upload aar success."
            }
        }
    }
}

在 library 中引用這個(gè)文件即可:

apply from: './upload.gradle'

這時(shí)在運(yùn)行 uploadArchives 任務(wù)即可成功發(fā)布对供。

方案二:利用 maven-publish 插件

這種方式需要注意:
不會(huì)自動(dòng)追加依賴到pom文件中,需要像上面一樣笔宿,將依賴文件加進(jìn)入

apply plugin: 'maven-publish'
afterEvaluate { module ->

    // 將源碼打包發(fā)布
    task androidSourcesJar(type: Jar) {
        classifier = 'sources'
        from android.sourceSets.main.java.srcDirs
    }

    // 將文檔打包發(fā)布
    tasks.withType(Javadoc) {
        // 設(shè)置編碼
        options.encoding = 'UTF-8'
    }
    task androidJavadoc(type: Javadoc) {
        source = android.sourceSets.main.java.srcDirs
        classpath += project.files(android.getBootClasspath().join(File.pathSeparator))
        destinationDir = file("./javadoc/")
        // 忽略錯(cuò)誤
        failOnError false
    }
    task androidJavadocJar(type: Jar, dependsOn: androidJavadoc) {
        classifier = 'javadoc'
        from androidJavadoc.destinationDir
    }

    artifacts {
        archives androidSourcesJar
        archives androidJavadocJar
    }
    publishing {
        publications {
            maven(MavenPublication) {
                groupId GROUP_ID
                artifactId ARTIFACT_ID
                version android.defaultConfig.versionName
                artifact bundleRelease
                artifact androidJavadocJar
                artifact androidSourcesJar
                // 在 pom 文件中加入依賴
                pom(name).withXml {
                    def root = asNode()
                    def dependenciesNode = root["dependencies"][0] ?: root.appendNode("dependencies")
                    def addDependency = {
                        if (it.group == null || it.version == null || it.name == null || it.name == "unspecified") {
                            // 忽略
                            return
                        }
                        def dependencyNode = dependenciesNode.appendNode('dependency')
                        dependencyNode.appendNode('groupId', it.group)
                        dependencyNode.appendNode('artifactId', it.name)
                        dependencyNode.appendNode('version', it.version)
                        if (it.hasProperty('optional') && it.optional) {
                            dependencyNode.appendNode('optional', 'true')
                        }
                        if (!it.transitive) {
                            def exclusionNode = dependencyNode.appendNode('exclusions').appendNode('exclusion')
                            exclusionNode.appendNode('groupId', '*')
                            exclusionNode.appendNode('artifactId', '*')
                        } else if (!it.properties.excludeRules.empty) {
                            def exclusionsNode = dependencyNode.appendNode('exclusions')
                            it.properties.excludeRules.each { rule ->
                                def exclusionNode = exclusionsNode.appendNode('exclusion')
                                exclusionNode.appendNode('groupId', rule.group ?: '*')
                                exclusionNode.appendNode('artifactId', rule.module ?: '*')
                            }
                        }
                    }
                    configurations.api.allDependencies.each addDependency
                    configurations.implementation.allDependencies.each addDependency
                    configurations.compile.allDependencies.each addDependency
                    if (!flavorName.isEmpty()) {
                        def flavorNameLower = flavorName.toLowerCase()
                        android.productFlavors.each {
                            def flavor = it.name
                            if (flavorNameLower.contains(flavor.toLowerCase())) {
                                configurations["${flavor}Implementation"].allDependencies.each addDependency
                                configurations["${flavor}Api"].allDependencies.each addDependency
                                configurations["${flavor}Compile"].allDependencies.each addDependency
                            }
                        }
                        configurations["${name}Implementation"].allDependencies.each addDependency
                        configurations["${name}Api"].allDependencies.each addDependency
                        configurations["${name}Compile"].allDependencies.each addDependency
                        configurations["${flavorName}Implementation"].allDependencies.each addDependency
                        configurations["${flavorName}Api"].allDependencies.each addDependency
                        configurations["${flavorName}Compile"].allDependencies.each addDependency
                    }
                }
            }
        }
        repositories {
            maven {
                // 本地文件路徑改成 "file://e:/deploy"
                url = MAVEN_URL 
                // 本地文件不支持 credentials 這種認(rèn)證犁钟,請(qǐng)注釋掉
                credentials {
                    username MAVEN_USER_NAME
                    password MAVEN_PWD
                }
            }
        }
    }
}

在右邊的 gradle 任務(wù)欄中多了個(gè) publishing 文件夾, 運(yùn)行里面 publishMavenPublicationToMavenRepository 的任務(wù)即可棱诱。

這里需要注意:
如果你發(fā)布的library庫引用了別的子項(xiàng)目,建議將子項(xiàng)目單獨(dú)配置發(fā)布涝动,在library中都引用maven格式的地址迈勋。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市醋粟,隨后出現(xiàn)的幾起案子靡菇,更是在濱河造成了極大的恐慌,老刑警劉巖米愿,帶你破解...
    沈念sama閱讀 219,427評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件厦凤,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡育苟,警方通過查閱死者的電腦和手機(jī)较鼓,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來违柏,“玉大人博烂,你說我怎么就攤上這事∈” “怎么了禽篱?”我有些...
    開封第一講書人閱讀 165,747評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長馍惹。 經(jīng)常有香客問我躺率,道長,這世上最難降的妖魔是什么万矾? 我笑而不...
    開封第一講書人閱讀 58,939評(píng)論 1 295
  • 正文 為了忘掉前任悼吱,我火速辦了婚禮,結(jié)果婚禮上良狈,老公的妹妹穿的比我還像新娘舆绎。我一直安慰自己,他們只是感情好们颜,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,955評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著猎醇,像睡著了一般窥突。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上硫嘶,一...
    開封第一講書人閱讀 51,737評(píng)論 1 305
  • 那天阻问,我揣著相機(jī)與錄音,去河邊找鬼沦疾。 笑死称近,一個(gè)胖子當(dāng)著我的面吹牛第队,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播刨秆,決...
    沈念sama閱讀 40,448評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼凳谦,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了衡未?” 一聲冷哼從身側(cè)響起尸执,我...
    開封第一講書人閱讀 39,352評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎缓醋,沒想到半個(gè)月后如失,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,834評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡送粱,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,992評(píng)論 3 338
  • 正文 我和宋清朗相戀三年褪贵,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片抗俄。...
    茶點(diǎn)故事閱讀 40,133評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡脆丁,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出橄镜,到底是詐尸還是另有隱情偎快,我是刑警寧澤,帶...
    沈念sama閱讀 35,815評(píng)論 5 346
  • 正文 年R本政府宣布洽胶,位于F島的核電站晒夹,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏姊氓。R本人自食惡果不足惜丐怯,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,477評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望翔横。 院中可真熱鬧读跷,春花似錦、人聲如沸禾唁。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,022評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽荡短。三九已至丐枉,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間掘托,已是汗流浹背瘦锹。 一陣腳步聲響...
    開封第一講書人閱讀 33,147評(píng)論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人弯院。 一個(gè)月前我還...
    沈念sama閱讀 48,398評(píng)論 3 373
  • 正文 我出身青樓辱士,卻偏偏與公主長得像,于是被迫代替她去往敵國和親听绳。 傳聞我的和親對(duì)象是個(gè)殘疾皇子颂碘,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,077評(píng)論 2 355