使用Kotlin、Scala和Java的Gradle构建失败
我有一个用Java、Scala和Kotlin编写的项目 但是,当我在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
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)