地震事件:安卓jenter换源maven,解决方案参考(二)

  • 作者:彭老师
  • 日期:2021-04-09
  • 类型:Android
  • 说明:本文源于彭老师手写摘要,如需转载请带上链接或注明出处!

接上篇:地震事件:安卓jenter换源maven,解决方案参考(一)

  • 项目根目录(非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'
apply plugin: 'signing'

// 配置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")

def gpg_keyid = properties.getProperty("GPG_KEYID")
def gpg_password = properties.getProperty("GPG_PASSWORD")
def gpg_secretkeyringfile = properties.getProperty("GPG_SECRETKEYRINGFILE")

gradle.taskGraph.whenReady { taskGraph ->
if (taskGraph.allTasks.any { it instanceof Sign }) {
allprojects { ext."signing.keyId" = gpg_keyid }
allprojects { ext."signing.secretKeyRingFile" = gpg_secretkeyringfile }
allprojects { ext."signing.password" = gpg_password }
}
}

signing {
sign configurations.archives
}

install {
println("------------- maven -------------")
repositories.mavenDeployer {
beforeDeployment { MavenDeployment deployment -> signing.signPom(deployment) }

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中配置:

# 服务器地址,本地私服或者远程maven仓库地址
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

# gpg加密信息
GPG_KEYID=12345678(8位)
GPG_PASSWORD=simon(生成公/私钥密码)
GPG_SECRETKEYRINGFILE=/Users/simon/.gnupg/simon-private.gpg(命令生成)

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环境没配置,请度娘~


以上方案比较仓促整理,上传可以成功,下载依赖还待测试,过几天我再更新!


补充:备份现有的第三方库


  • 解释:

  • .m2是本地打包的库
  • .gradle里面的是远程下载库
  • 远程库:.gradle/caches/modules-2/files-2.1
  • 本地库:.m2/repository
  • 理解:

  • 远程库:不是你自己写的框架,从网络下载的
  • 本地库,指的是你自己写了框架,打包jar / aar。准备或者已经上传到全球中央仓库
  • 备份:

  • 远程库:.gradle/caches/modules-2/files-2.1