Erfolgreiche Entwicklungsarbeit braucht das richtige Rahmenwerk.Ground Picture | shutterstock.com Java zeichnet sich in den letzten Jahren durch ein bewundernswertes Gleichgewicht zwischen Innovation und Stabilität aus. Das ist in erster Linie der Integration sowohl funktionaler als auch reaktiver Elemente zu verdanken. Dazu kommen erstklassige Performanz, Sicherheit und Concurrency. Nur die Syntax von Java kommt nicht überall gut an, weil sie sich gerade im Vergleich zu neueren Sprachen etwas klobig gestaltet. Auch dagegen gibt es jedoch Mittel – zum Beispiel JVM-Sprachen wie Kotlin. Geht es um Backend-Frameworks für Java und JVM-Sprachen, steht Entwicklern ebenfalls ein breites Spektrum an Optionen zur Verfügung. In diesem Artikel werfen wir einen Blick auf die jeweils besten aus beiden Bereichen. In der nachfolgenden Tabelle sehen Sie die behandelten Frameworks im Überblick – und im Vergleich. Unsere Bewertungsskala reicht dabei von 1 bis 3 Punkte – wobei Letzteres die Höchstwertung darstellt. FrameworkAPIRealtimeStatic Site Generation (SSG)Unique strengthsSpring322Enterprise versatilityMicronaut321Cloud-native, microservicesQuarkus321Cloud-native, developer experienceJHipster321Full-stack SSGKtor/Kotlin322Kotlin-centric, flexiblePlay/Scala332Reactive, Scala, high-performanceVert.x331Reactive, event-driven Die besten Java-Frameworks Werfen wir nun einen detaillierteren Blick auf die einzelnen Rahmenwerke – beginnend mit denen für Java. Spring Das Backend-Framework für Java schlechthin ist Spring. Mit diesem Rahmenwerk hielten Konzepte wie Inversion of Control und Dependency Injection Einzug – also Dinge, die viele Developer heutzutage als selbstverständlich betrachten. Heutzutage zeichnet sich Spring insbesondere durch eine wesentliche Vereinfachung aus, vor allem getrieben durch Spring Boot. Im Bereich Webentwicklung lässt sich mit einer Kombination von Spring MVC und REST fast jede Aufgabe bewältigen. Im Vergleich zu JavaScript-Frameworks wie Express, legt Spring sehr viel Wert auf Formalitäten – es eignet sich vor allem für die Entwicklungsabteilungen von Großunternehmen. Im nachfolgenden Beispiel nutzen wir den Dependency-Injection-Mechanismus von Spring, um einen Service zu „injizieren“. Dieser stellt Daten für eine /hello-Route zur Verfügung und verarbeitet diese anschließend für die Antwort: import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class GreetingController { @Autowired private GreetingService greetingService; @GetMapping(“/hello”) public String hello() { String greeting = greetingService.getGreeting(); return greeting.toUpperCase(); } } Micronaut Dieses relativ neue Java-Framework ist auf leichtgewichtige Microservices-APIs zugeschnitten. Wenn Sie als Java-begeisterter Entwickler nach einem performanten, nicht block-intensivem API-Framework suchen, ist Micronaut die richtige Wahl. Mit Blick auf Routes ähnelt Micronaut Spring – das Framework hat aber noch ein paar andere Tricks auf Lager. Zum Beispiel eine Ahead-of-Time (AoT)-Kompilierung für besonders schnelle Startups, wie im nachfolgenden Beispiel zu sehen: import io.micronaut.http.MediaType; import io.micronaut.http.annotation.Controller; import io.micronaut.http.annotation.Get; import io.micronaut.http.annotation.Produces; @Controller(“/hello”) public class HelloController { @Get(produces = MediaType.TEXT_PLAIN) public String index() { return “Hello, InfoWorld from Micronaut!”; } } Quarkus Wie Micronaut konzentriert sich auch Quarkus auf Cloud-native Entwicklung. Dabei zeichnet es sich insbesondere durch einen eigenwilligen Stil sowie ausgeprägten Kommandozeilen-Support für Devmode und Container-bewusstes Packaging aus. Eine Stärke von Quarkus: Es optimiert und vereinheitlicht die Befehlszeilen-Experience. Im folgenden Beispiel nutzen wir das, um eine neue Applikation zu erstellen und im Hot-Swap-Devmode auszuführen: # New Quarkus project with the RESTEasy extension mvn io.quarkus.platform:quarkus-maven-plugin:2.16.0.Final:create -DprojectGroupId=org.acme -DprojectArtifactId=my-quarkus-app -Dextensions=”resteasy” cd my-quarkus-app # Run the application in dev mode ./mvnw compile quarkus:dev — Tests paused Press [e] to edit command line args (currently ”), [r] to resume testing, [o] Toggle test output, [:] for the terminal, [h] for more options> JHipster Sehr wahrscheinlich ist JHipster das umfassendeste und ehrgeizigste Java-Framework in dieser Auflistung. Es deckt eine enorme Bandbreite ab, inklusive SQL- und NoSQL-Backend-Data-Stores – alles innerhalb des Java- und JVM-Ökosystems. Im folgenden Code-Beispiel können Sie beobachten, wie nahtlos JHipster eine Vielzahl von Technologien in einen konsistenten Rahmen „presst“: ✔ What is the base name of your application? jhip ✔ Which *type* of application would you like to create? Monolithic application (recommended for simple projects) ✔ What is your default Java package name? com.infoworld ✔ Would you like to use Maven or Gradle for building the backend? Gradle ✔ Do you want to make it reactive with Spring WebFlux? no ✔ Which *type* of authentication would you like to use? JWT authentication (stateless, with a token) ✔ Besides JUnit, which testing frameworks would you like to use? ✔ Which *type* of database would you like to use? MongoDB ✔ Which cache do you want to use? (Spring cache abstraction) Ehcache (local cache, for a single node) ✔ Which other technologies would you like to use? Elasticsearch as search engine ✔ Do you want to enable Gradle Enterprise integration? no ? Which *framework* would you like to use for the client? Angular ❯ React Vue No client Die besten Frameworks für JVM-Sprachen Die JVM bietet eine stabile, leistungsstarke und sichere Plattform für praktisch jede Sprache und jeden Zweck – nicht nur für Java. Das hat die Entwickler-Community genutzt, um einige hervorragende Frameworks und Sprachen für die JVM zu entwickeln. Kotlin/Ktor Für Java-Entwickler, die ihren Horizont erweitern möchten, ist Kotlin eine logische Konsequenz: Die zweitbeliebteste JVM-Sprache schleift einige Java-Kanten ab, behält dabei aber die strukturelle Robustheit in weiten Teilen bei. Kotlins natives Framework ist Ktor. Dieses zeichnet sich vor allem durch seine gute Developer Experience aus, die der von Ruby on Rails ähnelt. Ktor zu konfigurieren und einzurichten, bedarf allerdings etwas mehr Handarbeit Im folgenden Code-Beispiel liegt der Fokus aus dem HTML-DSL-Feature von Kotlin zu Templating-Zwecken (um den HTML-Code zu erstellen, ist ausschließlich Kotlin erforderlich): routing { get(“/”) { call.respondHtml { head { title(“Quotes”) } body { h1 { +”Quotes to Live By” } ul { listOf( “This Mind is the matrix of all matter.” to “Max Planck”, “All religions, arts and sciences are branches of the same tree.” to “Albert Einstein”, “The mind is everything. What you think you become.” to “Buddha” ).forEach { (quote, author) -> li { p { +quote } p { +”― $author” } } } } Scala/Play Scala ist eine JVM-Sprache, die vor allem für ihren leistungsstarken, funktionalen Programmierstil bekannt ist. Die Sprache zeichnet sich außerdem durch nicht blockierende, asynchrone Prozesse und einen Immutability-Fokus aus. Für Entwickler, die einen weitgehend imperativen oder objektorientierten Background haben, kann sich der Umstieg entsprechend schwierig gestalten. Der Scala/Play-Stack überzeugt vor allem mit: hohem Durchsatz, Microservices im Reactive-Styl, sowie Middleware. Play fungiert dabei als eine Art HTTP-Semantik-Layer, der über die funktionale Engine von Scala gelegt wird. In Kombination mit dem Scala-Build-Tool ist Play eine gut integrierte, intelligente Plattform, um solide Backends zu entwickeln – insbesondere Echtzeitsysteme. Im nachfolgenden Beipsiel definieren wir einen simplen „Hello, World“-Endpunkt in Scala und Play: import play.api.mvc._ import javax.inject._ @Singleton class HomeController @Inject()(cc: ControllerComponents) extends AbstractController(cc) { def index = Action { Ok(“Hello, InfoWorld!”) } } Vert.x „Vert.x ist ein Toolkit, kein Framework – es ist also von Natur aus sehr composable und embeddable“, heißt es auf der Webseite des Open-Source-Projekts der Eclipse Foundation. Aktuell unterstützt dieses Reactive-Projekt mehrere JVM-Sprachen, darunter: Java, JavaScript, Ruby, Groovy, Scala, Kotlin und PHP. Vert.x lässt sich außerdem auch als mehrsprachiger Event-Bus nutzen – ähnlich wie Javas JMS. Das Toolkit bietet eine vollumfängliche, ereignisgesteuerte Multiprozess-Engine, die sich auf Multicore-Server skalieren lässt (Multi-Reactor-Architektur). Das folgende Code-Snippet zeigt ein simples Beispiel, wie ein Endpunkt mit Vert.x und Java bereitgestellt wird: @Override public void start(Promise startPromise) throws Exception { vertx.createHttpServer().requestHandler(req -> { req.response() .putHeader(“content-type”, “text/plain”) .end(“Hello from Vert.x!”); }).listen(8888).onComplete(http -> { if (http.succeeded()) { startPromise.complete(); System.out.println(“HTTP server started on port 8888”); } else { startPromise.fail(http.cause()); } }); } } Zu beachten ist hier, dass für den Request und den Startvorgang des Servers funktionale Hanlder eingesetzt werden. Verkettete, funktionale Event Handler zu nutzen, gehört bei Vert.x zum Konzept. Das können sich Entwickler auch für reaktive Funktionen auf höherer Ebene zunutze machen. (fm) Sie wollen weitere interessante Beiträge zu diversen Themen aus der IT-Welt lesen? Unsere kostenlosen Newsletter liefern Ihnen alles, was IT-Profis wissen sollten – direkt in Ihre Inbox!
Die besten Frameworks für Java & JVM-Sprachen
Erfolgreiche Entwicklungsarbeit braucht das richtige Rahmenwerk.Ground Picture | shutterstock.com Java zeichnet sich in den letzten Jahren durch ein bewundernswertes Gleichgewicht zwischen Innovation und Stabilität aus. Das ist in erster Linie der Integration sowohl funktionaler als auch reaktiver Elemente zu verdanken. Dazu kommen erstklassige Performanz, Sicherheit und Concurrency. Nur die Syntax von Java kommt nicht überall gut an, weil sie sich gerade im Vergleich zu neueren Sprachen etwas klobig gestaltet. Auch dagegen gibt es jedoch Mittel – zum Beispiel JVM-Sprachen wie Kotlin. Geht es um Backend-Frameworks für Java und JVM-Sprachen, steht Entwicklern ebenfalls ein breites Spektrum an Optionen zur Verfügung. In diesem Artikel werfen wir einen Blick auf die jeweils besten aus beiden Bereichen. In der nachfolgenden Tabelle sehen Sie die behandelten Frameworks im Überblick – und im Vergleich. Unsere Bewertungsskala reicht dabei von 1 bis 3 Punkte – wobei Letzteres die Höchstwertung darstellt. FrameworkAPIRealtimeStatic Site Generation (SSG)Unique strengthsSpring322Enterprise versatilityMicronaut321Cloud-native, microservicesQuarkus321Cloud-native, developer experienceJHipster321Full-stack SSGKtor/Kotlin322Kotlin-centric, flexiblePlay/Scala332Reactive, Scala, high-performanceVert.x331Reactive, event-driven Die besten Java-Frameworks Werfen wir nun einen detaillierteren Blick auf die einzelnen Rahmenwerke – beginnend mit denen für Java. Spring Das Backend-Framework für Java schlechthin ist Spring. Mit diesem Rahmenwerk hielten Konzepte wie Inversion of Control und Dependency Injection Einzug – also Dinge, die viele Developer heutzutage als selbstverständlich betrachten. Heutzutage zeichnet sich Spring insbesondere durch eine wesentliche Vereinfachung aus, vor allem getrieben durch Spring Boot. Im Bereich Webentwicklung lässt sich mit einer Kombination von Spring MVC und REST fast jede Aufgabe bewältigen. Im Vergleich zu JavaScript-Frameworks wie Express, legt Spring sehr viel Wert auf Formalitäten – es eignet sich vor allem für die Entwicklungsabteilungen von Großunternehmen. Im nachfolgenden Beispiel nutzen wir den Dependency-Injection-Mechanismus von Spring, um einen Service zu „injizieren“. Dieser stellt Daten für eine /hello-Route zur Verfügung und verarbeitet diese anschließend für die Antwort: import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class GreetingController { @Autowired private GreetingService greetingService; @GetMapping("/hello") public String hello() { String greeting = greetingService.getGreeting(); return greeting.toUpperCase(); } } Micronaut Dieses relativ neue Java-Framework ist auf leichtgewichtige Microservices-APIs zugeschnitten. Wenn Sie als Java-begeisterter Entwickler nach einem performanten, nicht block-intensivem API-Framework suchen, ist Micronaut die richtige Wahl. Mit Blick auf Routes ähnelt Micronaut Spring – das Framework hat aber noch ein paar andere Tricks auf Lager. Zum Beispiel eine Ahead-of-Time (AoT)-Kompilierung für besonders schnelle Startups, wie im nachfolgenden Beispiel zu sehen: import io.micronaut.http.MediaType; import io.micronaut.http.annotation.Controller; import io.micronaut.http.annotation.Get; import io.micronaut.http.annotation.Produces; @Controller("/hello") public class HelloController { @Get(produces = MediaType.TEXT_PLAIN) public String index() { return "Hello, InfoWorld from Micronaut!"; } } Quarkus Wie Micronaut konzentriert sich auch Quarkus auf Cloud-native Entwicklung. Dabei zeichnet es sich insbesondere durch einen eigenwilligen Stil sowie ausgeprägten Kommandozeilen-Support für Devmode und Container-bewusstes Packaging aus. Eine Stärke von Quarkus: Es optimiert und vereinheitlicht die Befehlszeilen-Experience. Im folgenden Beispiel nutzen wir das, um eine neue Applikation zu erstellen und im Hot-Swap-Devmode auszuführen: # New Quarkus project with the RESTEasy extension mvn io.quarkus.platform:quarkus-maven-plugin:2.16.0.Final:create -DprojectGroupId=org.acme -DprojectArtifactId=my-quarkus-app -Dextensions="resteasy" cd my-quarkus-app # Run the application in dev mode ./mvnw compile quarkus:dev -- Tests paused Press [e] to edit command line args (currently ''), [r] to resume testing, [o] Toggle test output, [:] for the terminal, [h] for more options> JHipster Sehr wahrscheinlich ist JHipster das umfassendeste und ehrgeizigste Java-Framework in dieser Auflistung. Es deckt eine enorme Bandbreite ab, inklusive SQL- und NoSQL-Backend-Data-Stores – alles innerhalb des Java- und JVM-Ökosystems. Im folgenden Code-Beispiel können Sie beobachten, wie nahtlos JHipster eine Vielzahl von Technologien in einen konsistenten Rahmen „presst“: ✔ What is the base name of your application? jhip ✔ Which *type* of application would you like to create? Monolithic application (recommended for simple projects) ✔ What is your default Java package name? com.infoworld ✔ Would you like to use Maven or Gradle for building the backend? Gradle ✔ Do you want to make it reactive with Spring WebFlux? no ✔ Which *type* of authentication would you like to use? JWT authentication (stateless, with a token) ✔ Besides JUnit, which testing frameworks would you like to use? ✔ Which *type* of database would you like to use? MongoDB ✔ Which cache do you want to use? (Spring cache abstraction) Ehcache (local cache, for a single node) ✔ Which other technologies would you like to use? Elasticsearch as search engine ✔ Do you want to enable Gradle Enterprise integration? no ? Which *framework* would you like to use for the client? Angular ❯ React Vue No client Die besten Frameworks für JVM-Sprachen Die JVM bietet eine stabile, leistungsstarke und sichere Plattform für praktisch jede Sprache und jeden Zweck – nicht nur für Java. Das hat die Entwickler-Community genutzt, um einige hervorragende Frameworks und Sprachen für die JVM zu entwickeln. Kotlin/Ktor Für Java-Entwickler, die ihren Horizont erweitern möchten, ist Kotlin eine logische Konsequenz: Die zweitbeliebteste JVM-Sprache schleift einige Java-Kanten ab, behält dabei aber die strukturelle Robustheit in weiten Teilen bei. Kotlins natives Framework ist Ktor. Dieses zeichnet sich vor allem durch seine gute Developer Experience aus, die der von Ruby on Rails ähnelt. Ktor zu konfigurieren und einzurichten, bedarf allerdings etwas mehr Handarbeit Im folgenden Code-Beispiel liegt der Fokus aus dem HTML-DSL-Feature von Kotlin zu Templating-Zwecken (um den HTML-Code zu erstellen, ist ausschließlich Kotlin erforderlich): routing { get("/") { call.respondHtml { head { title("Quotes") } body { h1 { +"Quotes to Live By" } ul { listOf( "This Mind is the matrix of all matter." to "Max Planck", "All religions, arts and sciences are branches of the same tree." to "Albert Einstein", "The mind is everything. What you think you become." to "Buddha" ).forEach { (quote, author) -> li { p { +quote } p { +"― $author" } } } } Scala/Play Scala ist eine JVM-Sprache, die vor allem für ihren leistungsstarken, funktionalen Programmierstil bekannt ist. Die Sprache zeichnet sich außerdem durch nicht blockierende, asynchrone Prozesse und einen Immutability-Fokus aus. Für Entwickler, die einen weitgehend imperativen oder objektorientierten Background haben, kann sich der Umstieg entsprechend schwierig gestalten. Der Scala/Play-Stack überzeugt vor allem mit: hohem Durchsatz, Microservices im Reactive-Styl, sowie Middleware. Play fungiert dabei als eine Art HTTP-Semantik-Layer, der über die funktionale Engine von Scala gelegt wird. In Kombination mit dem Scala-Build-Tool ist Play eine gut integrierte, intelligente Plattform, um solide Backends zu entwickeln – insbesondere Echtzeitsysteme. Im nachfolgenden Beipsiel definieren wir einen simplen „Hello, World“-Endpunkt in Scala und Play: import play.api.mvc._ import javax.inject._ @Singleton class HomeController @Inject()(cc: ControllerComponents) extends AbstractController(cc) { def index = Action { Ok("Hello, InfoWorld!") } } Vert.x „Vert.x ist ein Toolkit, kein Framework – es ist also von Natur aus sehr composable und embeddable“, heißt es auf der Webseite des Open-Source-Projekts der Eclipse Foundation. Aktuell unterstützt dieses Reactive-Projekt mehrere JVM-Sprachen, darunter: Java, JavaScript, Ruby, Groovy, Scala, Kotlin und PHP. Vert.x lässt sich außerdem auch als mehrsprachiger Event-Bus nutzen – ähnlich wie Javas JMS. Das Toolkit bietet eine vollumfängliche, ereignisgesteuerte Multiprozess-Engine, die sich auf Multicore-Server skalieren lässt (Multi-Reactor-Architektur). Das folgende Code-Snippet zeigt ein simples Beispiel, wie ein Endpunkt mit Vert.x und Java bereitgestellt wird: @Override public void start(Promise startPromise) throws Exception { vertx.createHttpServer().requestHandler(req -> { req.response() .putHeader("content-type", "text/plain") .end("Hello from Vert.x!"); }).listen(8888).onComplete(http -> { if (http.succeeded()) { startPromise.complete(); System.out.println("HTTP server started on port 8888"); } else { startPromise.fail(http.cause()); } }); } } Zu beachten ist hier, dass für den Request und den Startvorgang des Servers funktionale Hanlder eingesetzt werden. Verkettete, funktionale Event Handler zu nutzen, gehört bei Vert.x zum Konzept. Das können sich Entwickler auch für reaktive Funktionen auf höherer Ebene zunutze machen. (fm) Sie wollen weitere interessante Beiträge zu diversen Themen aus der IT-Welt lesen? Unsere kostenlosen Newsletter liefern Ihnen alles, was IT-Profis wissen sollten – direkt in Ihre Inbox!
Die besten Frameworks für Java & JVM-Sprachen Erfolgreiche Entwicklungsarbeit braucht das richtige Rahmenwerk.Ground Picture | shutterstock.com Java zeichnet sich in den letzten Jahren durch ein bewundernswertes Gleichgewicht zwischen Innovation und Stabilität aus. Das ist in erster Linie der Integration sowohl funktionaler als auch reaktiver Elemente zu verdanken. Dazu kommen erstklassige Performanz, Sicherheit und Concurrency. Nur die Syntax von Java kommt nicht überall gut an, weil sie sich gerade im Vergleich zu neueren Sprachen etwas klobig gestaltet. Auch dagegen gibt es jedoch Mittel – zum Beispiel JVM-Sprachen wie Kotlin. Geht es um Backend-Frameworks für Java und JVM-Sprachen, steht Entwicklern ebenfalls ein breites Spektrum an Optionen zur Verfügung. In diesem Artikel werfen wir einen Blick auf die jeweils besten aus beiden Bereichen. In der nachfolgenden Tabelle sehen Sie die behandelten Frameworks im Überblick – und im Vergleich. Unsere Bewertungsskala reicht dabei von 1 bis 3 Punkte – wobei Letzteres die Höchstwertung darstellt. FrameworkAPIRealtimeStatic Site Generation (SSG)Unique strengthsSpring322Enterprise versatilityMicronaut321Cloud-native, microservicesQuarkus321Cloud-native, developer experienceJHipster321Full-stack SSGKtor/Kotlin322Kotlin-centric, flexiblePlay/Scala332Reactive, Scala, high-performanceVert.x331Reactive, event-driven Die besten Java-Frameworks Werfen wir nun einen detaillierteren Blick auf die einzelnen Rahmenwerke – beginnend mit denen für Java. Spring Das Backend-Framework für Java schlechthin ist Spring. Mit diesem Rahmenwerk hielten Konzepte wie Inversion of Control und Dependency Injection Einzug – also Dinge, die viele Developer heutzutage als selbstverständlich betrachten. Heutzutage zeichnet sich Spring insbesondere durch eine wesentliche Vereinfachung aus, vor allem getrieben durch Spring Boot. Im Bereich Webentwicklung lässt sich mit einer Kombination von Spring MVC und REST fast jede Aufgabe bewältigen. Im Vergleich zu JavaScript-Frameworks wie Express, legt Spring sehr viel Wert auf Formalitäten – es eignet sich vor allem für die Entwicklungsabteilungen von Großunternehmen. Im nachfolgenden Beispiel nutzen wir den Dependency-Injection-Mechanismus von Spring, um einen Service zu „injizieren“. Dieser stellt Daten für eine /hello-Route zur Verfügung und verarbeitet diese anschließend für die Antwort: import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class GreetingController { @Autowired private GreetingService greetingService; @GetMapping("/hello") public String hello() { String greeting = greetingService.getGreeting(); return greeting.toUpperCase(); } } Micronaut Dieses relativ neue Java-Framework ist auf leichtgewichtige Microservices-APIs zugeschnitten. Wenn Sie als Java-begeisterter Entwickler nach einem performanten, nicht block-intensivem API-Framework suchen, ist Micronaut die richtige Wahl. Mit Blick auf Routes ähnelt Micronaut Spring – das Framework hat aber noch ein paar andere Tricks auf Lager. Zum Beispiel eine Ahead-of-Time (AoT)-Kompilierung für besonders schnelle Startups, wie im nachfolgenden Beispiel zu sehen: import io.micronaut.http.MediaType; import io.micronaut.http.annotation.Controller; import io.micronaut.http.annotation.Get; import io.micronaut.http.annotation.Produces; @Controller("/hello") public class HelloController { @Get(produces = MediaType.TEXT_PLAIN) public String index() { return "Hello, InfoWorld from Micronaut!"; } } Quarkus Wie Micronaut konzentriert sich auch Quarkus auf Cloud-native Entwicklung. Dabei zeichnet es sich insbesondere durch einen eigenwilligen Stil sowie ausgeprägten Kommandozeilen-Support für Devmode und Container-bewusstes Packaging aus. Eine Stärke von Quarkus: Es optimiert und vereinheitlicht die Befehlszeilen-Experience. Im folgenden Beispiel nutzen wir das, um eine neue Applikation zu erstellen und im Hot-Swap-Devmode auszuführen: # New Quarkus project with the RESTEasy extension mvn io.quarkus.platform:quarkus-maven-plugin:2.16.0.Final:create -DprojectGroupId=org.acme -DprojectArtifactId=my-quarkus-app -Dextensions="resteasy" cd my-quarkus-app # Run the application in dev mode ./mvnw compile quarkus:dev -- Tests paused Press [e] to edit command line args (currently ''), [r] to resume testing, [o] Toggle test output, [:] for the terminal, [h] for more options> JHipster Sehr wahrscheinlich ist JHipster das umfassendeste und ehrgeizigste Java-Framework in dieser Auflistung. Es deckt eine enorme Bandbreite ab, inklusive SQL- und NoSQL-Backend-Data-Stores – alles innerhalb des Java- und JVM-Ökosystems. Im folgenden Code-Beispiel können Sie beobachten, wie nahtlos JHipster eine Vielzahl von Technologien in einen konsistenten Rahmen „presst“: ✔ What is the base name of your application? jhip ✔ Which *type* of application would you like to create? Monolithic application (recommended for simple projects) ✔ What is your default Java package name? com.infoworld ✔ Would you like to use Maven or Gradle for building the backend? Gradle ✔ Do you want to make it reactive with Spring WebFlux? no ✔ Which *type* of authentication would you like to use? JWT authentication (stateless, with a token) ✔ Besides JUnit, which testing frameworks would you like to use? ✔ Which *type* of database would you like to use? MongoDB ✔ Which cache do you want to use? (Spring cache abstraction) Ehcache (local cache, for a single node) ✔ Which other technologies would you like to use? Elasticsearch as search engine ✔ Do you want to enable Gradle Enterprise integration? no ? Which *framework* would you like to use for the client? Angular ❯ React Vue No client Die besten Frameworks für JVM-Sprachen Die JVM bietet eine stabile, leistungsstarke und sichere Plattform für praktisch jede Sprache und jeden Zweck – nicht nur für Java. Das hat die Entwickler-Community genutzt, um einige hervorragende Frameworks und Sprachen für die JVM zu entwickeln. Kotlin/Ktor Für Java-Entwickler, die ihren Horizont erweitern möchten, ist Kotlin eine logische Konsequenz: Die zweitbeliebteste JVM-Sprache schleift einige Java-Kanten ab, behält dabei aber die strukturelle Robustheit in weiten Teilen bei. Kotlins natives Framework ist Ktor. Dieses zeichnet sich vor allem durch seine gute Developer Experience aus, die der von Ruby on Rails ähnelt. Ktor zu konfigurieren und einzurichten, bedarf allerdings etwas mehr Handarbeit Im folgenden Code-Beispiel liegt der Fokus aus dem HTML-DSL-Feature von Kotlin zu Templating-Zwecken (um den HTML-Code zu erstellen, ist ausschließlich Kotlin erforderlich): routing { get("/") { call.respondHtml { head { title("Quotes") } body { h1 { +"Quotes to Live By" } ul { listOf( "This Mind is the matrix of all matter." to "Max Planck", "All religions, arts and sciences are branches of the same tree." to "Albert Einstein", "The mind is everything. What you think you become." to "Buddha" ).forEach { (quote, author) -> li { p { +quote } p { +"― $author" } } } } Scala/Play Scala ist eine JVM-Sprache, die vor allem für ihren leistungsstarken, funktionalen Programmierstil bekannt ist. Die Sprache zeichnet sich außerdem durch nicht blockierende, asynchrone Prozesse und einen Immutability-Fokus aus. Für Entwickler, die einen weitgehend imperativen oder objektorientierten Background haben, kann sich der Umstieg entsprechend schwierig gestalten. Der Scala/Play-Stack überzeugt vor allem mit: hohem Durchsatz, Microservices im Reactive-Styl, sowie Middleware. Play fungiert dabei als eine Art HTTP-Semantik-Layer, der über die funktionale Engine von Scala gelegt wird. In Kombination mit dem Scala-Build-Tool ist Play eine gut integrierte, intelligente Plattform, um solide Backends zu entwickeln – insbesondere Echtzeitsysteme. Im nachfolgenden Beipsiel definieren wir einen simplen „Hello, World“-Endpunkt in Scala und Play: import play.api.mvc._ import javax.inject._ @Singleton class HomeController @Inject()(cc: ControllerComponents) extends AbstractController(cc) { def index = Action { Ok("Hello, InfoWorld!") } } Vert.x „Vert.x ist ein Toolkit, kein Framework – es ist also von Natur aus sehr composable und embeddable“, heißt es auf der Webseite des Open-Source-Projekts der Eclipse Foundation. Aktuell unterstützt dieses Reactive-Projekt mehrere JVM-Sprachen, darunter: Java, JavaScript, Ruby, Groovy, Scala, Kotlin und PHP. Vert.x lässt sich außerdem auch als mehrsprachiger Event-Bus nutzen – ähnlich wie Javas JMS. Das Toolkit bietet eine vollumfängliche, ereignisgesteuerte Multiprozess-Engine, die sich auf Multicore-Server skalieren lässt (Multi-Reactor-Architektur). Das folgende Code-Snippet zeigt ein simples Beispiel, wie ein Endpunkt mit Vert.x und Java bereitgestellt wird: @Override public void start(Promise startPromise) throws Exception { vertx.createHttpServer().requestHandler(req -> { req.response() .putHeader("content-type", "text/plain") .end("Hello from Vert.x!"); }).listen(8888).onComplete(http -> { if (http.succeeded()) { startPromise.complete(); System.out.println("HTTP server started on port 8888"); } else { startPromise.fail(http.cause()); } }); } } Zu beachten ist hier, dass für den Request und den Startvorgang des Servers funktionale Hanlder eingesetzt werden. Verkettete, funktionale Event Handler zu nutzen, gehört bei Vert.x zum Konzept. Das können sich Entwickler auch für reaktive Funktionen auf höherer Ebene zunutze machen. (fm) Sie wollen weitere interessante Beiträge zu diversen Themen aus der IT-Welt lesen? Unsere kostenlosen Newsletter liefern Ihnen alles, was IT-Profis wissen sollten – direkt in Ihre Inbox!