Spring Boot ist ein sehr weit verbreitetes Open-Source Java-Framework, um Stand-Alone-Anwnedungen mit dem Spring-Framework zu implementieren. Durch den konventionsbasierten Ansatz können Anwendungen ohne großen Konfigurationaufwand schnell und effizient aufgebaut werden.
Die Version 3 bringt neben einigen Neuerungen auch einige Umstellungen mit sich. Der allgemeine Migrationspfad ist auf der GitHub-Seite ausführlich beschrieben. Nachfolgend gehen wir auf die größten Hindernisse in unserem Projektkontext näher ein.
Spring Boot 3
Zu den wichtigsten Neuerungen zählen:
- Java 17
- JakartaEE anstelle von JavaEE
- Verbesserter Support für Observability mit Micrometer
- GraalVM Native Image Support
- Anpassungen am Autoconfiguration-Mechanismus
Da wir Maven als Buildsystem einsetzen und bereits die aktuellste Version 2.7 einsetzten, war der erste Schritt der Umstellung trivial. In unserem pom.xml haben wir lediglich die Spring-Boot-Version und die Java-Version anpassen müssen:
<properties>
<java.version>17</java.version>
<springboot.version>3.1.3</springboot.version>
</properties>
...
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>${springboot.version}</version>
<relativePath />
</parent>
Dadurch werden auch gleich alle Dependencies von Spring-Boot aktualisiert.
Aus javax wird jakarta
// aus
import javax.servlet.*;
// wird:
import jakarta.servlet.*;
Sieht einfach aus? Hat uns in der gesamten Migration die längsten Zeit gekostet.
Hunderte von Klassen mussten mit Search and Replace angepasst werden. Hier hätte die IntelliJ Tool-Box Arbeit abnehmen können, doch der Projektkontext gab es nicht her. Danach folgten noch einige Anpassungen von Buildskripten für WSDL- und XSD-Schnittstellen mit XJC und wsconsume.
Als dann alle Projekte kompilefehlerfrei waren, ging es ans Testen. Ein Teil konnte mit Unit- und Integrationstests abgedeckt werden. So konnten einige Laufzeitprobleme aufgedeckt werden; meist durch OSGi-Plugin interne Fremdbibliotheken verursacht. Auch auf der Testumgebung wurde noch einiges gefunden und korrigiert.
Transiente Probleme
Spring Boot 3 bringt auch ein Hibernate-Update mit. Der Sprung auf Version 6.0 setzt die Criteria API und hbm.xml Mappings auf Deprecated. Die Konsole ist voll von unübersehbaren Warnungen:
WARN: HHH90000028: Support for <hibernate-mappings/> is deprecated [RESOURCE : resources/hibernate-configs/hibernate-mappings/event.hbm.xml]; migrate to orm.xml or mapping.xml, or enable hibernate.transform_hbm_xml.enabled for on the fly transformation
WARN: HHH90000028: Support for <hibernate-mappings/> is deprecated [RESOURCE : resources/hibernate-configs/hibernate-mappings/job.hbm.xml]; migrate to orm.xml or mapping.xml, or enable hibernate.transform_hbm_xml.enabled for on the fly transformation
...
Diese Änderungen wurden vorerst aufgrund des Zeitdrucks zurückgestellt. (Hibernate 6.0 Migrations Guide)
Fazit
Zugegeben, repräsentativ ist das Projekt keinesfalls. Dennoch haben wir den Umstellungsaufwand unterschätzt.
Herzlichen Dank, Oracle. Nicht.