是否可以在不同的源集中使用Kotlin软件包功能和软件包属性?当我尝试这样做时,我抛出了NoSuchMethodError

示例

我有带有Kotlin代码的Gradle项目以及其中的两个资源集maintest
main中,文件之一中包含以下代码:

package ru.ifmo.ctddev.igushkin.dkvs
...
public val payloadSplitter: String = " ### "

test中,我尝试使用以下代码访问payloadSplitter:
package ru.ifmo.ctddev.igushkin.dkvs
...
public class MessageTests {
    ...
    test fun testParsing() {
        ...
        checkParseAndToString("p1b 345 ${payloadSplitter} set a b c")
    }
    ...
}

正是在访问payloadSplitter的第一行中,在运行时我得到了
java.lang.NoSuchMethodError: ru.ifmo.ctddev.igushkin.dkvs.DkvsPackage.getPayloadSplitter()Ljava/lang/String;

其他全局变量和函数在test中也无法访问,并且具有相同的错误。

UPD Kotlin团队解释了此问题,并宣布了修复here

最佳答案

对于类之外的属性和方法,Kotlin创建一个名为$ {packagename} Package的Java类,其属性和方法实现为静态方法和变量。对于多个源集,java类将创建两次,每个源集一次。您的问题是测试源集“包类”隐藏了在主源集中编译的类。

如以上注释中所述,请避免在测试源集中包含任何顶级属性或方法,以防止Kotlin编译器在测试输出目录中创建此包类。

07-24 09:48
查看更多