• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

Android Gradle Plugins系列-02-Maven Publish 插件踩坑指南

武飞扬头像
农贤钢
帮助7

前言

可能有读者会疑惑,Maven Publish 插件又是啥玩意?确定不是Maven插件吗?不要逗我。

让笔者慢慢道来,如果你刚好把AndroidStudio升级到Android Studio Arctic Fox版本,刚好想新建一个工程来编写自定义Gradle插件,你就会发现你掉坑里了(没错,就是笔者本人了!),噩梦从此开始,一切都是因为你新建的工程中Gradle及其插件的版本已经默认是7.0及以上了。惊喜不惊喜,意外不意外?升级一时爽,填坑两行泪。

classpath "com.android.tools.build:gradle:7.0.1"
   
distributionBase=GRADLE_USER_HOME
distributionUrl=https\://services.gradle.org/distributions/gradle-7.0.2-bin.zip
distributionPath=wrapper/dists
zipStorePath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME

这个时候,Maven插件就不能正常用了。

本文的主要内容是记录Maven Publish插件使用过程中踩的一些坑,把填坑的过程分享出来,希望能够帮助到大家,顺顺利利。

什么是Maven Publish Plugin

Maven Publish Plugin 提供了将构建产物发布到 Apache Maven 仓库的能力。 发布到 Maven仓库的模块可以被 Maven、Gradle和其他了解 Maven 仓库格式的工具使用。

Maven Publish介绍见Gradle官方文档Maven Publish Plugin

Maven Publish使用见Android官方文档使用 Maven Publish 插件

踩坑记录

如果你想在Android Studio Arctic Fox版本上开发自定义插件,那本文可能会对你有所帮助。在这里,笔者把开发的过程一步步记录下来,方便大家排查问题。

首先,要新建一个工程。然后再新建一个名为CustomGradlePlugin的Module,删除不必要的文件如下:

学新通

在使用老版本的AndroidStudio和低于7.0版本的Gradle插件时,我们通常使用Maven插件来管理自定义Gradle插件,插件的的build.gradle一般会这么写:

apply plugin: 'java-library'
apply plugin: 'maven'
apply plugin: 'kotlin'

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation "com.android.tools.build:gradle:3.5.0"
    implementation gradleApi()
    implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.5.30"
    implementation group: 'org.ow2.asm', name: 'asm', version: '7.2'
    implementation group: 'org.ow2.asm', name: 'asm-commons', version: '7.2'
}

def lib_path = LIB_PATH

uploadArchives {
    repositories.mavenDeployer {
        // 配置本地仓库路径,项目根目录下的repository目录中
        repository(url: uri("${lib_path}/repos"))
        pom.project {
            groupId 'com.nxg.plugin'// 唯一标识(通常为模块包名,也可以任意)
            artifactId 'custom-plugin' // 项目名称(通常为类库模块名称,也可以任意)
            version "1.0.0"      // 版本号
        }
    }
}
学新通

Plugin with id 'maven' not found.

要是在Gradle 7.0的版本上还这么写,就会报错:

Build file '/home/work/AndroidStudioProjects/AndroidDevelopmentPractices/AndroidGradlePluginsSample/CustomGradlePlugin/build.gradle' line: 2

A problem occurred evaluating project ':CustomGradlePlugin'.
> Plugin with id 'maven' not found.

* Try:
Run with --info or --debug option to get more log output. Run with --scan to get full insights.

对比新建的Module的build.gradle修改之前,发现代码变成这样写了:

plugins {
    id 'com.android.application'
    id 'kotlin-android'
}


//kotlin
plugins {
    `maven-publish`
}

修改如下:

plugins {
    id 'maven'
    id 'java-library'
    id 'kotlin'
}

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation "com.android.tools.build:gradle:3.5.0"
    implementation gradleApi()
    implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.5.30"
    implementation group: 'org.ow2.asm', name: 'asm', version: '7.2'
    implementation group: 'org.ow2.asm', name: 'asm-commons', version: '7.2'
}

def lib_path = LIB_PATH

uploadArchives {
    repositories.mavenDeployer {
        // 配置本地仓库路径,项目根目录下的repository目录中
        repository(url: uri("${lib_path}/repos"))
        pom.project {
            groupId 'com.nxg.plugin'// 唯一标识(通常为模块包名,也可以任意)
            artifactId 'custom-plugin' // 项目名称(通常为类库模块名称,也可以任意)
            version "1.0.0"      // 版本号
        }
    }
}
学新通

Plugin [id: 'maven'] was not found in any of the following sources:

依然报错了:

Build file '/home/work/AndroidStudioProjects/AndroidDevelopmentPractices/AndroidGradlePluginsSample/CustomGradlePlugin/build.gradle' line: 2

Plugin [id: 'maven'] was not found in any of the following sources:

* Try:
Run with --info or --debug option to get more log output. Run with --scan to get full insights.

* Exception is:
org.gradle.api.plugins.UnknownPluginException: Plugin [id: 'maven'] was not found in any of the following sources:

