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)