原文链接 https://www.cmonbaby.com/posts/jcenter_maven_01.html
原文链接 https://www.cmonbaby.com/posts/jcenter_maven_02.html
google官方、Android Studio支持的Jcenter,突如其来的一篇公告让我措手不及,上图:
image
发觉事情蹊跷后,马上度娘看下。查了好久才找到同样翻车的伙计,上图:
image
- 总结下:
- 它对Java社区的影响是巨大的,尤其是
Android
社区,它意味着五月之后很多构建会直接失败。但是我发现好像国内没什么人关心,毕竟人类的本质是拖延症吧重点:五月之后很多构建会直接失败")重点:五月之后很多构建会直接失败
- 说人话就是:
如果你的项目中,有任何一个第三方库来源于jcenter
。 结果就是,编译都是失败的,更别想run和签名打包
那么来谈一谈初步的解决方案:
解决方案参考(一)
- 项目根目录(非app目录)
- 创建:javadocs.gradle
- 创建:maven.gradle
- 创建: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文件
// 动态读取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和参数
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
}
// 软件开源协议,现在一般都是Apache License2.0
if (project.hasProperty("licenseName")) {
licenses {
license {
name licenseName
url licenseUrl
}
}
}
// 填写开发者基本信息
if (project.hasProperty("developerId") && project.hasProperty("developerName")
&& project.hasProperty("developerEmail")) {
developers {
developer {
id developerId // 开发者的id。
name developerName // 开发者名字。
email developerEmail // 开发者邮箱。
}
}
}
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 个步骤非常关键!!!
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" // 支持的协议
licenseUrl = 'http://www.apache.org/licenses/LICENSE-2.0.txt' // 支持的协议网址
libraryPackaging = 'jar' // 选填(已处理)如果是'com.android.library'默认上传aar, 如果是'java-library'默认上传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环境没配置,请度娘~
以上方案比较仓促整理,上传可以成功,下载依赖还待测试,过几天我再更新!
image