我正在处理一个构建问题:
A failure occurred while executing com.android.build.gradle.internal.tasks.MergeJavaResWorkAction
> 2 files found with path 'META-INF/annotation-experimental_release.kotlin_module'
它可以通过将这些行添加到应用程序目录上的build.gradle来修复,就像其他票证上建议的那样。
packagingOptions {
exclude("META-INF/*kotlin_module")
}
排除META-INF/是否安全?它会引起什么问题吗?我的代码中没有使用kotlin,它来自其他SDK。
有一些令人困惑的信息。。。
TLDR如果jar文件仅用于您自己,并且您不使用反射则可以排除这些文件。
如上所述:https://blog.jetbrains.com/kotlin/2015/09/kotlin-m13-is-out/
用于顶级声明的.class文件的新布局
几个月前,我们宣布了这一变化,现在已经完成:
- 默认情况下,每个Kotlin源文件(例如myFile.kt(都会生成一个具有相同名称的类文件,大写并以"kt"作为后缀:MyFileKt
- 该文件中定义的顶级函数和属性可以通过这个类名(而不是有问题的FooPackage(在Java中访问
- 因此,同一包中的两个文件不能具有相同的名称(否则类文件将发生冲突(
- 您可以在源文件上指定@file:JvmName("CustomName"(注释来更改类的名称
- 如果用@file:JvmMultifileClass注释额外标记,许多文件可以共享相同的JVM名称
要使此更改生效
我们不得不引入一个新的资源文件,它是根据Kotlin二进制文件编译Kotlin代码所必需的。它的名字是META-INF/<module_name>.kotlin_module
。请确保这些.kotlin_module
文件没有被打包过程剥离。
此外,请确保模块名称在您的项目中不会发生冲突
如下文所述:https://youtrack.jetbrains.com/issue/KT-9770(这些文件仅用于反射和构建过程中(
- 只有当您在运行时使用kotlin-refract内省程序时,才会使用这些文件(请注意,simple::类文字和可调用引用本身不使用反射,除非您显式依赖kotlin-reflect并使用
kotlin.reflect.*
中的任何API(
这些文件的更明确的原因:
对于一些Kotlin类,我们无法将元数据存储在注释中,因为该类在物理上不存在(Int、List等(,所以我们将这些信息存储在单独的资源中。这就是.kotlin_builtins
文件的用途对于顶级声明,我们需要知道包由哪些文件组成,这就是.kotlin_module
文件的用途。
如果发布库并排除META-INF/*kotlin_module
,这可能很危险。在我的例子中,当试图从这个库调用一些全局Kotlin函数时,它导致了未解决的引用错误。我的建议是尽量避免排除这一点。