使用Gradle Wrapper构建Kotlin Enum类时出现无效的方法声明错误

7

I have the following Kotlin enum class:

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

    abstract val displayName: String
}

这已经是我的项目的一部分了,并且编译一直很顺利。使用IntelliJ或Android Studio编译没有问题,但当我手动从命令行运行gradle构建(./gradlew assembleDebug)时,出现以下错误:

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

我已经彻底清理了我能想到的一切内容(构建目录、gradle缓存等)。
我最近做了很多更改,但是自从使用IDE时一切都正常工作以来,我不知道可能是什么导致了这个问题。这里出了什么问题?为什么在IDE中可以工作但是在命令行中却不能?

1
你尝试过重构你的枚举,使其不生成匿名类吗?enum class DurationModifier(val displayName: String){ GreaterThan("≥"), LessThan("≤") }. - Pawel
尝试过了,它确实解决了这个特定的问题,但开始出现了各种其他问题。似乎是kapt和Java 11之间存在一些问题。请参见下面的答案。 - Jordan
3个回答

7
找到了问题的原因。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 8字节码,Java 11编译器应该能够理解(我在build.gradle中配置了Kotlin编译器),但显然在这种情况下并不是这样。
这不是一个为什么会发生的答案,但它是一个解决方案。

1
这不是关于Java8字节码的问题。这是关于kapt3生成的纯Java代码,而jdk 11不喜欢它。 - Cristian
1
使用Java 8代替12解决了我的问题。感谢@Jordan Bondo发布答案。 - Sahana Prabhakar

2
我曾经遇到过一个抽象枚举函数的类似错误。 Gradle使用的是JDK 11。 通过在gradle.properties中添加org.gradle.java.home条目(在您的HOME/.gradle/gradle.properties或您的项目特定的gradle.properties中),切换到JDK 8可以解决此问题。 "最初的回答"
 echo 'org.gradle.java.home=PATH_TO_JDK8' >> ~/.gradle/gradle.properties

0

我也遇到了这个问题,只需下载Java 8并在项目结构中更改Java位置(文件\项目结构)即可解决:

enter image description here


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