【问题标题】:Gradle build failed with Kotlin, Scala and Java使用 Kotlin、Scala 和 Java 构建 Gradle 失败
【发布时间】:2017-10-03 03:30:20
【问题描述】:

我有一个用 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.gradlebuild.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).

已发布完整输出 here

【问题讨论】:

  • 在使用不止一种非 Java-JVM 语言时必须小心。 Unresolved reference: Flag 属于哪个类?是scala吗?你能运行./gradlew clean testClasses --info 并发布输出吗
  • @guenhter 当Kotlin引用Scala,执行gradle build时发生此错误。 gradle clean testClasses --info 的输出现已发布...
  • 能否请您发布更多输出。最好是从顶部。我知道问题出在哪里,但我需要更多日志。
  • @guenhter 我在Github Gist发布了完整的日志
  • :) 好吧,这很清楚。请参阅下面的答案

标签: java scala gradle kotlin build.gradle


【解决方案1】:

您遇到的问题是不同的语言。

一些 Kotlin 和 Java

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

kotlin -> java 
java -> kotlin

您可以这样做的原因是因为在编译期间 (compileKotlin) Kotlin 会处理这个crossCompilation/jointCompilation/whatever-other-这两种语言之间的名称


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 类。 那是个问题。

解决方案是,其中一种语言允许 jointCompilation 用于所有语言(但这永远不会发生)。

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

在这种情况下,将逻辑放入 java 类并访问此 java 类而不是例如scala类。

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

【讨论】:

  • 首先非常感谢。但是是否存在其他解决方案?只是为了确保我确实必须重写所有 Scala 代码,并且这个项目可以在 IDEA 中编译和运行正常
  • 我在老公司遇到了同样的问题,groovyscala。它在 IDE 中工作(不知道为什么;无论如何 IntellJ 是一个神奇的软件),但是对于 gradle,它绝对是确定性和合理的,为什么它不能工作(除非我们有一个超级编译器允许交叉编译所有 JVM 语言)
  • 我已经完成了重写,这当然有帮助,非常感谢。
【解决方案2】:

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

compileScala.classpath += files(compileKotlin.destinationDir)

基于https://discuss.gradle.org/t/kotlin-groovy-and-java-compilation/14903/3

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-20
    • 2015-08-22
    相关资源
    最近更新 更多