使用 gradle 包装器构建 Kotlin 枚举类中的无效方法声明

Posted

技术标签:

【中文标题】使用 gradle 包装器构建 Kotlin 枚举类中的无效方法声明【英文标题】:Invalid Method Declaration in Kotlin Enum Class building with gradle wrapper 【发布时间】:2019-04-16 18:34:19 【问题描述】:

我有以下 Kotlin 枚举类:

enum class DurationModifier 
    GreaterThan 
        override val displayName = "≥"
    ,
    LessThan 
        override val displayName = "≤"
    ;

    abstract val displayName: String

长期以来,它一直是我项目的一部分,并且编译得很好。使用 IntelliJ 或 android Studio 可以很好地编译,但是当我从命令行 (./gradlew assembleDebug) 手动运行 gradle 构建时,我得到了这个:

e: projectDir/build/tmp/kapt3/stubs/package/search/DurationModifier.java:17: error: invalid method declaration; return type required
        DurationModifier() 
        ^

我已经彻底清理了我能想到的所有内容(构建目录、gradle 缓存等)。

我最近做了很多更改,但由于 IDE 一切正常,我不知道是什么原因造成的。这里有什么问题?为什么这在 IDE 中有效,但在命令行中无效?

【问题讨论】:

您是否尝试过重构您的枚举以使其不生成匿名类? enum class DurationModifier(val displayName: String) GreaterThan("≥"), LessThan("≤") . 试过了,它确实解决了这个特定问题,但开始排除各种其他问题。 kapt & Java 11 似乎有些问题。请参阅下面的答案。 【参考方案1】:

弄清楚发生了什么。 Android Studio 和 IntelliJ 都使用捆绑的 JDK(AS 3.2.1 使用 1.8.0_152),所以 gradle 在那个环境中执行 kapt。但是,在我的机器上,我将 Java 11 设置为默认 java。我使用 JENV 来管理多个 java 版本,所以预感我将本地 java 版本设置为 1.8 而不是 11。之后工作正常。

我的理解是 Kotlin 编译器应该发出 Java 11 编译器应该理解的 Java 8 字节代码(我在 build.gradle 中配置了 Kotlin 编译器),但显然在这种情况下并非如此。

并不是真正为什么会发生这种情况的答案,但它是一个解决方案。

【讨论】:

这与 Java8 字节码无关。这是关于 kapt3 生成 jdk 11 不喜欢的纯 Java 代码。 使用 java 8 而不是 12。解决了我的问题。感谢您发布答案@Jordan Bondo【参考方案2】:

我在使用抽象枚举函数时遇到了类似的错误。 Gradle 使用的是 JDK 11。 切换到 JDK 8,通过向 gradle.properties 添加一个 org.gradle.java.home 条目(在您的 HOME/.gradle/gradle.properties 或您的项目规范中 gradle.properties 解决了这个问题。

 echo 'org.gradle.java.home=PATH_TO_JDK8' >> ~/.gradle/gradle.properties

【讨论】:

【参考方案3】:

我也遇到了这个问题,刚刚下载了 Java 8 并在此处更改了项目结构(文件\项目结构)中的 Java 位置:

【讨论】:

以上是关于使用 gradle 包装器构建 Kotlin 枚举类中的无效方法声明的主要内容,如果未能解决你的问题,请参考以下文章

构建颤振 apk 时未发现 Gradle 包装器问题

Android Studio 和 Gradle KTS 构建文件

spring boot gradle 插件、应用程序插件和 gradle 2.3 包装器

如何在Kotlin中使用Gradle构建缓存?

Android Studio:“使用默认的 gradle 包装器”与“使用可定制的 gradle 包装器”

用于 kotlin 代码的 gradle 构建