我正在尝试遵循本教程https://dev.to/tagmg/step-by-step-guide-to-building-web-api-with-kotlin-and-dropwizard,而是在Kotlin的DSL中编写gradle.build文件,发现没有从Groovy到Kotlin的直接映射,而我现在在运行时遇到此错误fcbox top
:
./gradlew run
(4, 1): Duplicate JVM class name 'dropwizard/tut/AppKt' generated from: package-fragment dropwizard.tut, package-fragment dropwizard.tut
答案 0 :(得分:2)
我无法(至今)说明为什么会发生这种情况,但是要解决此问题,请将@file:JvmName("SomethingUnique")
添加到您的JVM文件中。请注意,重命名文件将无济于事,并导致相同的错误。仅更改输出名称即可解决它。
答案 1 :(得分:0)
JVM仅知道如何加载类,因此Kotlin-to-JVM编译器会生成用于容纳顶级val
或fun
声明的类。
当您有两个名称相似的文件
// src/commonMain/kotlin/com/example/Foo.kt
package com.example
val a = 1
和
// src/jvmMain/kotlin/com/example/Foo.kt
package com.example
val b = 2
kotlin-to-JVM编译器生成
package com.example;
public class FooKt {
public static final int a = 1;
}
和
public com.example;
public class FooKt {
public static final int b = 2;
}
很显然,这两个文件不能共存于同一个JVM ClassLoader中,因此会出现错误消息。
解决方案涉及:
FooKt
。val
和fun
声明移到其他文件中,这样Kotlin不需要创建FooKt
类。val
和fun
声明移到object
或companion object
中。