Quelloffene Tools & Frameworks

7 Java-Projekte, die Entwickler begeistern

15.05.2023 von Matthew Tyson
Das Java-Ökosystem quillt über vor Tools und Frameworks für so gut wie alle Programmierbedarfe. Diese sieben Open-Source-Projekte sollten Sie sich nicht entgehen lassen.
Diese sieben Java-Projekte haben das Potenzial, Developer über Gebühr wachzuhalten.
Foto: Ground Picture - shutterstock.com

Bei dem enorm breitgefächerten Angebot an Open-Source-Projekten, die das Java-Ökosystem beherbergt, verliert man leicht den Überblick - und übersieht dabei möglicherweise einige wirklich hilfreiche und interessante Projekte. Etwa eines der folgenden sieben.

Vaadin Hilla

Das Full-Stack-Framework Hilla kommt mit Java-basiertem Backend sowie JavaScript-Frontend und unterstützt die reaktiven Frontend-Frameworks React und Lit. Hilla ermöglicht es Ihnen, ein neues Full-Stack-Projekt mit einem einfachen Befehl einzurichten: npx @vaadin/cli init --hilla foundry-hilla. Dabei handelt es sich um einen NPM-Befehl, der jedoch ein Standard-Maven-Layout mit einem von Vite erstellten Frontend-Verzeichnis bereitstellt und alles zusammen mit dem ./mvnw-Skript ausführt.

Hilla erzwingt Typing zwischen den beiden Anwendungshälften - Ihre IDE kann also Änderungen an der Java-API und dem TypeScript-Frontend erkennen und weitergeben. Mit diesem Framework funktionieren auto-complete und refactor einfach nur - ähnlich wie bei tRPC in der TypeScript-Welt. Hilla integriert darüber hinaus auch Persistenz über JPA (auf Hibernate) mit einer Reihe von SQL-Datenbanken wie MySQL und PostgreSQL.

Hilla ist in Bezug auf die Technologien, die es zusammenfügen kann (im Vergleich zu einigen anderen hier vorgestellten Projekten), weniger flexibel. Aber es liefert Ihnen eine hochwertige Basis, auf der Sie aufbauen können, ist gut gewartet und dokumentiert. Wenn Sie eine Full-Stack-Applikation mit Java bauen wollen und React oder Lit für Ihr Frontend bevorzugen, ist Hilla ein großartiges Framework.

jHipster

Auch bei jHipster handelt es sich um ein Full-Stack-Framework. Es verfolgt einen sehr flexiblen Ansatz, der eine Vielzahl verschiedener Technologien in einem zusammenhängenden Stack vereinen kann - wobei Java als API-Middleware zum Einsatz kommt. Dabei können Sie aus mehreren reaktiven Frontends und einer Vielzahl von SQL- und NoSQL-Data-Stores wählen.

Wie bei Hilla starten Sie auch bei jHipster damit, eine Applikation mit einem NPM-Package zu generieren - dem jhipster-Generator. Dieser führt Sie durch einen Fragebogen, der Ihnen einen guten Eindruck von seinen Fähigkeiten vermittelt. Falls Ihnen der Fehler ERR_PACKAGE_PATH_NOT_EXPORTED begegnet, HIER finden Sie die Lösung.

Um Ihnen einen Eindruck von der Bandbreite dieses Frameworks zu vermitteln: jHipster stellt Sie zunächst vor die Wahl zwischen einer monolithischen Anwendung, einer Microservices-Architektur und einem Gateway. Wenn Sie sich für die erstgenannte Option entscheiden, können Sie diese mit Spring WebFlux in eine reaktive Anwendung umwandeln. Dazu können Sie aus verschiedenen Authentifizierungs-Arten wie JWT oder Oauth 2 wählen. Und schließlich haben Sie auch noch die Wahl zwischen diversen Data Stores wie SQL, MongoDB und Cassandra - gefolgt von einem Anwendungscache der zweiten Ebene wie Ehcache, Memcached oder Redis.

In der Folge erlaubt der jHipster-Generator es Ihnen, eine Handvoll weiterer Technologien hinzuzufügen:

Im Anschluss dürfen Sie aus mehreren Frontend-Frameworks wählen und eine Admin-UI erstellen (Themes vorhanden). Auch Domänenmodelle, die dazugehörigen Datenstrukturen und Benutzeroberfläche lässt sich generieren. Zu den Features gehören darüber hinaus Internationalisierung und Testing sowie Support für Maven und Gradle. jHipster ist eine gute Wahl für die allermeisten Java-Anwendungen.

