抬头仰望星空,是否能发现自己的渺小。

伪斜杠青年

人们总是混淆了欲望和理想

Gradle 7.X Maven publish 适配

就在前几天,Android studio 更新到了 4.2(瞄的 我也不知道到底几点几,2020.3.1),伴随着正式的JDK 11环境以及 Gradle 7.0,迎来了一系列的 gradle 编译问题,当然,这里主要讨论 maven 发布相关的变更与适配。

这里直接抛出主要问题:以前的 maven plugin 已经被废弃,带来的是 maven-publish plugin 。从代码层面讲就是:

apply plugin: 'maven'

变成了:

apply plugin: 'maven-publish'

同时,相关脚本也进行了变更,直接贴上最新的脚本代码:

afterEvaluate {
    publishing {
        publications {
            release(MavenPublication) {
                 from components.release 
                groupId = MAVEN_GROUP_ID
                artifactId = MAVEN_ARTIFACTID
                version = MAVEN_VERSION
            }
        }

        repositories {
            maven {
                allowInsecureProtocol true
                name = "nexus"
                url = MAVEN_RELEASE_URL
                credentials {
                    username = MAVEN_USERNAME
                    password = MAVEN_PASSWORD
                }
            }
        }
    }
}

这里大写的属性均为 gradle.properties 中定义的与 maven 发布相关的变量,通过命名应该很容易知道。

主要说两点:

  • 对于非 https 的仓库地址,需要使用 allowInsecureProtocol 字段,包括引用该仓库的地方
  • 对于需要上传的 maven 仓库,需要显式指定 name,因为在编译后,会生成相关任务,比如这样:

另外,对于 release(MavenPublication) 节点中 from components.release 字段,是有含义的~ 官网描述如下:

换成中文说就是:一个 module 的不同变种。

而对于 Android 来说,一般情况下有两种 lib,一种是 比如 gradle 插件的 Jar lib,另一种为 资源库类型的 AAR lib,这里分开说明。

  • Jar lib

纯 jar 包,也就是 gradle 配置为:apply plugin: 'java-library' 类型的 module,直接按照官方的例子进行配置:

 from components.java
  • AAR lib

对于 Android 特有的lib,即 gradle 配置为:apply plugin: 'com.android.library' 类型的 module,则需要根据 module 中的buildTypes 进行配置,比如:

buildTypes {
    release {
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
    }
    debug {
        minifyEnabled false
    }
}

那么就有两种选择:

from components.release 
或
from components.debug

即会上传不同版本的 aar 文件,这里还可以添加 Android 的风味,即:productFlavors,不进行赘述,详见官方文档:

https://developer.android.com/studio/build/build-variants?hl=zh-cn

关于一些报错:

  • Plugin with id ‘your_plugin’ not found.

这种一般为上传到 maven 的库没有内容,大概率是 component 配置错误。

  • Don’t know how to compute maven coordinate for artifact ‘Gradle API’ with component identifier of type ‘class org.gradle.internal.component.local.model.OpaqueComponentIdentifier’.

对于一些 java 的库,不要直接将 apply plugin: 'java-library' 改为 apply plugin: 'com.android.library' 。不然,你就会遇到这种错误。解决办法:没研究。

  • Using insecure protocols with repositories, without explicit opt-in, is unsupported. Switch Maven repository ‘maven(http://maven.aliyun.com/nexus/content/groups/public/)’ to redirect to a secure protocol (like HTTPS) or allow insecure protocols. See https://docs.gradle.org/7.0.2/dsl/org.gradle.api.artifacts.repositories.UrlArtifactRepository.html#org.gradle.api.artifacts.repositories.UrlArtifactRepository:allowInsecureProtocol for more details.

就是需要在非 https 的 maven 仓库中指定 allowInsecureProtocol 比如:

maven {
    allowInsecureProtocol true
    url MAVEN_RELEASE_URL
}

大概就这些内容吧,遇到问题先看官方文档:

使用 Maven Publish 插件

Maven Publish Plugin

参考: 好像参考就是上面的文档,其他都没能真正解决我的一些问题,大多写的很复杂,而我的需求其实很简单。

其他文章推荐:Android AGP 7.0 适配,开始强制 JDK 11


本站由以下主机服务商提供服务支持:

0条评论

发表评论