Kotlin、Scala 和 Java 的 Gradle 构建失败

Ray*_*ath 2 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 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'.
Run Code Online (Sandbox Code Playgroud)

这些错误都是关于“未解析的引用”,而这些“引用”都是用 Scala 或 Java 编写的。

但是在IDEA中运行这个项目效果很好

我认为这是由 Gradle 首先编译 Kotlin 造成的,而 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).
Run Code Online (Sandbox Code Playgroud)

完整输出发布 在这里

gue*_*ter 7

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

一些 Kotlin 和 Java

假设您只有 kotlin 和 java。比你可以从(->意味着A访问B的类)

kotlin -> java 
java -> kotlin
Run Code Online (Sandbox Code Playgroud)

您可以这样做的原因是因为在编译 ( compileKotlin) Kotlin 期间会处理这两种语言之间的交叉编译/联合编译/任何其他名称


Kotlin 和 Scala(单向)

但如果你有这样的情况:

kotlin -> scala
Run Code Online (Sandbox Code Playgroud)

比您必须考虑以下事项:运行时,它将所有和文件compileKotlin编译为文件,但不编译任何文件(因为它不知道有关 的任何信息)。现在,当您从 访问类时,必须首先编译这些类,以确保编译过程找到这些文件以成功编译。.java.ktclass.scalascalascalakotlin.scalacompileKotlin.class

您可以定义scala必须先运行,kotlin例如

compileKotlin.dependsOn compileScala
Run Code Online (Sandbox Code Playgroud)

Kotlin 和 Scala(双向)

到目前为止一切都很好,但问题是,当你

kotlin -> scala
scala -> kotlin
Run Code Online (Sandbox Code Playgroud)

因为这个场景行不通。

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

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

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

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

groovy对于eg和其他一些jvm语言来说,问题也是一样的java,就像帖子https://discuss.gradle.org/t/kotlin-groovy-and-java-compilation/14903/10中一样