使用Kotlin、Scala和Java的Gradle构建失败

使用Kotlin、Scala和Java的Gradle构建失败,java,scala,gradle,kotlin,build.gradle,Java,Scala,Gradle,Kotlin,Build.gradle,我有一个用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 re

我有一个用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造成的,而Kotlin应该在最后编译,所以这些“引用”无法找到

这是我的
build.gradle

更新:

gradle clean测试类--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类)

之所以可以这样做,是因为在编译过程中(
compileKotlin
)Kotlin负责这两种语言之间的交叉编译/联合编译/任何其他名称


Kotlin和Scala(一个方向)

但如果你有这种情况:

kotlin -> scala
<>比你必须考虑如下: 当运行
compileKotlin
时,它将所有
.java
.kt
文件编译为
文件,但不编译
.scala
文件(因为它对
scala
一无所知)。 当您现在从
kotlin
访问
scala
类时,您必须首先编译那些
.scala
类,以确保
compileKotlin
编译过程找到那些
.class
文件以便成功编译

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

compileKotlin.dependsOn compileScala

Kotlin和Scala(双向)

到目前为止还不错,但问题是

kotlin -> scala
scala -> kotlin
因为这个场景不起作用

您需要首先编译
scala
类,才能成功编译
kotlin
类(请参见上面的描述)。但另一方面,您需要编译
kotlin
类,才能成功编译
scala
类。 这是个问题

解决方案是,其中一种语言允许对所有语言进行联合编译(但这永远不会发生)

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

在这种情况下,将逻辑放入
java
类中,并访问该
java
类而不是
scala
类通常会有所帮助


问题也同样适用于例如
groovy
java
和其他一些jvm语言,比如在post

中,让Scala调用Kotlin代码缺少的链接是在build.gradle中添加以下内容

compileScala.classpath += files(compileKotlin.destinationDir)

基于

当您使用不止一种非Java JVM语言时,必须小心。什么类别是
未解析的引用:标志
?是scala吗?您能否运行
/gradlew clean testClasses--info
并发布output@guenhter当
Kotlin
参考
Scala
时,当执行
gradle build
时,发生此错误。还有
gradlecleantestclasses的输出--info
现在已经发布了…你能发布更多的输出吗。最好是从高层开始。我知道问题出在哪里,但我需要更多的日志。@guenhter我已经发布了完整的日志:)好吧,不太清楚。下面是我的答案,谢谢。但还有其他解决办法吗?只是为了确保我必须重写所有的Scala代码,并且这个项目可以在IDEA中正常编译和运行。我在我的老公司中遇到了与
groovy
Scala
相同的问题。它可以在IDE中工作(不确定为什么;IntellJ无论如何都是一个神奇的软件),但对于gradle来说,这绝对是确定的,也是合理的,为什么它不能工作(除非我们有一个超级编译器,它允许交叉编译所有JVM语言)。我已经完成了重写,这当然很有帮助,非常感谢。
compileScala.classpath += files(compileKotlin.destinationDir)