找不到方法compile(),参数为Gradle。

318

寻找这个解决方案已经太久了,我不确定是我错过了还是打错了一些东西,但我的Gradle脚本将无法编译。我正在迁移到Gradle,并且对它非常陌生。我非常习惯使用Maven进行依赖管理,但现在似乎Gradle更适合我。从运行这段代码:

dependencies {
  compile group: 'org.bukkit', name: 'bukkit', version: '1.7.9-R0.1-SNAPSHOT'
  compile('io.ibj:MattLib:1.1-SNAPSHOT') {
    exclude group: 'de.bananaco'
    exclude 'net.milkbowl:vault:1.2.27'
  }
  compile group: 'net.citizensnpcs', name: 'citizens', version: '2.0.12'
  compile group: 'com.sk89q', name: 'worldedit', version: '5.6.1'
  compile group: 'com.sk89q', name: 'worldguard', version: '5.9'
  compile group: 'net.milkbowl', name: 'vault', version: '1.2.12'
  compile fileTree(dir: 'libs', includes: ['*.jar'])
}

注意:我已经应用了Java、Maven、Nexus、Shadow和Rebel插件。

当我运行Gradle任务时,遇到了以下错误:

Could not find method compile() for arguments [[io.ibj:MattLib:1.1-SNAPSHOT], build_1b5iofu9r9krp7o8mme0dqo9l$_run_closure2_closure8@66fb45e5] on root project 'project'

如果我从我的项目中删除MattLib依赖项,并重新插入它

compile 'io.ibj:MattLib:1.1-SNAPSHOT'
脚本完成了,但我有依赖问题。我在这里阅读:
dependencies {
  compile("org.gradle.test.excludes:api:1.0") {
    exclude module: 'shared'
  }
}

(来自第50章从Gradle手册)

我拥有的东西应该可行,但我不明白为什么它不起作用。

gradle --version输出:

Groovy:       1.8.6
Ant:          Apache Ant(TM) version 1.9.3 compiled on December 23 2013
Ivy:          2.2.0
JVM:          1.8.0_05 (Oracle Corporation 25.5-b02)
OS:           Windows 7 6.1 amd64

3
你最后有解决这个问题吗?我也遇到了完全相同的问题。在讨论论坛上,有人建议将"exclude"放在一个编译模块里面,但是每次我试图这样做时,都会得到这个确切的错误提示。 - Hakanai
你好,有时我们需要检查 gradle-wrapper.properties - distributionUrl,我使用了7,但回退到6.1后正常工作。 - Shankar
9个回答

793
请注意,自Gradle 4.102018年8月27日)起,Java插件引入的compileruntimetestCompiletestRuntime配置已被弃用,并于2021年4月9日Gradle 7.0中最终删除。

应分别使用implementationruntimeOnlytestImplementationtestRuntimeOnly替换上述配置。


5
我希望有一些 RSS 订阅源,我们可以订阅以保持更新。 - Just Khaithang
1
@JustKhaithang 绝对不是推送问题,而是拉取问题。更好的文档或更好的语言将是选择。我更倾向于第一种。 - Meshugah
1
@Meshugah,你说的pull或push是什么意思? - Just Khaithang
2
只是更改命令而没有备用方案或文档条目,这样做很危险。祝贺你完成了这个任务。 - clockw0rk
1
我知道在开源项目中,除了最初级的人之外,没有人会这么愚蠢。 - bharal
显示剩余5条评论

185

确保你正在编辑正确的 build.gradle 文件。当我编辑 android/build.gradle 而不是 android/app/build.gradle 时,我收到了这个错误。


8
我也把它放错了地方。感谢你的帮助! - igorrmotta
4
你说的“错误位置”是什么意思?我应该编辑哪个Gradle文件? - guru_001
@guru_001 你应该编辑 android/app/build.gradle 文件。 - Sreekanth Karumanaghat
10
为什么他们会起相同的名字? - Developerium
1
谢谢,感觉自己像个新手一样在尝试解决这个问题。 - adot

124

compile 是一个通常由插件(最有可能是 Java 插件)引入的 configuration。有关配置详细信息,请参阅 Gradle 用户指南。现在,在您的构建脚本顶部添加 Java 插件即可:

apply plugin:'java'

