Unbekannter Attributname MODULE in Kotlin: Fehleranalyse

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Begegnung mit einem Geist: Was ist "unrecognized Attribute name MODULE"?

\n

Haben Sie jemals einen Fehler gesehen, der nach Mystik riecht? Stellen Sie sich vor: Sie programmieren in modernem Kotlin, alles fliegt, Gradle summt, und plötzlich – bumm! – erscheint in den Logs so etwas wie:

\n
unrecognized Attribute name MODULE (class com.sun.tools.javac.util.SharedNameTable$NameImpl)
\n

Sie googeln, finden Stack Overflow mit tausenden Aufrufen und verstehen: Das ist nicht einfach ein Bug. Das ist ein Kompatibilitätsfehler zwischen den Welten. Zwischen Java und Kotlin. Zwischen dem alten Build-System und der neuen Modulwelt.

\n

In diesem Artikel geben wir nicht nur eine Lösung. Wir werfen einen Blick unter die Haube des Java-Compilers, analysieren, was SharedNameTable ist, warum die JVM sich über das Wort MODULE beschwert und wie das mit Ihrem Kotlin-Projekt zusammenhängt. Spoiler: Schuld ist nicht Kotlin, sondern ein altes Gradle und Java 9+.

\n\n

Kurzfassung: So beheben Sie den Fehler (für Ungeduldige)

\n

Wenn Sie den Build schnell reparieren müssen – hier sind drei funktionierende Methoden. Wählen Sie je nach Situation:

\n
    \n
  • Methode 1 (empfohlen): Aktualisieren Sie Gradle auf Version 7.0+ und das Kotlin Gradle Plugin auf 1.5+. Das behebt das Problem dauerhaft.
  • \n
  • Methode 2 (schnelle Lösung): Geben Sie explizit das JVM-Target in build.gradle.kts an:
  • \n
\n
kotlin {\n    jvmToolchain(11) // oder 8, wenn Sie alte Kompatibilität wünschen\n}
\n
    \n
  • Methode 3 (Notlösung): Fügen Sie dem Compiler ein Flag hinzu:
  • \n
\n
tasks.withType<KotlinCompile> {\n    kotlinOptions {\n        jvmTarget = "1.8"\n    }\n}
\n

Wenn Sie jedoch verstehen möchten, warum das funktioniert – lesen Sie weiter. Wir tauchen in die Tiefen des Java-Compilers ein.

\n\n

Unter der Haube: Was ist com.sun.tools.javac.util.SharedNameTable$NameImpl?

\n

Lassen Sie uns diese gruselige Zeile Stück für Stück zerlegen. Es ist nicht nur eine zufällige Wortfolge – es ist ein Verweis auf eine bestimmte Klasse innerhalb des Java Development Kit (JDK).

\n
    \n
  • com.sun.tools.javac – das Paket des internen Java-Compilers (javac). Ja, desjenigen, der .java in .class umwandelt.
  • \n
  • util.SharedNameTable – eine Hilfsklasse, die Namen (von Variablen, Methoden, Klassen) in einem String-Pool zur Optimierung speichert. Es ist ein Cache, um nicht eine Million identischer Strings zu erstellen.
  • \n
  • $NameImpl – eine innere Klasse, die einen bestimmten Namen repräsentiert. Wenn der Compiler auf das Wort module stößt, erstellt er ein NameImpl-Objekt.
  • \n
\n

Und jetzt das Interessanteste: Der Fehler tritt auf, wenn javac auf das Attribut MODULE in einer Class-Datei stößt, aber nicht weiß, was damit anzufangen ist. Dies passiert, wenn Sie einen alten Compiler (< Java 9) oder umgekehrt einen neuen Compiler, aber ein altes Class-Datei-Format verwenden.

\n\n

Warum ist MODULE ein besonderes Wort?

\n

Ab Java 9 wurde in der Sprache das Modulsystem (Project Jigsaw) eingeführt. Das Schlüsselwort module wurde reserviert. In Class-Dateien kamen neue Attribute wie Module, ModulePackages, ModuleMainClass usw. hinzu.

\n

Wenn der Kotlin-Compiler Bytecode generiert, kann er dieses Attribut versehentlich (oder absichtlich) hinzufügen, wenn Ihr JVM-Target auf 9+ gesetzt ist. Ein altes Gradle oder Maven, das eine veraltete Version von javac verwendet, versteht diese Attribute nicht. Daher der Fehler.

\n\n

Praktisches Beispiel: Kotlin + Gradle + Java 11

\n

Stellen Sie sich ein einfaches Kotlin-Projekt mit Gradle vor. Hier ist die Datei build.gradle.kts:

\n
plugins {\n    kotlin("jvm") version                

Blogs

Buchempfehlungen