- Gradle Core Plugins (not a core plugin, please see https://docs.gradle.org/7.0.2/userguide/standard_plugins.html for available core plugins)
学新通

本来还想看下报错里的官方文档链接,但404了,搜索一番,在一步之内这位大佬的Plugin with id ‘maven‘ not found或者Plugin [id: ‘maven‘] was not found in any of the following sources得到答案。不过还是翻下官方看看有没有相关说明,果然maven插件在Gradle的7.0版本中被移除了。

学新通

链接在这:Plugin with id ‘maven’ not found

Upgrading your build from Gradle 6.x to the latest for details and other breaking changes.

Removal of the legacymavenplugin

The maven plugin has been removed. You should use the maven-publish plugin instead.

Please refer to the documentation of the Maven Publish plugin for more details.

Removal of theuploadArchivestask

The uploadArchives task was used in combination with the legacy Ivy or Maven publishing mechanisms. It has been removed in Gradle 7. You should migrate to the maven-publish or ivy-publish plugin instead.

Please refer to the documentation of the Maven Publish plugin for publishing on Maven repositories. Please refer to the documentation of the Ivy Publish plugin for publishing on Ivy repositories.

根据官方文档的指引,Gradle 7.0的版本需要使用Maven Publish插件替代Maven插件;同时

uploadArchivesta也被移除了,相关用法变成了这样:

publishing {
    publications {
        maven(MavenPublication) {
            groupId = 'org.gradle.sample'
            artifactId = 'library'
            version = '1.1'

            from components.java
        }
    }
}

按照文档修改如下:

plugins {
    id 'maven-publish'
    id 'java-library'
    id 'kotlin'
}

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation "com.android.tools.build:gradle:3.5.0"
    implementation gradleApi()
    implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.5.30"
    implementation group: 'org.ow2.asm', name: 'asm', version: '7.2'
    implementation group: 'org.ow2.asm', name: 'asm-commons', version: '7.2'
}

publishing {
    publications {
        maven(MavenPublication) {
            groupId = 'com.nxg.plugin'
            artifactId = 'custom-plugin'
            version = '1.0.0'
            from components.java
        }
    }

    repositories {
        maven {
            // change to point to your repo, e.g. http://my.org/repo
            url = layout.buildDirectory.dir('repo')
        }
    }
}

java {
    sourceCompatibility = JavaVersion.VERSION_1_8
    targetCompatibility = JavaVersion.VERSION_1_8
}
学新通

Build was configured to prefer settings repositories over project repositories but repository 'Gradle Libs' was added by unknown code

应该可以了吧,结果还是报错了:

Build was configured to prefer settings repositories over project repositories but repository 'Gradle Libs' was added by unknown code

* Try:
Run with --info or --debug option to get more log output. Run with --scan to get full insights.

* Exception is:
org.gradle.api.InvalidUserCodeException: Build was configured to prefer settings repositories over project repositories but repository 'Gradle Libs' was added by unknown code

这次,没有在官方找到解决方法,Github上也没有,最后在这个大佬良秋repository ‘Gradle Libs‘ was added by unknown code文章找到解决的方法,感谢。

关于这个问题的本质原因,暂时先不管,修改Settign.gradle的配置如下:

dependencyResolutionManagement {
    //repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
    repositories {
        谷歌()
        mavenCentral()
        jcenter() // Warning: this repository is going to shut down soon
    }
}
rootProject.name = "AndroidGradlePluginsSample"
include ':app'
include ':CustomGradlePlugin'

嘿嘿,这次Gradle终于Build成功了,喜极而泣%>_<%。

Deprecated Gradle features were used in this build, making it incompatible with Gradle 8.0.
Use '--warning-mode all' to show the individual deprecation warnings.
See https://docs.gradle.org/7.0.2/userguide/command_line_interface.html#sec:command_line_warnings

BUILD SUCCESSFUL in 19s

publish tasks

Gradle Build成功后,会在右上角的Gradle会出现publish的tasks如下:

> Task :CustomGradlePlugin:generateMetadataFileForMavenPublication
> Task :CustomGradlePlugin:generatePomFileForMavenPublication
> Task :CustomGradlePlugin:publish
> Task :CustomGradlePlugin:publishAllPublicationsToMavenRepository
> Task :CustomGradlePlugin:publishMavenPublicationToMavenLocal
> Task :CustomGradlePlugin:publishMavenPublicationToMavenRepository
> Task :CustomGradlePlugin:publishToMavenLocal

学新通

如果没出现,请检查下这个地方:

学新通

这些Task都有什么用?管它呢,先运行看看,看publish比较顺眼,买它,哦不对,点它(双击)。

学新通

提示Build Success,然后会在这个路径CustomGradlePlugin/build/repo生成对应的Artifact(构建产物)。还是熟悉的配方,熟悉的味道。但是实际上我们并没有编写插件代码,那custom-plugin-1.0.0.jar会是什么?我们使用JD-GUI打开瞧瞧:

学新通

只有一个MATA-INF文件夹,里面的文件是MANIFEST.MF,内容是Manifest-Version: 1.0,你猜对了吗?

至此,我们就知道publis task是用来替代uploadArchives task的,而且更多更强大。

小结

Maven Publish插件的踩坑记录就到此,更多详细用法,看看以后有没有时间补充下吧。关于自定义插件的内容可以参考Android Gradle Plugins系列-01-自定义Gradle插件入门指南

参考资料

Maven Publish介绍见Gradle官方文档Maven Publish Plugin

Maven Publish使用见Android官方文档使用 Maven Publish 插件

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhcjckkb
系列文章
更多 icon
同类精品
更多 icon
继续加载