IntelliJ IDEA 和 Gradle - 不能应用于“(groovy.lang.Closure)”

Posted

技术标签:

【中文标题】IntelliJ IDEA 和 Gradle - 不能应用于“(groovy.lang.Closure)”【英文标题】:IntelliJ IDEA and Gradle - Cannot be applied to '(groovy.lang.Closure)' 【发布时间】:2015-12-30 13:14:45 【问题描述】:

我有一个 Gradle 文件,每当我在 IntelliJ IDEA 14.1.5 中加载打开它时,都会显示整个文件的 IDE 错误。即所有错误似乎都是:

java.lang.String 错误

groovy.lang.Closure 错误

我试过清除文件的内容,只写第一行:

group 'com.me.blah'

但即使这样也会导致错误。

为了上下文 - 这是一个更大的 SpringBoot 项目中的一个单独的模块。该模块是一组简单的静态文件(使用 Gradle 进行 CSS 编译、静态分析等),其余的是 Java 模块,没有有 Gradle 问题。

谁能想到为什么 IntelliJ 难以理解这个 Gradle 文件?

【问题讨论】:

【参考方案1】:

我经常注意到这一点。在创建新项目并使用“Gradle”模板时,IntelliJ 似乎完全错了。所以我采取的做法是在创建一个新项目后,删除 .idea 和 .iml 文件,然后直接从 Gradle 文件重新打开项目。 IntelliJ 似乎更好地理解了这种情况下发生了什么。

【讨论】:

这可以解决上述错误,但它删除了我的所有配置,因此项目结构和模块没有存储。相反,我发现这行得通:***.com/a/49543980/7267809 为了清楚起见,“直接从Gradle文件重新打开项目”的意思是:[打开] > 选择build.gradle > [打开为项目]【参考方案2】:

对于问题的第一部分:group 是一个属性,所以必须有一个赋值,而不是一个函数调用。正确的代码是:

group = 'com.me.blah'

【讨论】:

对于那些可能会问这个问题的人,“那为什么group 'com.me.blah' 有效?”看看Groovy 的methodMissing hook。默认的 Gradle Project 实现显然使用这个钩子来设置带有缺失方法名称的属性,如果它存在的话。 这对我来说是Cannot assign 'String' to 'Object'【参考方案3】:

我在 IDEA 错误跟踪器 (IDEA-142683) 中找到了这个建议:

解决方法: 可以添加评论,例如//noinspection GroovyAssignabilityCheck 抑制警告,但这不是必需的,因为这些是 Gradle 每天的标准用法。

此问题最近已更新并被标记为已修复,准备与 2016.2 版本一起发布。

【讨论】:

下个EAP版本应该会修复:youtrack.jetbrains.com/issue/IDEA-142683#comment=27-1448045 我需要在哪里添加该评论?我在 15.0.6,这很烦人 @stewenson 把它放在抱怨的代码块的正上方。 2019.1.2 版本再次发生在我身上 我使用的是 2020.2 RC 版本,并且还在发生这种情况【参考方案4】:

试用文件 |使缓存无效并重新启动。在我将文件中其他地方的语法弄乱后,它对我有用。

【讨论】:

【参考方案5】:

对于任何寻求类似修复的人来说,这归结为模块的类型。我的模块在我的 .iml 文件中定义为

type="WEB_MODULE"

我创建了一个新的 Gradle 模块并粘贴了相同的内容,删除了原始模块,将新模块重命名为与旧模块相同的名称,一切正常。当我对结果进行比较时,唯一的变化是 .iml 文件现在说:

type="JAVA_MODULE"

看来,答案就在眼前。将您的模块从“web”更改为“java”。

【讨论】:

不幸的是,这对我没有用。起作用的是“禁用检查”。不确定这是否是最好的方法。 我没有 iml 文件。 @Displee 它可能在您的.idea 目录中【参考方案6】:

我发现这个警告来自对 Intelliji 的 Groovy 检查。因此,如果您的项目不是纯 groovy,您可以通过转到文件 -> 设置 -> 编辑器 -> 检查 -> 禁用 Groovy 来禁用此检查。同样,只是一种解决方法。

【讨论】:

无需禁用整个 Groovy 部分,只需禁用“不兼容的类型分配”。要禁用此检查:文件 -> 设置... -> 编辑器 -> 检查 -> Groovy -> 分配问题 -> 禁用不兼容的类型分配【参考方案7】:

对我来说,在尝试了所有这些答案但没有结果之后,更改项目的 Java SDK 就成功了,我在 1.8 上并将其更改为最新的,但仍然是 8 的项目级语言。

希望这会有所帮助!

【讨论】:

我在 buildSrc 目录中遇到了这个问题。当我将语言级别从 14 更改为 8 时,警告消失了。我不知道为什么 java 语言级别会干扰具有 Groovy DSL 语法的 Gradle 脚本。【参考方案8】:

最近在 Windows 上发生在我身上。以上方法我都试过了,还是不行。

我做了什么:

1 - 我已经设置了 JAVA_HOME 环境变量。所以 IDEA 选择它作为项目 SDK,这些警告出现了。

2 - 所以,我从项目 SDK 中删除了默认的 JAVA_HOME 并手动添加了 jdk 路径。重新启动,所有警告都消失了。

也许它会帮助某人。谢谢。

【讨论】:

以上是关于IntelliJ IDEA 和 Gradle - 不能应用于“(groovy.lang.Closure)”的主要内容,如果未能解决你的问题,请参考以下文章

如何让 Intellij IDEA 使用并行和 gradle 构建缓存进行构建

如何修复“任务 'compileJava' 执行失败”错误。 (使用 Intellij Idea 和 Gradle)

用IntelliJ IDEA创建Gradle项目简单入门

导入 Gradle 项目到 IntelliJ IDEA

intellij idea 2017 gradle构建spring-boot web项目

在IntelliJ IDEA中如何使用Gradle