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.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).
Run Code Online (Sandbox Code Playgroud)
完整输出发布 在这里。
您遇到的问题是不同的语言。
一些 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中一样
| 归档时间: |
|
| 查看次数: |
2273 次 |
| 最近记录: |