publishToMavenLocal是专为本地仓库设计的聚合任务,自动按Maven坐标结构写入~/.m2/repository;若未生效,主因是未启用java-gradle-plugin插件导致元数据缺失,或消费者工程未在settings.gradle.kts的pluginManagement中前置声明mavenLocal()。

直接用 publishToMavenLocal 就能发布到默认本地仓库(~/.m2/repository),但多数人卡在插件没被识别、plugins { id 'xxx' } 报错,本质是没配对 publication 类型或没声明插件 ID 元数据。
为什么 publish 不生效,而必须用 publishToMavenLocal
publish 任务只发往你显式声明的 repositories(比如 url "../repo"),它默认不碰 ~/.m2/repository;而 publishToMavenLocal 是专为本地 Maven 缓存设计的聚合任务,会自动把 POM、JAR、sources.jar 等按 Maven 坐标结构写入 ~/.m2/repository 目录。
- 如果你只想让本机其他项目快速试用插件,
./gradlew publishToMavenLocal是最快路径 - 如果执行后
~/.m2/repository/your/group/id/下没有文件,大概率是没应用java-gradle-plugin插件,导致 Gradle 不知道怎么构建插件元数据 -
publishToMavenLocal不依赖signing或maven-publish的完整配置,只要java-gradle-plugin在位就能跑通
java-gradle-plugin 必须启用,且 pluginBundle 不是必需
Android 或纯 Gradle 插件工程里,光加 maven-publish 不够——Gradle 插件需要额外的元信息(如 implementationClass)才能被 plugins { id 'xxx' } 正确加载。这些由 java-gradle-plugin 提供。
- build.gradle.kts 中必须有:
plugins { `java-gradle-plugin` } - 必须定义插件 ID 和实现类:
gradlePlugin { plugins { register("myPlugin") { id = "com.example.myplugin" implementationClass = "com.example.MyPlugin" } } } -
pluginBundle是用于发布到 Gradle Plugin Portal 的,本地发布可完全不配 - 如果跳过这一步,
publishToMavenLocal虽然成功,但生成的 POM 里缺<gradle-plugin></gradle-plugin>块,下游项目引用时会报 “Plugin with id 'com.example.myplugin' not found”
消费者工程怎么正确引用本地发布的插件
不是在 buildscript 里加 classpath,也不是在模块级 build.gradle 里写 plugins 就完事——Gradle 7.0+ 要求插件在 pluginManagement 块中声明仓库,否则根本不会去 ~/.m2/repository 查找。
- 根目录
settings.gradle.kts中必须写:pluginManagement { repositories { mavenLocal() google() mavenCentral() } } - 顺序很重要:
mavenLocal()要放在前面,否则远程仓库先命中,就绕过本地了 - 模块级
build.gradle.kts中用plugins { id("com.example.myplugin") version "1.0.0" },注意不能省略version(除非你在pluginManagement里做了版本映射) - 如果还报找不到插件,检查
~/.m2/repository/com/example/myplugin/1.0.0/下是否有myplugin-1.0.0.jar和myplugin-1.0.0.pom,缺任意一个都说明publishToMavenLocal没真正成功
最容易被忽略的是:插件发布后,消费者工程第一次 sync 会缓存仓库列表,改了 pluginManagement 但没触发重新解析,就会一直走旧路径。遇到这种情况,删掉 .gradle 目录下 v8.9/dependency-cache(版本号依实际而定)再 sync,比猜配置快得多。










