上传依赖至Artifactory

Gradle Plugin

工程根目录 build.gradle

buildscript {
    dependencies {
        classpath "org.jfrog.buildinfo:build-info-extractor-gradle:4.9.8"
    }
}

Apply Plugin

Library Module 的 build.gradle apply plugin

apply plugin: 'com.jfrog.artifactory'
apply plugin: 'maven-publish'

配置参数

Library Module 的 build.gradle

def packageName = 'com.test.demo'
//def libraryVersion = '1.0.0'
def libraryVersion = '1.0.0-SNAPSHOT'
publishing {
    publications {
        aar(MavenPublication) {
            groupId packageName
            artifactId project.name
            version = libraryVersion
            // Tell maven to prepare the generated "*.aar" file for publishing
            artifact("$buildDir/outputs/aar/${project.getName()}-release.aar")

            pom.withXml {
                def dependenciesNode = asNode().appendNode('dependencies')
                configurations.implementation.allDependencies.withType(ModuleDependency) { ModuleDependency dp ->
                    def dependencyNode = dependenciesNode.appendNode('dependency')
                    dependencyNode.appendNode('groupId', dp.group)
                    dependencyNode.appendNode('artifactId', dp.name)
                    dependencyNode.appendNode('version', dp.version)

                    // for exclusions
                    if (dp.excludeRules.size() > 0) {
                        def exclusions = dependencyNode.appendNode('exclusions')
                        dp.excludeRules.each { ExcludeRule ex ->
                            def exclusion = exclusions.appendNode('exclusion')
                            exclusion.appendNode('groupId', ex.group)
                            exclusion.appendNode('artifactId', ex.module)
                        }
                    }
                }
            }
        }
    }
}

artifactory {
    contextUrl = 'http://xx.xx.xx.xx:8081/artifactory'
    publish {
        repository {
            // The Artifactory repository key to publish to
            repoKey = libraryVersion.endsWith('SNAPSHOT') ? 'libs-snapshot' : 'libs-release'

            username = artifactory_username
            password = artifactory_password
        }
        defaults {
            // Tell the Artifactory Plugin which artifacts should be published to Artifactory.
            publications('aar')
            publishArtifacts = true

            // Properties to be attached to the published artifacts.
            properties = ['qa.level': 'basic', 'dev.team': 'core']
            // Publish generated POM files to Artifactory (true by default)
            publishPom = true
        }
    }
}

配置账号

根目录 gradle.properties

artifactory_username=admin
artifactory_password=123456

远程依赖丢失的问题

上述配置中有个 pom.withXml 的配置,这个是用来生成远程依赖的 pom 文件。

默认下,打包生成的AAR与pom是不包含 library的远程依赖的。当APP集成此依赖时,还需要手动配置此依赖的远程依赖,对于接入方不是很友好。

使用 pom.withXml 虽然解决远程依赖的问题,但也带来了可能引起依赖冲突的问题,即APP与本library同时依赖一乐一个三方库,但是引用的版本不同,就可能会带来依赖冲突的问题。

所以,根据自己的依赖包的业务场景,选择性的配置 pom.withXml 参数。

仓库地址

当本library中引用的远程三方依赖,需要配置三方仓库时(即:不是几大公共仓库 mavenCenter、jcenter等),接入方APP在使用本依赖时,也要配置此远程依赖的仓库地址。

如本例中,不仅要配置自己的私库地址,还要配置腾讯的仓库地址


allprojects {
    repositories {
        ...
        maven { url "https://dl.bintray.com/tencentqcloudterminal/maven" }
        maven { url "http://ip:8081/artifactory/libs-snapshot/" }
        maven { url "http://ip:8081/artifactory/libs-release/" }
    }
}

snapshot 版本依赖 Android Studio 中更新不及时

我们的一个版本上线前,可能会发出多个 snapshot的版本,用以测试期间使用。由于使用 snapshot 版本 AS 中会进行本地缓存,导致即使我们更新 artifactory 中的snapshot版本,本地使用的仍然是旧的版本。

查阅资料,得知如下方法:

./gradlew build --refresh-dependencies

可以强制刷新本地缓存。

但是实测效果,并未能成功。由于此方案网上大部分都在采纳,怀疑本人使用不当,特此记录下来

故此,只能通过修改版本号,已达到更新缓存的目的。

每次在 snapshot 版本前面加一个数字。如:1.0.0-1-SNAPSHOT

执行任务上传至 artifactory

../gradlew clean assembleRelease artifactoryPublish --stacktrace --info
  • A private Maven repository for Android in 30 min
  • Getting the most out of Artifactory
  • Android library dependencies missing from POM with Gradle
  • n-publish cannot not apply withXML on pom file (No signature of method)

你可能感兴趣的:(上传依赖至Artifactory)