Beim Entwickeln von Java-Anwendungen kann es vorkommen, dass der Compiler oder die Laufzeitumgebung einen Fehler der Art „class file has wrong version“ ausgibt. Dieser Fehler tritt auf, wenn eine Java-Klassen-Datei (eine .class-Datei) mit einer anderen Java-Version kompiliert wurde als die, die zur Laufzeit verwendet wird. In diesem Artikel werden die Ursachen dieses Problems analysiert und verschiedene Lösungsmöglichkeiten vorgestellt.
Ursachen des Fehlers
Jede Java-Version kompiliert Klassen mit einer spezifischen „class file version“. Wenn versucht wird, eine Klasse mit einer älteren JVM-Version auszuführen, die mit einer neueren Version kompiliert wurde, wird dieser Fehler auftreten. Dies geschieht häufig in den folgenden Szenarien:
- Inkompatibilität zwischen Compiler und Laufzeitumgebung: Eine Anwendung wird mit einer neueren JDK-Version kompiliert, aber mit einer älteren JVM ausgeführt.
- Unpassende Abhängigkeiten (Dependencies): Eine Bibliothek wird mit einer höheren Java-Version kompiliert als das Projekt, das sie nutzen will.
- Mischung von JDK-Versionen innerhalb eines Projekts: Manche Build-Systeme oder IDEs verwenden unterschiedliche JDK-Versionen für verschiedene Module oder während des Kompilierens und Laufens.
Bekannte „class file versions“ und zugehörige JVM-Versionen
„class file version“ | Java-Version |
---|---|
45 | Java 1.1 |
46 | Java 1.2 |
47 | Java 1.3 |
48 | Java 1.4 |
49 | Java 5 |
50 | Java 6 |
51 | Java 7 |
52 | Java 8 |
53 | Java 9 |
54 | Java 10 |
55 | Java 11 |
56 | Java 12 |
57 | Java 13 |
58 | Java 14 |
59 | Java 15 |
60 | Java 16 |
61 | Java 17 |
62 | Java 18 |
63 | Java 19 |
64 | Java 20 |
65 | Java 21 |
Lösungsmöglichkeiten
1. Upgrade der JVM (Laufzeitumgebung)
Falls eine Klassen-Datei eine höhere Version aufweist als die aktuelle JVM unterstützt, sollte zunächst überprüft werden, ob ein Upgrade der JVM möglich ist. Dies kann mit folgendem Befehl geprüft werden:
java -version
Falls eine ältere Version verwendet wird, kann eine neuere JDK-Version von Oracle oder OpenJDK heruntergeladen und installiert werden.
JVM-Upgrade auf macOS/Linux
sudo apt update && sudo apt install openjdk-XX-jdk # für Debian-basierte Systeme
brew install openjdk@XX # für macOS mit Homebrew
Code-Sprache: PHP (php)
JVM-Upgrade auf Windows
Für Windows kann das JDK einfach als MSI-Paket installiert und die Umgebungsvariable JAVA_HOME
entsprechend angepasst werden.
2. Downgrade der Abhängigkeiten
Falls eine Abhängigkeit mit einer höheren Java-Version kompiliert wurde als das Projekt verwendet, muss diese angepasst werden. Dies kann in Build-Tools wie Maven oder Gradle erfolgen.
In Maven: Die Java-Version einer Abhängigkeit kann mit folgenden Befehlen überprüft werden:
mvn dependency:tree
mvn dependency:analyze
Code-Sprache: CSS (css)
Falls eine inkompatible Version vorliegt, kann die Version in der pom.xml
geändert werden:
<dependency>
<groupId>com.example</groupId>
<artifactId>example-lib</artifactId>
<version>1.2.3</version> <!-- auf kompatible Version setzen -->
</dependency>
Code-Sprache: HTML, XML (xml)
In Gradle: Die Abhängigkeitsversionen können mit folgendem Befehl geprüft werden:
gradle dependencies
Falls eine inkompatible Abhängigkeit gefunden wird, kann die Version in der build.gradle
Datei angepasst werden:
dependencies {
implementation 'com.example:example-lib:1.2.3' // auf kompatible Version setzen
}
Code-Sprache: JavaScript (javascript)
3. Projekt auf eine ältere Java-Version kompilieren (Quell- und Zielversion setzen)
Falls es erforderlich ist, dass der Code auf einer älteren JVM lauffähig bleibt, kann die Java-Kompilierung so eingestellt werden, dass sie eine ältere Version nutzt.
In Maven:
<properties>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
</properties>
Code-Sprache: HTML, XML (xml)
In Gradle:
tasks.withType(JavaCompile) {
sourceCompatibility = '11'
targetCompatibility = '11'
}
Code-Sprache: JavaScript (javascript)
4. IDE- und Build-Tools-Einstellungen prüfen
Falls verschiedene Teile eines Projekts mit unterschiedlichen JDK-Versionen kompiliert werden, sollte sichergestellt werden, dass überall die gleiche Version eingestellt ist.
In IntelliJ IDEA kann dies unter File > Project Structure > Project SDK
geprüft werden.
In Eclipse muss unter Window > Preferences > Java > Installed JREs
sichergestellt werden, dass die richtige Version verwendet wird.
Fazit
Der Fehler „class file has wrong version“ tritt auf, wenn eine Klassen-Datei mit einer neueren Java-Version kompiliert wurde, als die JVM zur Verfügung stellt. Mögliche Lösungen beinhalten das Upgrade der JVM, das Downgrade von Abhängigkeiten oder die Anpassung der Kompiliereinstellungen. Durch eine konsistente Nutzung von Java-Versionen innerhalb eines Projekts lassen sich viele dieser Probleme von vornherein vermeiden.