为什么我的 annotationProcessor 配置看不到我的 Gradle 平台中的版本?

Why doesn't my annotationProcessor configuration see the version in my Gradle Platform?

我正在使用 Gradle Platform (specifically java-platform) 来控制我的传递依赖项。我有以下模块:

platform/build.gradle

plugins {
    id 'java-platform'
}
dependencies {
    constraints {
        api('foo:bar:123')
    }
}

app/build.gradle:

plugins {
    id 'com.android.application'
}

android {
    buildToolsVersion rootProject.buildToolsVersion
    compileSdkVersion rootProject.compileSdkVersion

    defaultConfig {
        maxSdkVersion rootProject.maxSdkVersion
        minSdkVersion rootProject.minSdkVersion
        targetSdkVersion rootProject.targetSdkVersion
        versionCode 1
        versionName '1.0'
    }
    
    compileOptions {
        sourceCompatibility rootProject.sourceCompatibility
        targetCompatibility rootProject.targetCompatibility
    }
}

dependencies {
    api(platform(project(':platform')))

    annotationProcessor('foo:bar')
}

但是当我 运行 ./gradlew :app:dependencies, gradle 找不到我的 annotationProcessor 版本时:

debugAnnotationProcessorClasspath - Resolved configuration for annotation-processor for variant: debug
\--- foo:bar FAILED

如果我明确指定版本,那么一切正常:

app/build.gradle:

plugins {
    id 'com.android.application'
}

android {
    buildToolsVersion rootProject.buildToolsVersion
    compileSdkVersion rootProject.compileSdkVersion

    defaultConfig {
        maxSdkVersion rootProject.maxSdkVersion
        minSdkVersion rootProject.minSdkVersion
        targetSdkVersion rootProject.targetSdkVersion
        versionCode 1
        versionName '1.0'
    }
    
    compileOptions {
        sourceCompatibility rootProject.sourceCompatibility
        targetCompatibility rootProject.targetCompatibility
    }
}

dependencies {    
    annotationProcessor('foo:bar:123')
}

然后我在./gradlew :app:dependencies中看到了版本:

debugAnnotationProcessorClasspath - Resolved configuration for annotation-processor for variant: debug
\--- foo:bar:123

我必须为每个要使用它的配置指定一个 Gradle 平台,所以

annotationProcessor(platform(project(':platform')))

这个gradle问题提供了线索:https://github.com/gradle/gradle/issues/8723

这些模块定义有效:

platform/build.gradle

plugins {
    id 'java-platform'
}
dependencies {
    constraints {
        api('foo:bar:123')
    }
}

app/build.gradle:

plugins {
    id 'com.android.application'
}

android {
    buildToolsVersion rootProject.buildToolsVersion
    compileSdkVersion rootProject.compileSdkVersion

    defaultConfig {
        maxSdkVersion rootProject.maxSdkVersion
        minSdkVersion rootProject.minSdkVersion
        targetSdkVersion rootProject.targetSdkVersion
        versionCode 1
        versionName '1.0'
    }
    
    compileOptions {
        sourceCompatibility rootProject.sourceCompatibility
        targetCompatibility rootProject.targetCompatibility
    }
}

dependencies {
    annotationProcessor(platform(project(':platform')))

    annotationProcessor('foo:bar')
}

annotationProcessor 配置表示与您的应用程序类路径不同的依赖关系图。它是完全独立的,因为它是“编译器插件”的依赖项。因此,声明为 implementation ... 的依赖项将 不会 annotationProcessor 路径上找到,而且它们不能。这里的 platform 依赖项没有什么不同,所以并不是因为您声明了对 implementation 的平台依赖项它会神奇地出现在 annotationProcessor 路径上:没有理由这样做。

长话短说:您也需要将您的平台声明为 annotationProcessor 的依赖项。请注意,绝对没有理由为 编译器类路径 annotationProcessor 路径)和 应用程序类路径使用相同的依赖版本:例如,您使用的注释处理器可能依赖于与您的应用程序不同的 Guava 版本,因此最好将平台分开。