在多项目构建中使用Gradle版本目录时失败,错误:插件已在类路径上

编程语言 2026-07-08

使用Gradle版本目录功能时,当尝试对根项目以及一个或多个子项目应用同一个插件,会出现如下错误:

Build file 'F:\tmp\gradle-catalog-issue\core\build.gradle' line: 1

Error resolving plugin [id: 'com.netflix.nebula.rpm', version: '12.3.0']
> The request for this plugin could not be satisfied because the plugin is already on the classpath with an unknown version, so compatibility cannot be checked.

* Try:

要重现这个问题,可以参考一个非常简单的示例:请见 https://github.com/mricciuti/gradle-catalog-issue

  • com.netflix.nebula.rpm 应用于rootProject,使用别名 alias(libs.plugins.nebula.rpm)
  • 同样的 com.netflix.nebula.rpm 应用到 core 子项目,使用别名 alias(libs.plugins.nebula.rpm) ( or another plugin from the same plugins library, e.g.: libs.plugins.nebula.deb`

版本目录定义如下:

[versions]
nebulaPluginsVersion = "12.3.0"

[plugins]
nebula-rpm = { id = "com.netflix.nebula.deb", version.ref = "nebulaPluginsVersion" }
nebula-deb = { id = "com.netflix.nebula.rpm", version.ref = "nebulaPluginsVersion" }

如果像下面这样对子项目使用遗留的plugin apply DSL,错误就会消失,构建也会通过:

plugins{
//     alias(libs.plugins.nebula.deb)  // <-- this makes build fail
    id("com.netflix.nebula.deb")
}

这让Version Catalog在插件管理方面的作用变得有些有限。

解决方案

这不是一个错误。版本目录的别名始终携带版本信息,因此一旦根项目应用了该插件,子项目从该类路径继承后,在核心配置中再次以带版本的方式请求同一个插件就会失败。你应当只在一个地方指定版本。将别名保留在根项目,或在根项目不需要应用该插件时,对其使用apply false。在子项目中,通过插件的id应用插件,但不带版本号,以便从类路径中获取。版本仍由toml中定义的catalog拥有,但在继承的子项目中不能再使用别名形式。

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章