GraalVM

Das GraalVM-Projekt wurde im März 2018 mit dem Ziel gestartet, eine umfassendere Implementierung der Java Virtual Machine (JVM) bereitzustellen. Entsprechend kann GraalVM alles, was eine JVM kann - und noch einiges mehr: Sie ermöglicht es, eine Vielzahl von Programmiersprachen zu verwenden und in zahlreiche Ausführungsumgebungen auszuliefern. GraalVM beinhaltet außerdem verschiedene Compiler-Stile, darunter die eines Performance-steigernden JIT-Compilers.

GraalVM kann jede Sprache ausführen, die sich mit LLVM kompilieren lässt, darunter C, C++, Rust, Swift und viele weitere. Auch Bytecode-Sprachen wie Java, Scala, Kotlin und Groovy bleiben nicht außen vor. Zudem werden auch JavaScript, Python, Ruby und R unterstützt. In naher Zukunft könnte Zig hinzukommen.

Die Ähnlichkeiten zur JVM bedeuten, dass Sie auch all deren Vorteile für alle unterstützten Sprachen nutzen können - insbesondere das "Write once, run anywhere"-Prinzip. GraalVM kann mit dem Befehl lli beispielsweise ein C-Programm ausführen, das zu LLVM-Bytecode kompiliert wurde. clang würde den Code hingegen direkt in eine ausführbare Datei kompilieren. Dabei gibt GraalVM eigenständige Standalone-Execution-Versionen für viele (aber nicht alle) Sprachen und Plattformen aus.

Ebenfalls enthalten: Support für viele Target-Binaries wie Wasm, Linux-Varianten, macOS, Windows, iOS und Android. Auf diversen Zielsystemen unterstützt GraalVM auch native Images, die ohne Installation ausgeführt werden können. Entwicklern stehen zusätzliche Execution Modes zur Verfügung wie JIT- und AOT-Kompilierung.

GraalVM wird gut gepflegt und dokumentiert und kann eine aktive Community vorweisen. Ein überzeugendes Projekt, das auf dem besten Weg ist, sich zu einer Art universellem Sprachwerkzeug zu entwickeln.

Micronaut

Micronaut geht in Sachen Java-Entwicklung neue Wege und zielt dabei auf moderne Cloud- und Serverless-Umgebungen ab. Dabei bietet es eine Fülle von Funktionen (etwa Befehlszeilen-Tools), um Projekte mit einer Reihe von integrierten Technologien aufzubauen, zu erstellen, umzusetzen und zu testen. Am bedeutendsten ist dabei: Micronaut wurde um ein AOT-fähiges Inversion-of-Control (IoC)-Framework herum entwickelt, das die Startup-Zeiten auch angesichts großer Codebasen hält. In Kombination mit Microservices-orientierten Support-Maßnahmen wie Service Discovers, Tracing und Container Deployments ist Micronaut eine gut durchdachte und überzeugende Option für die moderne Java-Entwicklung.

Micronaut bietet einen webbasierten Projektdesigner, mit dem Sie sich einen Eindruck von der Bandbreite der Tools verschaffen können, die sich in den Micronaut-Kern einbinden lassen. Das Tool ähnelt dem Online-Generator von jHipster, setzt aber eigene Akzente. Micronaut ist im Kern reaktiv und unterstützt reaktive Implementierungen wie RxJava und Reactor - alles weitere baut auf dieser zentralen Säule auf. Micronaut enthält zudem seinen eigenen, reaktiven HTTP-Client.

Jeder Knoten in Micronaut ist eine reaktive Komponente, die unter Verwendung eines zentralen Service-Brokers wie ZooKeeper oder Eureka zu einer größeren Microservices-Architektur zusammengesetzt werden kann. Dabei erleichtert das Tool es, Best Practices in einem One-Stop-Shopping-Framework zu übernehmen, das ähnlich umfangreich wie Spring ist, sich aber stärker auf konkrete Implementierungsdetails konzentriert. Eine verlockende Wahl für Entwickler, die an Java-basierten Cloud- und Serverless-Umgebungen arbeiten.

MicroStream

In der Evolution der Java-basierten objektorientierten Persistenz stellt MicroStream möglicherweise die letzte konzeptionelle Verfeinerung dar. Es übernimmt Ihren Runtime Object Graph so wie er ist und ermöglicht es, ihn mit objektorientierter Programmiersemantik in einer beliebigen Anzahl von zugrundeliegenden Datenspeichern zu persistieren.

