Gradle Kotlin allprojects依赖导致构建失败。

4
在我的Gradle项目中,我可以声明一个带有“implementation”条目的“dependencies”块,没有问题。然而,当我尝试声明像这样的东西时,就会出现错误:
allprojects {
    dependencies {
        implementation("...")
    }
}

The error I get:

Could not find method implementation() for arguments [org.mockito:mockito-core:2.25.0]
on object of type org.gradle.api.internal.artifacts.dsl.dependencies.DefaultDependencyHandler.

我无法在Java项目中重现这个问题,所以可能与Kotlin项目有关。我对Gradle还很陌生,所以我可能只是做了一些傻事?以下是我的环境信息:

$ gradle --version

------------------------------------------------------------
Gradle 5.2.1
------------------------------------------------------------

Build time:   2019-02-08 19:00:10 UTC
Revision:     f02764e074c32ee8851a4e1877dd1fea8ffb7183

Kotlin DSL:   1.1.3
Kotlin:       1.3.20
Groovy:       2.5.4
Ant:          Apache Ant(TM) version 1.9.13 compiled on July 10 2018
JVM:          1.8.0_112 (Oracle Corporation 25.112-b15)
OS:           Windows 10 10.0 amd64

最小化重现

我可以通过一个最小化的项目来重现这个问题。

build.gradle:

plugins {
    id 'org.jetbrains.kotlin.jvm' version '1.3.21'
}

group = 'com.example'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '1.8'

repositories {
    mavenCentral()
}

// This works.
dependencies {
    implementation 'org.mockito:mockito-core:2.25.0'
}

// Causes an error. Using a random dependency to reproduce the issue.
allprojects {
    dependencies {
        implementation 'org.mockito:mockito-core:2.25.0'
    }
}

settings.gradle:

rootProject.name = 'demo'

// Removing this line causes the error to go away, but means the module is missing.
include 'submodule'

submodule/build.gradle

// Empty file. I've tried adding various plugins (java / kotlin) to no avail.
1个回答

3
您的build.gradle中存在问题,即您尝试使用构建依赖配置,此时为implementation,但未指定java插件。 Gradle文档如下所示;

Java插件会向您的项目添加许多依赖项配置,如下所示。编译Java和测试等任务然后使用其中一个或多个配置来获取相应的文件并使用它们,例如将它们放在编译或运行时类路径上。

一种解决方法是按以下方式包含java插件(我已在5.2.1上测试过,效果良好);

allprojects {
    apply plugin: 'java'
    dependencies {
        implementation 'org.mockito:mockito-core:2.25.0'
    }
}

构建配置与java插件的关系已经在https://docs.gradle.org/current/userguide/java_plugin.html#sec:java_plugin_and_dependency_management中得到了全面的解释。

另外,请确保不要在子项目中重复声明此依赖项(或任何其他在根目录或所有项目中声明的依赖项)。

有关管理依赖关系配置的详细信息,请参阅https://docs.gradle.org/current/userguide/managing_dependency_configurations.html#managing_dependency_configurations


1
太棒了,谢谢!我在我的项目中使用 Kotlin DSL(但希望尽可能地将我的复制品最小化)。这对我来说非常好用:allprojects { apply<JavaPlugin>()) dependencies { ... } } - Chris Parton
值得注意的是,我已经在我的子模块中启用了Java插件,但我猜allprojects {}块在子模块的plugins {}块之前执行。 - Chris Parton
1
太好了。很高兴能帮到你。是的,根模块中包含所有项目的模块会首先被选中。在谷歌上搜索Gradle多模块项目,有一份不错的文档。 - Laksitha Ranasingha

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接