gradle 排除(“META-INF/* Kotlin_module”)是否安全?

oknrviil  于 2023-10-19  发布在  Kotlin
关注(0)|答案(2)|浏览(221)

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

A failure occurred while executing com.android.build.gradle.internal.tasks.MergeJavaResWorkAction
   > 2 files found with path 'META-INF/annotation-experimental_release.kotlin_module'

它可以通过在app目录中添加这些行到build.gradle来修复,就像其他门票上建议的那样。

packagingOptions {
    exclude("META-INF/*kotlin_module")
}

排除META-INF/是否安全?它会引起什么问题吗我没有在我的代码中使用Kotlin,那是来自其他SDK的。

relj7zay

relj7zay1#

有一些令人困惑的信息...

TLDR如果jar文件仅供自己使用,且您使用反射,则可以排除文件。

如下所述:https://blog.jetbrains.com/kotlin/2015/09/kotlin-m13-is-out/

顶层声明的.class文件新布局

几个月前,我们宣布了这一变化,现在已经完成了:

  • 默认情况下,每个Kotlin源文件(例如myFile.kt)生成一个同名的类文件,大写,后缀为“Kt”:MyFileKt;
  • 在Java中,通过这个类名(而不是有问题的FooPackage)可以访问该文件中定义的顶级函数和属性;
  • 因此,同一个包中的两个文件不能同名(否则类文件会冲突);
  • 您可以在源文件上指定@file:JvmName(“CustomName”)注解来更改类的名称;
  • 如果另外使用@file:JvmMultifileClass注解标记,则许多文件可以共享相同的JVM名称。

要使此更改生效,

我们不得不引入一个新的资源文件,它是针对Kotlin二进制文件编译Kotlin代码所必需的。它的名字是META-INF/<module_name>.kotlin_module。确保这些.kotlin_module文件没有被打包过程剥离
另外,请确保项目中的模块名称不冲突
正如这里进一步评论的那样:https://youtrack.jetbrains.com/issue/KT-9770(这些文件仅用于反射和构建过程)

  • 这些文件仅在您使用kotlin-reflect在运行时内省程序时使用(请注意,简单的::class字面量和可调用引用本身不使用反射,除非您显式依赖于kotlin-reflect并使用来自kotlin.reflect.*的任何API)

这些文件的更多澄清原因:

对于某些Kotlin类,我们不能将元数据存储在注解中,因为该类实际上并不存在(Int、List等),因此我们将这些信息存储在单独的资源中。这就是.kotlin_builtins文件的用途。对于顶级声明,我们需要知道包由哪些文件组成,这就是.kotlin_module文件的作用。

oyxsuwqo

oyxsuwqo2#

如果您发布了一个库并排除了META-INF/*kotlin_module,这可能是危险的。在我的例子中,当试图从这个库调用一些全局Kotlin函数时,它导致了未解决的引用错误。我的建议是避免排除这一点。

相关问题