使用 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 枚举类中的无效方法声明的主要内容,如果未能解决你的问题,请参考以下文章
Android Studio 和 Gradle KTS 构建文件
spring boot gradle 插件、应用程序插件和 gradle 2.3 包装器