MicroStream ermöglicht es Ihnen außerdem, in der gedanklichen Welt der Objekte und Eigenschaften zu bleiben, während das Framework sich darum kümmert, zu speichern und wiederherzustellen. Als Entwickler müssen Sie zwar immer noch mit "Meta-Angelegenheiten" wie Abrufstrategien und persistenten Grenzen auseinandersetzen, aber diese werden einfach und weitgehend ohne Einmischung in den Anwendungscode definiert, der genauso funktioniert wie ohne Persistenzgedanken.

MicroStream enthält das Konzept einer Root, die die Wurzel eines Persistenzbaums definiert. Wie Listing 1 zeigt, kann eine Anwendung mehr als eine Root aufweisen.

Listing 1

// Saving

EmbeddedStorageManager manager = EmbeddedStorage.start();

manager.setRoot(myObject);

manager.storeRoot();

//Restoring

EmbeddedStorageManager storageEngine = EmbeddedStorage.start();

myObject = (MyClass) storageEngine.root();

MicroStream ist ein interessanter neuer Ansatz für die Objektpersistenz in Java und auf jeden Fall einen Blick wert.

TeaVM

Java nach WebAssembly (Wasm) zu kompilieren, war lange Zeit eine Art unentdeckter Graubereich - bis TeaVM kam. Das unterstützt die Transpilierung von Java-Bytecode sowohl in JavaScript (ähnlich wie Google Web Toolkit) als auch in Wasm. Damit lassen sich Webanwendungen erstellen, die Java-Code und -Bibliotheken innerhalb des Browsers verwenden.

Bei TeaVM wird der Code zunächst in eine Low-Level-Zwischendarstellung kompiliert, die dann weiter optimiert und in WebAssembly-Anweisungen übersetzt wird. Der resultierende Code ist hocheffizient und kann in jedem modernen Browser ausgeführt werden, der WebAssembly unterstützt. Einer der Hauptvorteile von TeaVM ist seine Unterstützung für beliebte Java-Frameworks wie Spring und Hibernate. Entwickler können diese Frameworks nutzen, um komplexe, vollständige Webanwendungen zu erstellen - und den Code dann für den webbasierten Einsatz in Wasm kompilieren.

Obwohl TeaVM noch in den Kinderschuhen steckt bietet es derzeit den besten Pfad von Java zu Wasm.

Apache Flink

Flink wurde 2011 ins Leben gerufen und hat sich zu einem führenden Framework in Sachen Event Processing entwickelt. Es wird von vielen namhaften Unternehmen wie Airbnb und Netflix eingesetzt und bietet eine Menge Leistung in einem Paket, das relativ einfach zu managen ist. Dabei vereint Apache Flink Fehlertoleranz und State Management in einer verteilten, containerfreundlichen Form mit dynamischer Skalierungsmöglichkeit.

Typischerweise wird Flink in Docker mit Kubernetes ausgeführt. Mit Hilfe eines Frameworks wie Apache Beam läuft es aber auch auf Serverless-Infrastrukturen wie AWS Lambda, Azure Functions oder Google Cloud Functions. Das hat den Vorteil, dass nur die während der Verarbeitung genutzten Rechenressourcen bezahlt werden müssen und ermöglicht eine einfachere und effizientere Skalierung.

Flink verfügt über eine Vielzahl von Funktionen, einige davon sind ganz einfach zu verstehen. In Listing 2 zum Beispiel überwacht Flink einen Socket an Port 9999, zählt die Wörter im dort empfangenen Text und gibt die Daten auf der Konsole aus.

Listing 2

DataStream<String> text = env.socketTextStream("localhost", 9999);

DataStream<Tuple2<String,Integer>> wordCounts = text

.flatMap(new FlatMapFunction<String, Tuple2<String,Integer>>() {

public void flatMap(String value, Collector<Tuple2<String,Integer>> out) {

for (String word : value.split(" ")) {

out.collect(new Tuple2<String,Integer>(word, 1));

}

}

})

.keyBy(0)

.sum(1);

wordCounts.print();

Wie Sie sehen, arbeitet Flink in einem funktionalen Stil, während die Plattform selbst die Erweiterung der Funktionalität auf eine Cloud-Infrastruktur auf skalierbare, fehlertolerante Weise sicherstellt. Alles in allem ein beeindruckendes Projekt, um Echtzeitereignisse zu verarbeiten. (fm)

Dieser Beitrag basiert auf einem Artikel unserer US-Schwesterpublikation Infoworld.