In Kotlin, when working with the JVM, it seems there is multiple choices for standard library, namely kotlin-stdlib
, kotlin-stdlib-jdk7
and kotli
By running Gradle dependencies
task in your Kotlin project, you can find some useful information. This is a part of output in a sample project:
$ ./gradlew dependencies
...
kotlinCompilerClasspath
\--- org.jetbrains.kotlin:kotlin-compiler-embeddable:1.3.20
+--- org.jetbrains.kotlin:kotlin-stdlib:1.3.20
| +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.3.20
| \--- org.jetbrains:annotations:13.0
+--- org.jetbrains.kotlin:kotlin-script-runtime:1.3.20
+--- org.jetbrains.kotlin:kotlin-reflect:1.3.20
| \--- org.jetbrains.kotlin:kotlin-stdlib:1.3.20 (*)
\--- org.jetbrains.intellij.deps:trove4j:1.0.20181211
...
Most of the stdlib is in the plain kotlin-stdlib
artifact.
kotlin-stdlib-jdk7
adds suppressed exceptions and a few extension methods.
kotlin-stdlib-jdk8
adds ThreadLocalRandom as well as a few other extension methods and retrieving groups by name in Regexes.
The code is there: https://github.com/JetBrains/kotlin/blob/55c8b35eee2ee8a93ccaffeaac6f9c3e4fd4ff18/libraries/stdlib/jvm/src/kotlin/internal/PlatformImplementations.kt#L27
EDIT: I got curious so wrote an article about this: https://medium.com/@mbonnin/the-different-kotlin-stdlibs-explained-83d7c6bf293.
Bottom line: Android declares a weird JVM version so almost nothing from -jdk7
and -jdk8
is used.
As the name indicates, -jdk8 is supposed to be used when using the JDK8. It contains code used to integrate the changes made in the JDK 8 into the Kotlin standard lib.
As its pom indicates, it depends on -jdk7, which contains the code needed to integrate the changes made in the JDK 7 into the Kotlin standard lib.
And as the pom of -jdk7 indicates, it depends on the stdlib.
So, in short, use the one matching your JDK. Adding it to the dependencies will also, transitively, add all the ones for the previous versions of the JDK.