这个定义的顺序似乎对构建有影响;在我的情况下,我遇到了jar()标签的问题,Rene的注释帮助我解决了这个问题。 - vsrikarunyan
在使用 Kotlin 进行开发时,需要应用 Kotlin 插件 apply plugin: "kotlin" - prayagupa
我的语法糖是插件 { id 'java' } - granadaCoder

12
DependencyHandler的文档中链接在此处有解释,应该使用module:,将exclude module: 'net.milkbowl:vault:1.2.27'添加进去,因为它使用了ModuleDependency.exclude(java.util.Map)方法。请保留HTML标签。

1
回顾这段时间,这很可能是我遇到的最大问题。我现在已经远离它了,但在收到通知说这个问题仍然没有解决之后,我认为将其作为“正确”的答案是合适的,因为它似乎是最接近的。 - Ichbinjoe

9

在我的情况下,问题是gradle版本不匹配。 我已经使用mac安装了gradle

brew install gradle

我更新了Gradle到最新版本7.0,但是当我克隆了项目仓库并执行Gradle任务时,出现了以下错误:

* What went wrong:
A problem occurred evaluating root project 'digital-engineering-course'.
> Could not find method compile() for arguments [org.springframework.boot:spring-boot-starter-web, build_bzpgd6h32w4m8umtmgs76ewog$_run_closure3$_closure8@b55ca3] on object of type org.gradle.api.internal.artifacts.dsl.dependencies.DefaultDependencyHandler.

build.gradle文件看起来对我来说很正常,因为它有常规的依赖关系。

dependencies {
    compile("org.springframework.boot:spring-boot-starter-web") {
        exclude group: 'org.springframework.boot', module: 'spring-boot-starter-logging'
    } 
    compile("org.springframework.boot:spring-boot-starter-data-mongodb")    

我花了一些时间才明白问题是版本不匹配。因为我在命令行中使用的是Gradle 7.0,所以Gradle找不到compile()方法。
该项目应该使用Gradle 4.8(实际上应该使用Gradle包装器,但由于另一个有趣的问题"Could not find or load main class org.gradle.wrapper.GradleWrapperMain"而导致包装器失败了。如果您感兴趣请参阅此链接)。
compile失败的原因是Java插件引入的compileruntimetestCompiletestRuntime配置自Gradle 4.10起被弃用,并在Gradle 7.0中最终被删除。
因此,为了解决这个问题,我必须安装较低版本的Gradle。如果您想管理多个版本的Gradle,请使用sdkman(以前称为gvm)。
在macOS / linux上安装非常简单,只需执行以下命令即可。
curl -s "https://get.sdkman.io" | bash

完成后使用

sdk list gradle

此命令将列出所有可用的Gradle版本,根据您的需要进行安装和使用。例如:

sdk install gradle 4.8(这将默认在当前shell中选择4.8版本) sdk use gradle 4.8(如果已经安装,这就足以在Gradle版本之间切换)

现在,build.gradle已能够编译和执行任务。


8
在我的案例中,所有的 compile 语句都以某种方式排列在一行。将它们分开成单独的行解决了这个问题。

如果我们从模块设置对话框修改Gradle属性,那么它就会发生。 - Ranjithkumar
真的。该死的gradle.build文件生成器在某些操作后会删除依赖项块中的换行符。 - Markus Marvell
哦,真的吗?谷歌,别开玩笑了,这是什么 bug,我醒来后按下运行按钮时,它把我所有的换行符都删掉了!这真是太糟糕了,哥们。。 - Pratik Jamariya

6
将依赖项添加到您的项目级别build.gradle中:
classpath 'com.google.gms:google-services:3.0.0'

将插件添加到你的app-levelbuild.gradle中:
apply plugin: 'com.google.gms.google-services'

应用级别 build.gradle

dependencies {
        compile 'com.google.android.gms:play-services-auth:9.8.0'
}

4
这与问题有什么关系? - aarnaut

0
在我的情况下,我不得不删除一些由gradle在某个时候创建的文件,以使事情正常运行。因此,在搞砸后进行清理,然后它就可以正常运行了...
如果您在git项目中遇到此问题,请执行git status并删除未修订的文件。(对我来说,elasticsearchplugins/analysis-icu有问题。) Gradle版本:5.1.1

-1
仅供记录:我不小心在“首选项->构建、执行、部署->Gradle->取消勾选离线工作”下启用了离线工作,但错误信息是误导性的。

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