2016-12-09 5 views
6

Ich arbeite an der Integration von Progard in meine Klasse Build für eine Anwendung in Kotlin geschrieben. Ich finde, dass Proguard die Kotlin-Standard-Bibliothek (wie es in meinem einfachen Hello World-Programm sollte) strippen, aber es gibt eine Reihe von Dateien in meinem Jar, die die Dateierweiterung .kotlin_builtins haben. Wenn ich meine Megle-Task so konfiguriere, dass sie diese Dateien ausschließt, funktioniert das Programm immer noch einwandfrei. Was sind diese Dateien und müssen sie mit meinem ausführbaren Uberjar geliefert werden?Was sind .kotlin_builtins Dateien und kann ich sie aus meinen Uberjars auslassen?

Hier ist meine build.gradle Dateiinhalt als Referenz:

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); \ 
    }' 
} 

Antwort

6

Diese Dateien enthalten Daten für Erklärungen Standard („built-in“) Kotlin Klassen, die kompiliert werden, nicht zu .class Dateien, sondern vielmehr auf die abgebildete vorhandene Typen auf der Plattform (in diesem Fall JVM). Zum Beispiel enthält kotlin/kotlin.kotlin_builtins die Informationen für nicht-physische Klassen im Paket kotlin: Int, String, Enum, Annotation, Collection usw.

Es gibt zwei Hauptszenarien, wenn diese Dateien verwendet werden:

1) Die Der Compiler sucht sie auf dem Klassenpfad von kotlin-runtime nach, um festzustellen, welche integrierten Deklarationen verfügbar sind.

2) Die Reflektionsbibliothek (kotlin-reflect) lädt diese Dateien als Ressourcen, um Reflexionsfunktionen für integrierte Deklarationen bereitzustellen. Zum Beispiel gibt String::class.members alle Mitglieder der Klasse kotlin.String genau so zurück, wie der Kotlin-Compiler diese Mitglieder sieht (trotz der Tatsache, dass es keine kotlin/String.class Datei gibt und sie in java.lang.String im Bytecode gelöscht wird).

Der erste Punkt ist in Ihrem Fall eindeutig nicht anwendbar. Und wenn Sie keine Reflektion für integrierte Klassen verwenden, ist es sicher, dass Sie .kotlin_builtins Dateien vollständig aus dem resultierenden Jar ausschließen können.

Verwandte Themen