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

2023-05-16

前言

可能有读者会疑惑,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 {
        google()
        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 插件。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android Gradle Plugins系列-02-Maven Publish 插件踩坑指南 的相关文章

  • 进度条中形状的填充

    我正在使用 xml 文件来定义进度条 我在背景形状上定义了填充 但这个设置有时会正确显示 有时则不能 因此 如果我启动内部带有进度条的应用程序或活动 则会正确显示带有背景和 填充 进度的进度条 然后我关闭我的应用程序并再次启动它 并且 进度
  • 在 Angular 2、4、5、6 中实现插件架构/插件系统/可插拔框架

    2018 年 5 月 24 日更新 从我原来的帖子来看 我们现在已经是 Angular 的 3 版本了 但仍然没有最终的可行解决方案 Lars Meijdam LarsMeijdam 提出了一种有趣的方法 当然值得一看 由于专有问题 他不得
  • 使用kivy/python访问android手电筒(相机LED闪光灯)

    我不知道如何使用 python 或 kivy 访问 android 上的 led 灯 我尝试安装 python for android 以便能够将 android 模块导入到我的代码中 但不是找不到模块 我按照此处的说明克隆了 python
  • 如何处理 Jetpack Compose 中的导航?

    在 Jetpack Compose 中 导航应该如何完成 所有 并不多 示例 包括来自 Google 的官方示例 都使用密封类并加载新屏幕以响应观察当前屏幕的变化 这确实 有点 有效 但不提供导航返回堆栈 并且手机的后退按钮完全不知道 只是
  • Android应用程序是否动态更改其目标API级别

    我有一个针对 Android API 级别 30 Android 11 的 Xamarin Forms 应用程序 其中安装了 Xamarin Twilio AudioSwitch v1 1 3 该应用程序可在 Play 商店中使用 并且在
  • 如何安全地更改Android Studio中的项目名称?

    我想更改Android Studio中的项目名称 我在 Stackoverflow 上找到了一些答案 但它对我不起作用 请给我推荐一些合适的解决方案 目前我正在使用 Android Studio 2 3 永远感谢 您需要执行几个步骤 首先转
  • java.lang.UnsatisfiedLinkError:java.library.path中没有opencv_java2411

    我正在尝试将 opencv 添加到我的 Spring Boot Maven 项目中 为了使用 opencv 库 我必须在 java library path 中提供本机库 我已将以下命令添加到 Eclipse VM 参数中 Djava li
  • 我的应用程序重新启动后房间数据丢失

    我的应用程序中有一个 Room 的简单实现 它有两个实体 应用程序运行时它工作正常 但应用程序重新启动后我看不到任何数据 这是我的数据库创建代码 Database entities Person class College class ve
  • 如何使用远程 URL 在 Android 模拟器中播放 mp4 视频?

    如何使用远程 URL 在 Android 模拟器中播放 mp4 视频 我使用了以下代码 但此代码给我错误 抱歉 该视频无法播放 07 05 16 58 19 525 INFO AwesomePlayer 34 mConnectingData
  • 如何从 docker 运行 Maven 包装器?

    我必须从 dockerfile 运行 Maven 包装器命令 但我不知道该怎么做 当我尝试这样写时 RUN mvnw s settings xml clean install 这个命令不起作用 我有错误mvnw not found 我的泊坞
  • Android WebView setCertificate 问题 SSL 问题

    我看过很多关于 SSL 错误的帖子和信息 并且我自己也偶然发现了一个 我尝试使用 GlobalSign CA BE 证书通过 Android WebView 访问网页 但收到不受信任的错误 对于大多数手机来说 处理这个问题效果很好 只需告诉
  • 使android listview布局可滚动

    我有一个 xml 文件 其布局为 ASCII 形式 ImageView TextView List
  • 在 Android 应用程序中使用传单来显示在线地图

    是否有任何示例项目展示如何正确使用传单在 Android 应用程序中显示在线地图 因为我尝试了很多示例 但每次我的应用程序中都有一个空的网络视图 这是我的代码 private WebView mWebView Override protec
  • 未找到 ID 为“com.android.feature”的插件

    在将我现有的应用程序转换为即时应用程序时 使用这个 Codelab 教程 https codelabs developers google com codelabs android instant apps 遇到这个错误 Plugin wi
  • 回购:找不到命令?

    我是 git 和 repo 的新手 我使用的是window 7 所以我使用cygwin 我已经从 cygwin 安装程序安装了 git 之后我尝试在 cygwin 中使用以下命令进行存储 repo init u git android gi
  • 使用 Spark SQL 时找不到 Spark Logging 类

    我正在尝试用 Java 进行简单的 Spark SQL 编程 在程序中 我从 Cassandra 表获取数据 将RDD into a Dataset并显示数据 当我运行spark submit命令 我收到错误 java lang Class
  • 无法放置双重 SharedPreferences

    出现错误 这种类型的共享首选项编辑器的 put double 方法未定义 Eclipse 提供了一种快速修复方法 将强制类型转换添加到编辑器 但是当我这样做时 它仍然给出错误 为什么我不能 put double 代码 Override pr
  • Android Studio 3.0 中的 Gradle 构建错误

    您能帮我解决 Android 3 0 中的 Gradle 构建问题吗 我是 Android Studio 的新手 以下是我在 AS 3 0 中的配置 gradle gt wrapper gt gradle wrapper propertie
  • 与桌面浏览器相比,移动浏览器有多强大? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • E/libEGL: validate_display:99 错误 3008 (EGL_BAD_DISPLAY) API 24 或更高版本

    当我使用 API 为 24 或更高版本的设备时 我收到此错误 E libEGL validate display 99 错误 3008 EGL BAD DISPLAY XML 代码 activity main xml

随机推荐

  • 【GPU编程】体绘制传输函数-分类(Volume Rendering Transfer function:Pre- VS Post-Classification)

    在科学可视化中 xff0c 我们所获得的体数据集经常是代表一些光学上的不同物理属性的单值 通常没有可行的方法可以从这样的数据中获得发射和吸收属性 因此用户必须采用某种映射方法给数据值分配光学属性值来决定数据中的不同结构的模样 这离的映射就被
  • 【OpenGL】理解GL_TRIANGLE_STRIP等绘制三角形序列的三种方式

    GL TRIANGLE STRIP绘制三角形方式很多时候令人疑惑 xff0c 在这里对其运作机理进行解释 一般情况下有三种绘制一系列三角形的方式 xff0c 分别是GL TRIANGLES GL TRIANGLE STRIP和GL TRIA
  • OpenJDK与JDK的区别分析

    OpenJDK与JDK的区别分析 一 以下是具体分析 xff1a 使用过LINUX的人都应该知道 xff0c 在大多数LINUX发行版本里 xff0c 内置或者通过软件源安装JDK的话 xff0c 都是安装的OpenJDK xff0c 那么
  • 【C++深入探索】Copy-and-swap idiom详解和实现安全自我赋值

    任何管理某资源的类比如智能指针需要遵循一个规则 xff08 The Rule of Three xff09 xff1a 如果你需要显式地声明一下三者中的一个 xff1a 析构函数 拷贝构造函数或者是拷贝赋值操作符 xff0c 那么你需要显式
  • 【Linux】Vim编辑器-批量注释与反注释

    vim编辑器 批量注释与反注释 在使用vim编写代码的时候 xff0c 经常需要用到批量注释与反注释一段代码 下面简要介绍其操作 方法一 块选择模式 插入注释 xff1a 用v进入virtual模式 用上下键选中需要注释的行数 按Contr
  • 【算法学习】图相关算法编程实现-深度优先遍历和广度优先遍历

    一 图的表示 图G 61 V E 要表示一个图 xff0c 通常有两种方法 xff1a 邻接表和邻接矩阵 两种方法都既可以表示有向图 xff0c 也可以表示无向图 邻接表表示由一个包含 V 个列表的数组组成 xff0c 其中每个列表对应V中
  • 【笔试面试题】腾讯2013实习生面试算法题及参考答案

    总结了一下自己遇到的以及同学遇到的面试算法题 xff0c 是技术二面 有几道题给出了参考答案 xff0c 还有几道没有好的思路 路过的大侠如果有好的思路请留个言交流下呗 1 八数码问题 xff1a 3 3的格子 xff0c 有1 8个数 x
  • 【Linux学习】epoll详解

    什么是 epoll epoll 是什么 xff1f 按照 man 手册的说法 xff1a 是为处理大批量句柄而作了改进的 poll 当然 xff0c 这不是 2 6 内核才有的 xff0c 它是在 2 5 44 内核中被引进的 epoll
  • 算法设计应该依赖抽象而不是业务

    很多时候 xff0c 算法的设计是归属于详细设计阶段的 一些公司甚至都没有设计而直接编码 这些往往导致很多算法的实现都混杂在业务模块中 典型的特点是 xff0c 这些算法会依赖于业务实体的某些属性的实现 举一个简单的例子 xff0c 我曾经
  • 做程序员老婆的幸福

    刚好看网上一个写程序员老公的 说说程序员老公的一些事情 请帮忙分析是不是典型程序员 xff0c 想起自己就是一个程序员 xff0c 也是一个老公 xff0c 却不以为然起来 虽然不以为然 xff0c 却并没有驳斥的任何意思 毕竟很多人都不一
  • 好习惯成就好程序员

    公司搞了一次技术峰会 xff0c 我有机会和大家聊了一下有关如何成功的问题 会上我向大家提出了我的想法 xff0c 好习惯才能成就好程序员 有很多人可能对这句话很不以为然 xff0c 我也不忙辩解 xff0c 先回答我下面的一个问题 现在我
  • 程序江湖:第三章 莫等闲白了少年头

    周五因为羽毛球比赛 xff0c 没有更新 xff0c 今天继续 读者反馈 xff1a 很多读者反馈主人公的名字比较土 呵呵这个没关系 xff0c 可以在整理的时候统一修改 另外有些人表示特别希望看到职场的故事 xff0c 这个放心 本就是这
  • 程序江湖:第二十章 讲标的前一晚上

    说明 xff1a 非常抱歉 xff0c 这周参加了太多的会议 原来写作也是需要心情的 xff0c 当没有心情的时候 xff0c 你都懒得动笔 欧阳明来到云南的最主要的目的 xff0c 是为了应对昆明客户要求的评标 就是客户邀请了几家资质还可
  • springboot项目搭建

    一 Springboot 基本概念 1 1 什么是 springboot Spring Boot是由Pivotal团队提供的全新框架 xff0c 其设计目的是用来简化新Spring应用的初始搭建以及开发过程 该框架使用了特定的方式来进行配置
  • 管理 VS. 面向对象设计

    我是在吃虾的时候 xff0c 突然想起这个关联的 管理 xff0c 往往就是给你一堆事 xff0c 然后再给你一些人 xff0c OK xff0c 你去做吧 这是你的使命 下面我们来做类比吧 首先一个问题 xff0c 你是认为人重要 xff
  • 技术管理案例:代码规范还要继续推行吗?

    这是实际工作中总结的一个典型案例 是真实的 写出来供大家参考 案例 xff1a 技术经理 Y 今年新到了一个产品部门 xff0c 发现原来产品的代码很乱 xff0c 遗留的问题很多 而现有的人员 xff0c 又大半是新招的 xff0c 很多
  • 苹果成功的根本:统筹创新

    这周的某天中午 xff0c 我们聊起了这个话题 xff0c 是关于苹果为什么成功的话题 很多人都说是因为苹果的创新能力很强 但是诺基亚也不缺乏创新啊 xff01 为什么苹果就能胜出呢 xff1f 我个人认为这有很多方面是因为乔布斯 xff0
  • 建立健康的职业发展观

    Google的Reader要下线了 xff0c 很多人都说这是因为Blog的没落 微博的兴起 xff0c 确实给了很多人表达情绪的方式 如果我能够用140个字 xff0c 清晰的表达我的观点 xff0c 并且能够让我的读者做到一点点认可 x
  • Android Gradle Plugins系列-01-自定义Gradle插件入门指南

    前言 本文内容已经有很多大佬写过了 xff0c 不过这里为了知识体系的完整 xff0c 就再写一遍 xff0c 并加入Maven Publish插件的使用 xff0c 不感兴趣跳过就好 官方文档 xff1a Developing Custo
  • Android Gradle Plugins系列-02-Maven Publish 插件踩坑指南

    前言 可能有读者会疑惑 xff0c Maven Publish 插件又是啥玩意 xff1f 确定不是Maven插件吗 xff1f 不要逗我 让笔者慢慢道来 xff0c 如果你刚好把AndroidStudio升级到Android Studio