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
类,通常是有帮助的。
这个问题也是一样的,例如groovy
, java
和其他一些jvm语言,比如在https://discuss.gradle.org/t/kotlin-groovy-and-java-compilation/14903/10