排除("META-INF/*kotlin_module")是否安全?



我正在处理一个构建问题:

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函数时,它导致了未解决的引用错误。我的建议是尽量避免排除这一点。

最新更新