什么是.kotlin_builtins文件,我可以从我的uberjars中省略它们吗?

dyn*_*eed 8 jar proguard gradle kotlin shadowjar

我正在努力将proguard集成到我的gradle构建中,用于用Kotlin编写的应用程序.我发现proguard正在剥离Kotlin标准库(就像我在简单的Hello World程序中那样),但它在我的jar中留下了一堆文件扩展名的文件.kotlin_builtins.当我配置我的gradle任务以排除这些文件时,程序仍然可以正常工作.这些文件是什么,必须与我的可执行文件uberjar一起发货?

这是我的build.gradle文件的内容供参考:

buildscript {
   ext.kotlin_version = '1.0.5'
   ext.shadow_version = '1.2.4'

   repositories {
    mavenCentral()
    maven {
        url "https://plugins.gradle.org/m2/"
    }
    flatDir dirs: "gradle/proguard"
   }

   dependencies {
    classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
    classpath "com.github.jengelman.gradle.plugins:shadow:$shadow_version"
    classpath ":proguard:"
   }
}

apply plugin: 'kotlin'
apply plugin: 'application'
apply plugin: 'com.github.johnrengelman.shadow'

mainClassName = 'namespace.MainKt'

defaultTasks 'run'

repositories {
    mavenCentral()
}

dependencies {
    compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
    testCompile "junit:junit:4.12"
    testCompile "org.jetbrains.kotlin:kotlin-test-junit:$kotlin_version"
}

shadowJar {
    exclude 'kotlin/**/*.kotlin_builtins'
    exclude '.keep'
}

task minify(type: proguard.gradle.ProGuardTask, dependsOn: 'shadowJar') {
    libraryjars "${System.getProperty('java.home')}/lib/rt.jar"

    injars  'build/libs/artful-all.jar'
    outjars 'build/libs/artful-all.out.jar'

    printmapping 'build/libs/out.map'

    keepclasseswithmembers 'public class * { \
        public static void main(java.lang.String[]); \
    }'

    assumenosideeffects 'class kotlin.jvm.internal.Intrinsics { \
        static void checkParameterIsNotNull(java.lang.Object, java.lang.String); \
    }'
}
Run Code Online (Sandbox Code Playgroud)

Ale*_*lov 10

这些文件包含用于声明标准("内置")Kotlin类的数据,这些类未编译到.class文件中,而是映射到平台上的现有类型(在本例中为JVM).例如,kotlin/kotlin.kotlin_builtins包含用于在包非物理类的配置信息kotlin:Int,String,Enum,Annotation,Collection,等.

使用这些文件时有两种主要方案:

1)编译器kotlin-runtime在类路径上查找它们以确定哪些内置声明可用.

2)反射库(kotlin-reflect)将这些文件作为资源加载,以提供内置声明的反射功能.例如,String::class.members返回该类的所有成员kotlin.String完全与Kotlin编译器看到这些成员的方式相同(尽管事实上没有kotlin/String.class文件并且它被删除到java.lang.String字节码中).

第一点显然不适用于您的情况.如果你不对内置类使用反射,我认为.kotlin_builtins从生成的jar中完全排除文件是安全的.