Android jcenter关闭,换源maven解决方案

原文链接 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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容