You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Gradle变体属性不匹配求助:OpenRewrite插件集成报错

Gradle + OpenRewrite 变体属性不匹配问题排查与修复

问题背景

给Gradle项目添加OpenRewrite插件及配方依赖后,碰到变体属性不匹配的报错,搞不懂报错内容,也不知道该怎么修,想确认是OpenRewrite的问题还是自己的依赖配置出了问题。

环境配置

Java工具链配置

java {
    toolchain {
        languageVersion = JavaLanguageVersion.of(javaVersion)
    }
}

版本信息

  • Gradle版本/包装器:8.10.1
  • OpenRewrite版本:6.28.1
  • open-rewrite-recipe-bom版本:2.23.0

报错信息

> Could not resolve all dependencies for configuration ':docsTestRuntimeClasspath'.
   > Could not resolve root project :.
     Required by:
         root project :
      > The consumer was configured to find a library for use during runtime, compatible with Java 21, packaged as a jar, preferably optimized for standard JVMs, and its dependencies declared externally. However we cannot choose between the following variants of root project ::
          - rewrite
          - runtimeElements
        All of them match the consumer attributes:
          - Variant 'rewrite' capability 'at.martinahrer:continuousdelivery:unspecified' declares a library for use during runtime, packaged as a jar, preferably optimized for standard JVMs, and its dependencies declared externally:
              - Unmatched attribute:
                  - Doesn't say anything about its target Java version (required compatibility with Java 21)
          - Variant 'runtimeElements' capability 'at.martinahrer:continuousdelivery:unspecified' declares a library for use during runtime, compatible with Java 21, packaged as a jar, and its dependencies declared externally:
              - Unmatched attribute:
                  - Doesn't say anything about its target Java environment (preferred optimized for standard JVMs)

问题分析

这个报错的核心是:docsTestRuntimeClasspath配置在解析根项目依赖时,Gradle找到了两个符合部分要求的变体,但因为各自缺了一个关键属性,没法自动选。

  • rewrite变体:满足运行时、Jar包、标准JVM优化这些要求,但没声明兼容Java 21的版本属性
  • runtimeElements变体:满足运行时、Jar包、Java 21兼容这些要求,但没声明针对标准JVM优化的环境属性

这是项目配置的属性对齐问题,不是OpenRewrite的bug——插件生成的rewrite变体没继承项目工具链的Java版本属性,而项目默认的runtimeElements变体又缺了OpenRewrite相关的JVM环境属性,导致Gradle判定不出哪个变体更合适。

解决方案

可以用以下几种方式修复:

方式1:给rewrite变体补Java版本属性

在build.gradle里配置OpenRewrite插件的变体,让它继承项目工具链的Java版本:

plugins {
    id 'java'
    id 'org.openrewrite.rewrite' version '6.28.1'
}

rewrite {
    variants {
        rewrite {
            attributes {
                attribute(JavaLanguageVersion.JAVA_LANGUAGE_VERSION_ATTRIBUTE, JavaLanguageVersion.of(javaVersion))
            }
        }
    }
}

方式2:给runtimeElements补标准JVM环境属性

给项目默认的runtimeElements变体添上目标JVM环境属性:

configurations.runtimeElements {
    attributes {
        attribute(TargetJvmEnvironment.TARGET_JVM_ENVIRONMENT_ATTRIBUTE, objects.named(TargetJvmEnvironment, "standard-jvm"))
    }
}

方式3:放宽docsTestRuntimeClasspath的属性要求

如果不需要严格要求标准JVM优化属性,可以直接移除这个要求:

configurations.docsTestRuntimeClasspath {
    attributes {
        attribute(TargetJvmEnvironment.TARGET_JVM_ENVIRONMENT_ATTRIBUTE, null)
    }
}

优先推荐前两种方式,能让变体属性更完整,避免后续再出现类似的依赖解析问题。

内容的提问来源于stack exchange,提问作者Martin Ahrer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 20:38:19