原文鏈接 https://www.cmonbaby.com/posts/jcenter_maven_01.html
原文鏈接 https://www.cmonbaby.com/posts/jcenter_maven_02.html
google官方、Android Studio支持的Jcenter,突如其來的一篇公告讓我措手不及,上圖:

image
發(fā)覺事情蹊蹺后,馬上度娘看下。查了好久才找到同樣翻車的伙計,上圖:

image
- 總結(jié)下:
- 它對Java社區(qū)的影響是巨大的,尤其是
Android社區(qū),它意味著五月之后很多構(gòu)建會直接失敗。但是我發(fā)現(xiàn)好像國內(nèi)沒什么人關(guān)心,畢竟人類的本質(zhì)是拖延癥吧重點:五月之后很多構(gòu)建會直接失敗")重點:五月之后很多構(gòu)建會直接失敗
- 說人話就是:
如果你的項目中,有任何一個第三方庫來源于jcenter。 結(jié)果就是,編譯都是失敗的,更別想run和簽名打包
那么來談一談初步的解決方案:
解決方案參考(一)
- 項目根目錄(非app目錄)
- 創(chuàng)建:javadocs.gradle
- 創(chuàng)建:maven.gradle
- 創(chuàng)建:simon.gradle (隨意命名)
javadocs.gradle代碼如下:
// 生成javadoc.jar和source.jar
if (project.hasProperty("android")) {
// Android libraries
println(">>>>>>>>>>>>>>> JavaDoc for AndroidLibrary, Java Version:" + JavaVersion.current().getMajorVersion())
// 打包source源碼
task sourcesJar(type: Jar) {
classifier = 'sources'
from android.sourceSets.main.java.srcDirs
}
// 打包class的jar包
if (project.hasProperty("zipFile")) {
task makeJar(type: Jar) {
from zipTree(file(zipFile))
destinationDir = file("build")
}
}
android.libraryVariants.all { variant ->
if (variant.name == 'release') {
// 只需release的javadoc
task("generate${variant.name.capitalize()}Javadoc", type: Javadoc) {
title "API Documentation (${project.android.defaultConfig.versionName})"
group "ApiDoc"
description "Generates Javadoc for $variant.name."
ext.androidJar = "${android.sdkDirectory}/platforms/${android.compileSdkVersion}/android.jar"
source = variant.sourceSets.collect { it.java.sourceFiles }.inject { m, i -> m + i }
doFirst {
classpath = project.files(variant.javaCompileProvider.get().classpath.files,
project.android.getBootClasspath())
}
options {
encoding "UTF-8"
charSet 'UTF-8'
author true
version true
if (project.hasProperty("libName")) {
title libName
}
}
String javaDocsLink = String.format("https://docs.oracle.com/javase/%s/docs/api/",
JavaVersion.current().getMajorVersion())
options.links(javaDocsLink)
if (JavaVersion.current().isJava8Compatible()) {
options.addStringOption('Xdoclint:none', '-quiet')
}
exclude '**/BuildConfig.java'
exclude '**/R.java'
}
task("javadoc${variant.name.capitalize()}Jar", type: Jar,
dependsOn: "generate${variant.name.capitalize()}Javadoc") {
// 打包javadoc的jar包
getArchiveClassifier().value('javadoc')
from tasks.getByName("generate${variant.name.capitalize()}Javadoc").destinationDir
}
artifacts {
archives tasks.getByName("javadoc${variant.name.capitalize()}Jar")
archives sourcesJar
archives makeJar
}
}
}
} else {
println(">>>>>>>>>>>>>>> JavaDoc for JavaLibrary")
// Java libraries
task sourcesJar(type: Jar, dependsOn: classes) {
classifier = 'sources'
from sourceSets.main.allSource
}
task javadocJar(type: Jar, dependsOn: javadoc) {
classifier = 'javadoc'
from javadoc.destinationDir
}
artifacts {
archives javadocJar
archives sourcesJar
}
}
maven.gradle代碼如下:
apply plugin: 'com.github.dcendents.android-maven'
// 配置maven庫,生成POM.xml文件
// 動態(tài)讀取local.properties
Properties properties = new Properties()
properties.load(project.rootProject.file('local.properties').newDataInputStream())
println("------------- upload -------------")
def snapshop_url = properties.getProperty("SNAPSHOT_REPOSITORY_URL")
def release_url = properties.getProperty("RELEASE_REPOSITORY_URL")
def userName = properties.getProperty("NEXUS_USERNAME")
def pwd = properties.getProperty("NEXUS_PASSWORD")
install {
println("------------- maven -------------")
repositories.mavenDeployer {
snapshotRepository(url: snapshop_url) {
authentication(userName: userName, password: pwd)
}
repository(url: release_url) {
authentication(userName: userName, password: pwd)
}
// 生成pom.xml和參數(shù)
pom {
project {
version project.hasProperty("versionName") ? versionName : project.versionName
// java jar / android aar
packaging project.hasProperty("libraryPackaging") ? libraryPackaging : project.hasProperty("android") ? 'aar' : 'jar'
groupId publishedGroupId
artifactId artifactId
// 可選,庫名稱
name project.hasProperty("libName") ? libName : project.name
// 可選,庫描述
if (project.hasProperty("libraryDesc")) {
description libraryDesc
}
// 可選,庫主頁
if (project.hasProperty("websiteUrl")) {
url websiteUrl
}
// 軟件開源協(xié)議,現(xiàn)在一般都是Apache License2.0
if (project.hasProperty("licenseName")) {
licenses {
license {
name licenseName
url licenseUrl
}
}
}
// 填寫開發(fā)者基本信息
if (project.hasProperty("developerId") && project.hasProperty("developerName")
&& project.hasProperty("developerEmail")) {
developers {
developer {
id developerId // 開發(fā)者的id。
name developerName // 開發(fā)者名字。
email developerEmail // 開發(fā)者郵箱。
}
}
}
scm {
if (project.hasProperty("websiteUrl")) {
connection websiteUrl // Git倉庫地址
developerConnection websiteUrl // Git倉庫地址
url websiteUrl // 庫主頁
}
}
}
}
}
}
simon.gradle代碼如下:
// 生成maven配置
apply from: '../maven.gradle'
// 生成JavaDocs
apply from: '../javadocs.gradle'
task simon {
doLast {
println "Release ${version}"
}
}
simon.dependsOn(install)
最后 4 個步驟非常關(guān)鍵!??!
1、在根目錄的build.gradle中配置:
dependencies {
classpath 'com.android.tools.build:gradle:3.5.4'
classpath 'com.github.dcendents:android-maven-gradle-plugin:2.1'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
2、在根目錄的local.properties中配置:
SNAPSHOT_REPOSITORY_URL=http://192.168.x.y:port/nexus/repository/maven-snapshots/
RELEASE_REPOSITORY_URL=http://192.168.x.y:port/nexus/repository/maven-releases/
NEXUS_USERNAME=admin
NEXUS_PASSWORD=xxxyyyzzz
3、在需要打包jar / aar上傳倉庫的子項目(子模塊)中,build.gradle添加:
ext {
publishedGroupId = 'com.cmonbaby' // 填寫groupId, 一般是包名,比如:com.android.support
libName = 'arouter_compiler' // 如果不填寫,就使用module名稱
versionName = '1.0.3' // 版本號,比如:1.0.0
licenseName = "Apache-2.0" // 支持的協(xié)議
licenseUrl = 'http://www.apache.org/licenses/LICENSE-2.0.txt' // 支持的協(xié)議網(wǎng)址
libraryPackaging = 'jar' // 選填(已處理)如果是'com.android.library'默認(rèn)上傳aar, 如果是'java-library'默認(rèn)上傳jar
libraryDesc = 'Android APT Library For Module Develop' // 庫的描述
websiteUrl = 'https://github.com/cnmen/arouter' // 可以填寫github上的庫地址.
developerId = '8950764'
developerName = 'simon'
developerEmail = 'simon@cmonbaby.com'
}
apply from: '../simon.gradle'
4、在Android Studio / IDEA 中,找到 logcat 旁邊的 Terminal,輸入命令行:
gradle simon
PS:如果gradle環(huán)境沒配置,請度娘~
以上方案比較倉促整理,上傳可以成功,下載依賴還待測試,過幾天我再更新!

image