如何配置build.gradle.kts来修复错误“从:package-fragment生成的重复JVM类名称”

时间:2019-09-02 21:50:52

标签: kotlin build.gradle gradle-kotlin-dsl

我正在尝试遵循本教程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

2 个答案:

答案 0 :(得分:2)

我无法(至今)说明为什么会发生这种情况,但是要解决此问题,请将@file:JvmName("SomethingUnique")添加到您的JVM文件中。请注意,重命名文件将无济于事,并导致相同的错误。仅更改输出名称即可解决它。

答案 1 :(得分:0)

JVM仅知道如何加载类,因此Kotlin-to-JVM编译器会生成用于容纳顶级valfun声明的类。

当您有两个名称相似的文件

// 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中,因此会出现错误消息。

解决方案涉及:

  • 正如@Fleshgrinder所指出的那样,向至少一个文件级JvmName注释添加一个以覆盖派生名称FooKt
  • 尽可能重命名文件。
  • 将这些文件中的顶级valfun声明移到其他文件中,这样Kotlin不需要创建FooKt类。
  • 将顶级valfun声明移到objectcompanion object中。