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

时间:2018-11-13 20:48:03

标签: android kotlin android-gradle kapt

我有以下Kotlin枚举类:

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

    abstract val displayName: String
}

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

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

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

最近我做了很多更改,但是由于IDE的所有功能都可以正常工作,所以我不知道是什么原因引起的。怎么了为什么这可以在IDE中工作,但不能在命令行中工作?

3 个答案:

答案 0 :(得分:0)

弄清楚发生了什么。 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编译器这样做),但是显然在这种情况下不正确。

不是对为什么发生的答案,但这是一个解决方案。

答案 1 :(得分:0)

我在使用抽象枚举函数时遇到了类似的错误。 Gradle使用的是JDK 11。 切换到JDK 8,方法是在org.gradle.java.home或项目指定的gradle.properties中向HOME/.gradle/gradle.properties添加一个gradle.properties条目来解决此问题。

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

答案 2 :(得分:0)

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

enter image description here