Gradle构建失败,Kotlin,Scala和Java

我有一个用Java,Scala和Kotlin编写的项目。

但是,当我在Gradle中构建这个项目时,它带有错误消息:

11:19:51: Executing task 'build'... :compileKotlin Using Kotlin incremental compilation e: F:\Code\Project\Avalon\src\main\kotlin\avalon\group\Execute.kt: (3, 19): Unresolved reference: Flag e: F:\Code\Project\Avalon\src\main\kotlin\avalon\group\Execute.kt: (10, 18): Unresolved reference: GroupMessageResponder e: F:\Code\Project\Avalon\src\main\kotlin\avalon\group\Execute.kt: (13, 2): 'doPost' overrides nothing e: F:\Code\Project\Avalon\src\main\kotlin\avalon\group\Execute.kt: (35, 23): Unresolved reference: Flag e: F:\Code\Project\Avalon\src\main\kotlin\avalon\group\Execute.kt: (38, 2): 'getHelpMessage' overrides nothing e: F:\Code\Project\Avalon\src\main\kotlin\avalon\group\Execute.kt: (40, 2): 'getKeyWordRegex' overrides nothing e: F:\Code\Project\Avalon\src\main\kotlin\avalon\group\Execute.kt: (42, 2): 'instance' overrides nothing :compileKotlin FAILED FAILURE: Build failed with an exception. * What went wrong: Execution failed for task ':compileKotlin'. > Compilation error. See log for more details * Try: Run with --stacktrace option to get the stack trace. Run with --info or -- debug option to get more log output. BUILD FAILED in 1s 1 actionable task: 1 executed Compilation error. See log for more details 11:19:53: Task execution finished 'build'. 

这些错误都是关于“未解决的参考”,这些“参考”都是用Scala或Java编写的。

但在IDEA中运行这个项目工作正常

我以为这是由Gradle首先编译Kotlin引起的,应该在最后编译,所以那些'引用'找不到。

这是我的build.gradle : build.gradle

更新:

gradle clean testClasses --info一部分输出 –

 ...SKIP... > Task :compileKotlin Using Kotlin incremental compilation e: F:\Code\Project\Avalon\src\main\kotlin\avalon\group\Execute.kt: (3, 19): Unresolved reference: Flag e: F:\Code\Project\Avalon\src\main\kotlin\avalon\group\Execute.kt: (11, 18): Unresolved reference: GroupMessageResponder ...SKIP.... > Task :compileKotlin [KOTLIN] deleting F:\Code\Project\Avalon\build\classes\kotlin\main on error [KOTLIN] deleting F:\Code\Project\Avalon\build\classes\kotlin\main on error :compileKotlin (Thread[Task worker Thread 3,5,main]) completed. Took 15.981 secs. FAILURE: Build failed with an exception. * What went wrong: Execution failed for task ':compileKotlin'. > Compilation error. See log for more details * Try: Run with --stacktrace option to get the stack trace. Run with --debug option to get more log output. BUILD FAILED in 24s 2 actionable tasks: 2 executed Stopped 0 worker daemon(s). 

完整的输出贴 在这里

你有的问题是不同的语言。

一些Kotlin和Java

假设你只有kotlin和java。 比你可以访问( ->表示A访问类的B)

 kotlin -> java java -> kotlin 

你可以这么做的原因是,在编译期间( compileKotlin ),Kotlin处理这两种语言之间的crossCompilation / jointCompilation / whatever-other-name


Kotlin和Scala(单向)

但是,如果你有这样的情况:

 kotlin -> scala 

你必须考虑以下几点:当compileKotlin运行时,它将所有的.java.kt文件编译成class文件,但不包含.scala文件(因为它不知道关于scala任何内容)。 当您现在从kotlin访问scala类时,必须首先编译这些.scala类,以确保compileKotlin编译过程找到这些.class文件以成功编译。

你可以定义scala必须在例如kotlin之前运行

 compileKotlin.dependsOn compileScala 

Kotlin和Scala(双向)

到目前为止这么好,但问题是,如果有的话

 kotlin -> scala scala -> kotlin 

因为这种情况是行不通的。

您需要首先编译scala类,以成功编译kotlin类(请参阅上面的说明)。 但另一方面,您需要编译kotlin类,以成功编译scala类。 这是一个问题。

解决的办法是,其中一种语言允许联合编译所有的语言(但是这绝不会发生)。

因此对于两个不是Java JVM语言,您必须决定允许哪个访问方向。 但是你不能允许两个方向的访问。

在这种情况下,把逻辑放到一个java类中,并且访问这个java类,而不是例如scala类,通常是有帮助的。

这个问题也是一样的,例如groovyjava和其他一些jvm语言,比如在https://discuss.gradle.org/t/kotlin-groovy-and-java-compilation/14903/10