Probleme mit dem neuen Projektassistenten von IntelliJ 2020.2

Die aktuelle Java- und Kotlin-IDE IntelliJ zeichnet sich unter anderem durch einen neuen Assistenten zum Einrichten von Kotlin-Projekten aus. Der Assistent macht allerdings noch einen unausgereiften Eindruck.

Kotlin-Projekt in IntelliJ 2020.2 einrichten (Schritt 1)

Wenn Sie als Projekttyp Kotlin wählen, haben Sie im rechten Teil des Dialogs zwischen Templates für verschiedene Kotlin-Platformen. Für kleine Testprojekte ist JVM / Console Application am besten geeignet. Die eigentliche Neuerung besteht in der Auswahl des Build-Systems. Hier stehen nun vier Optionen zur Wahl:

  • IntelliJ: Hier kümmert sich IntelliJ selbst um den Build-Prozess, also um das Kompilieren und Ausführen Ihres Programms. Das geht am schnellsten, funktioniert aber nur dann unkompliziert, solange Sie keine externen Bibliotheken verwenden möchten.

  • Gradle Groovy: Als Build-System kommt Gradle in der seit Jahren bewährten Groovy-Syntax zum Einsatz. Diese Variante war früher der Normalfall für alle Projekte mit Gradle.

  • Gradle Kotlin: Auch in diesem Fall wird als Build-System Gradle verwendet. Allerdings gelten nun für die wichtigsten Gradle-Konfigurationsdateien und insbesondere für build.gradle (die jetzt build.gradle.kts heißt) andere Syntaxregeln, die weitgehend denen von Kotlin entsprechen. Am eigentlichen Inhalt der Datei ändert sich dadurch wenig. Die Möglichkeit, Gradle-Dateien in Kotlin-Syntax auszudrücken, ist ziemlich neu und hat dementsprechend noch keine weite Verbreitung gefunden.

  • Maven: Diese Variante ist für alle Entwickler gedacht, die mit Maven vertraut sind. (Maven ist wie Gradle ein externes Build-System.)

Im zweiten Schritt des Assistenten wählen Sie (ein wenig verwirrend nochmals) ein Template aus, also Mustercode für das neue Projekt. Die Einstellung Console Application bewirkt, dass in das neue Projekt eine Datei main.kt mit der main-Funktion samt println("Hello World!") eingebaut wird. Das hat den Vorteil, dass Sie das Projekt sofort ausführen können — noch bevor Sie damit beginnen, eigenen Code zu schreiben.

Kotlin-Projekt in IntelliJ 2020.2 einrichten (Schritt 1)

Das Listenfeld Test framework stellt verschiedene Frameworks für Unit-Tests zur Wahl (JUnit4, JUnit5 und TestNG). Wenn Sie keine Unit-Tests verwenden wollen, wählen Sie None.

Target JVM version legt fest, für welche JVM-Version Ihr Code kompiliert wird. Wählen Sie eine Version, für die auf Ihrem Rechner ein JDK installiert ist.

Probleme mit dem Build-System »Gradle Groovy«

Als Build-System verwende ich üblicherweise Gradle Groovy. Einerseits ist dieses Setup seit Jahren bewährt, andererseits kommt es auch in Android Studio zum Einsatz und die Syntax ist mir deswegen vertraut. Ärgerlicherweise erzeugt der Assistent von IntelliJ 2020.2 ausgerechnet bei dieser Option eine syntaktisch falsche Datei build.gradle:

// fehlerhafter build.gradle-Code des Projektassistenten 2020.2
// für das Build-System 'Gradle Groovy'
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
plugins {
    id 'org.jetbrains.kotlin.jvm' version '1.4.0-rc'
    id 'application'
}
group = 'info.kofler'
version = '1.0-SNAPSHOT'
repositories {
    mavenCentral()
    maven {
        url 'https://dl.bintray.com/kotlin/kotlin-eap'
    }
}
tasks.withType(KotlinCompile) {
    kotlinOptions.jvmTarget = '11'
}
application {
    mainClassName = 'MainKt'
}

IntelliJ kann das Projekt zwar ausführen, beklagt sich aber in build.gradle, dass es das Schlüsselwort KotlinCompile nicht kennt. Das ist nicht verwunderlich — es ist eigentlich für Gradle Kotlin und nicht für Gradle Groovy gedacht. Zum Glück ist das Problem leicht zu lösen: Sie löschen die import-Anweisung und ersetzen tasks.withType(...) durch compileKotlin. Damit ergibt sich die folgende, korrekte Datei build.gradle.

// korrekterer build.gradle-Code 
plugins {
    id 'org.jetbrains.kotlin.jvm' version '1.4.0-rc'
    id 'application'
}
group = 'me.kofler'
version = '1.0-SNAPSHOT'
repositories {
    mavenCentral()
    maven {
        url 'https://dl.bintray.com/kotlin/kotlin-eap'
    }
}
compileKotlin {
    kotlinOptions.jvmTarget = '11'
}
application {
    mainClassName = 'MainKt'
}

Im Bug-Tracker von JetBrains ist der Fehler zwar bekannt (samt diversen Duplikaten), die Entwickler schieben sich aktuell aber den schwarzen Peter zu, wer eigentlich schuld an dem Dilemma ist. Trotzdem bleibt zu hoffen, dass das Problem mit dem nächsten IntelliJ-Update behoben wird.

Build-System »Gradle Kotlin«

Ein zweiter Weg, den Problemen des Assistenten aus den Weg zu gehen, besteht darin, die neue Option Gradle Kotlin zu verwenden. Damit beschreiten Sie zwar Neuland, aber immerhin ist die vom Assistenten erzeugte Datei build.gradle.kt frei von Fehlern:

// Datei build.gradle.kts (Build-System 'Gradle Kotlin')
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
plugins {
    kotlin("jvm") version "1.4.0-rc"
    application
}
group = "me.kofler"
version = "1.0-SNAPSHOT"
repositories {
    mavenCentral()
    maven {
        url = uri("https://dl.bintray.com/kotlin/kotlin-eap")
    }
}
tasks.withType<KotlinCompile>() {
    kotlinOptions.jvmTarget = "11"
}
application {
    mainClassName = "MainKt"
}

Quellen