發(fā)布aar到私有倉庫大概分為兩種方案:
方案一: 利用 maven 插件:
- 在項(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."
}
}
}
}
- 在項(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
- 在要發(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格式的地址迈勋。