是否可以在不同的源集中使用Kotlin软件包功能和软件包属性?当我尝试这样做时,我就NoSuchMethodError
抛出了。
例
我有科特林代码摇篮项目,并在两份sourcesets,main
和test
。在中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团队对此问题进行了解释,并在此处宣布了解决方法。
对于类之外的属性和方法,Kotlin创建一个名为$ {packagename} Package的Java类,其属性和方法实现为静态方法和变量。对于多个源集,java类将创建两次,每个源集一次。您的问题是测试源集“包类”隐藏了在主源集中编译的类。
如以上注释中所述,请避免在测试源集中包含任何顶级属性或方法,以防止Kotlin编译器在测试输出目录中创建此包类。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句