当它似乎与我在 Gradle 文档中看到的相匹配时,为什么这是接收器类型不匹配?

问题描述

我正在将构建从 Buildr 转换为 Gradle。

到目前为止,我有以下构建脚本:

repositories {
    jcenter()
}

allprojects {
    version = "0.8.1-SNAPSHOT"
    group = "org.trypticon.hex"
}

subprojects {
    apply(plugin = "java-library")
    apply(plugin = "maven-publish")
    apply(plugin = "signing")

    configure<JavaPluginExtension> {
        sourceCompatibility = JavaVersion.VERSION_11
        withJavadocJar()
        withSourcesJar()
    }

    dependencies {
        "testImplementation"("junit:junit:4.13")
    }

    configure<PublishingExtension> {
        repositories {
            maven {
                url = uri(if (version.toString().contains("SNAPSHOT")) {
                    "https://oss.sonatype.org/content/repositories/snapshots"
                } else {
                    "https://oss.sonatype.org/service/local/staging/deploy/maven2"
                })
                credentials {
                    username = System.getenv("DEPLOY_USER")
                    password = System.getenv("DEPLOY_PASS")
                }
            }
        }
        publications {
            register<MavenPublication>("mavenJava") {
                pom {
                    // omitting a bunch of metadata unrelatted to the issue
                }
            }
        }
    }

    configure<SigningExtension> {
        sign(publishing.publications["mavenJava"])
    }
}

当我尝试构建时,我得到了这个:

build.gradle.kts:124:14: Unresolved reference. None of the following candidates is applicable because of receiver type mismatch: 
public val PluginDependenciesSpec.publishing: PluginDependencySpec defined in org.gradle.kotlin.dsl

IntelliJ 表示类型匹配并且没有显示错误。

我从 Gradle 文档中的代码开始,它说使用这个:

    signing {
        sign(publishing.publications["mavenJava"])
    }

但是在 subprojects 块内时会失败。

使用:

  • Gradle 6.8
  • Java 11.0.3

进一步调查:

我试着把这些行分开,看看问题出在哪一点。

        configure<SigningExtension> {
            val e: PublishingExtension = publishing
            val p: Publication = e.publications["mavenJava"]
            sign(p)
        }

错误直接指向第一行的 publishing。在 IDEA 中将鼠标悬停在它上面,它有助于告诉我 Project.publishing 是一个 PublishingExtension,因此调用没有显示错误。现在的问题是,为什么在检查文件时没问题,但在运行时失败?我认为这正是切换到 Kotlin 将停止的事情。 :(

解决方法

我遇到了类似的问题,我通过编写以下代码解决了这个问题:

configure<SigningExtension> {
    val pubExt = checkNotNull(extensions.findByType(PublishingExtension::class.java))
    val publication = pubExt.publications["your_publication"]

    sign(publication)
}

在您的情况下,your_publication 应替换为 mavenJava

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...