前言

可能有读者会疑惑,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_PATHuploadArchives {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: 2A 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_PATHuploadArchives {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: 2Plugin [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/repourl = layout.buildDirectory.dir('repo')}}
}java {sourceCompatibility = JavaVersion.VERSION_1_8targetCompatibility = 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_warningsBUILD 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 插件。

Android Gradle Plugins系列-02-Maven Publish 插件踩坑指南相关推荐

  1. android手机屏幕共享神器踩坑指南

    开源项目地址:https://github.com/Genymobile/scrcpy scrcpy,由 Genymobile 推出的可跨平台的.可自定义码率的.开源的屏幕共享工具.它提供了在 USB ...

  2. Android applink 踩坑指南

    Android applink 踩坑指南 原理 接入步骤 将链接与activity关联起来 加入meta data 生成身份验证JSON 真机测试 结论 官方文档 原理 与url scheme不同的地 ...

  3. npm adduser 和 npm publish 的踩坑

    一.npm adduser的踩坑 1.先注册 - 注册官网:https://www.npmjs.com/ - 注意,账号接收小写英文字母[a-z]+下划线[_],但不接受大写英文字母 - 填写邮箱:注 ...

  4. android 字体文件压缩,Android 字体使用踩坑指南

    Android 字体使用踩坑指南 最近项目改版,根据ui的设计,需要使用到三字体.在使用过程中遇到一些坑,于是有了这个避坑指南! 字体压缩 第一个坑!字体库的体积太大. 字体压缩的前提是要使用的内容是 ...

  5. (转)淘淘商城系列——使用maven tomcat插件启动聚合工程

    http://blog.csdn.net/yerenyuan_pku/article/details/72672389 上文我们一起学习了如何使用maven tomcat插件来启动web工程,本文我们 ...

  6. (转)淘淘商城系列——使用maven tomcat插件启动web工程

    http://blog.csdn.net/yerenyuan_pku/article/details/72672138 上文我们一起学习了怎样搭建maven工程,这篇文章我就来教大家一起学习怎样用to ...

  7. Android~老项目项目升级GradleAGP 7.0踩坑

    结合最近对公司项目做了一下升级,踩了点坑.记录一下,方便后续有人参考. module模块build.gradle变化 apply plugin变成了plugins 对部分android闭包下面的属性也 ...

  8. VLC Web插件踩坑记录

    VLC Web插件 问题描述 近期由于工作项目组人员变动,来到新的项目组,Leader约谈前期也不安排过多任务,但是有一个项目中现有的问题需要解决.项目中视频在线播放功能需要支持在线播放.avi媒体格 ...

  9. Android Studio plugins 无法在线加载插件

    在plugins 中遇到在线搜索不到插件的问题,解决方法如下

  10. android gradle权威指南pdf_干货 | 携程 Android 10适配踩坑指南

    作者简介 曙光,携程资深软件工程师,负责市场营销相关研发及管理工作.2019 年 9 月 3 日,Google 发布了 Android 10 正式版.Android 10 聚焦移动创新.安全隐私和数字 ...

最新文章

  1. 自然灾害能否被利用?
  2. 最大权闭合 图 讲解
  3. 10、MySQL存储引擎有哪些?
  4. 查看mysql日志大小,SQL Server:查看SQL日志文件大小命令:dbcc sqlperf(logspace)
  5. PHP实现图片马赛克效果
  6. keil运行c语言输入函数,keil 编译器V6 定义函数在ram中运行-和在指定地址定义常量,keil编译器...
  7. java如何构建图_如何从传递边构建子图?
  8. my first d3d application 哈哈哈。
  9. 模拟电路仿真LTspice(2):三极管特性曲线
  10. 把时间还给洞察,且看PPT调研报告自动生成攻略
  11. 【数学】嵌入式开发中涉及到的对数公式
  12. 计算机硬盘空间不都用,搞不懂的磁盘占用100% 自检一遍全解决
  13. 优秀的java程序员怎么写注释的
  14. linux 关闭系统中多余的服务
  15. 另类方法申请google adsense账号
  16. 以太智云赋能游戏产业,打造长沙顶尖NFT游戏开发平台,实现边玩边赚
  17. 锐捷服务器无线认证配置,【WLAN从入门到精通之对接案例】配置802.1X认证示例_Web(锐捷SAM服务器)...
  18. android屏幕省电,AMOLED屏幕省电吗 AMOLED屏幕耗电测评测
  19. C# windowsService安装
  20. 无胁科技-TVD每日漏洞情报-2022-7-31

热门文章

  1. freeswitch APR库
  2. java程序员昵称_那些神秘的Java程序员
  3. 超弦计算机,物理学四大神兽——拉普拉斯妖
  4. 云服务器上硬盘是虚拟的吗,虚拟硬盘映射在主机上使用
  5. Docker - Docker Image及Image命令详解
  6. 最快下月!地表最强语言模型GPT-4发布在即?CEO暗示:已通过图灵测试
  7. 【泛型,数据结构,List接口,Set接口】
  8. Valine魔改教程——添加自定义表情和QQ头像
  9. 教你使用GitHub搭建个人网站
  10. 7z文件格式及其源码的分析(四)