【问题标题】:Is it safe to exclude("META-INF/*kotlin_module")?排除(“META-INF/*kotlin_module”)是否安全?
【发布时间】:2022-07-22 01:23:04
【问题描述】:

我正在处理构建问题:

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,它来自其他 sdks。

【问题讨论】:

    标签: android kotlin gradle build.gradle


    【解决方案1】:

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

    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-reflect 在运行时自省程序时才使用这些文件(请注意,简单的 ::class 文字和可调用引用本身不使用反射,除非您明确依赖 kotlin-reflect 并使用来自 kotlin.reflect.* 的任何 API)

    这些文件更明确的原因:

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

    【讨论】:

      猜你喜欢
      • 2016-10-02
      • 2013-06-20
      • 2012-06-10
      • 1970-01-01
      • 1970-01-01
      • 2015-05-16
      • 1970-01-01
      • 2012-09-05
      • 2011-05-19
      相关资源
      最近更新 更多