Quarkus: Anwendungsmodernisierung am Beispiel von helloworld aus dem JBoss EAP Quickstart

Hallo zusammen in diesem Blog, und dies ist der vierte Beitrag aus der Serie über Quarkus!

Quarkus: Anwendungsmodernisierung am Beispiel von helloworld aus dem JBoss EAP Quickstart

Der vorherige Beitrag handelte davon, wie Quarkus MicroProfile und Spring vereint. Erinnern wir uns, dass Quarkus es als „ultraschnelles subatomares Java“ positioniert wird, auch bekannt als „Kubernetes-orientierter Java-Stack, optimiert für GraalVM und OpenJDK HotSpot, der aus den besten Bibliotheken und Standards besteht“. Heute zeigen wir, wie man bestehende Java-Anwendungen modernisieren kann, indem wir die Möglichkeiten von Quarkus nutzen, am Beispiel des Helloworld-Anwendung aus dem Red Hat JBoss Enterprise Application Platform (JBoss EAP) Quickstart, die die von Quarkus unterstützten Technologien CDI und Servlet 3 verwendet.

Es ist wichtig zu beachten, dass sowohl Quarkus als auch JBoss EAP darauf abzielen, Werkzeuge zu verwenden, die größtenteils auf Standards basieren. Haben Sie keine Anwendung, die auf JBoss EAP läuft? Kein Problem, Sie können sie einfach von Ihrem aktuellen Anwendungsserver auf JBoss EAP mit Hilfe von Red Hat Application Migration Toolkitübertragen. Danach wird die finale und betriebsbereite Version des modernisierten Codes im Repository verfügbar sein github.com/mrizzi/jboss-eap-quickstarts/tree/quarkus, im Modul helloworld.

Für das Schreiben dieses Beitrags wurden Leitfäden zu Quarkusverwendet, hauptsächlich Creating Your First Application und Building a Native Executable.

Wir schauen uns den Code an

Zuerst erstellen wir einen lokalen Klon des Repositories JBoss EAP Quickstarts:

$ git clone https://github.com/jboss-developer/jboss-eap-quickstarts.git
Klonen in 'jboss-eap-quickstarts'...
remote: Zähle Objekte: 148133, erledigt.
remote: Insgesamt 148133 (Delta 0), wiederverwendet 0 (Delta 0), pack-wiederverwendet 148133
Empfange Objekte: 100% (148133/148133), 59.90 MiB | 7.62 MiB/s, erledigt.
Delta wird aufgelöst: 100% (66476/66476), erledigt.
$ cd jboss-eap-quickstarts/helloworld/

Wir sehen uns an, wie das ursprüngliche Helloworld funktioniert

Der Kern dieser Anwendung ist aus dem Namen ersichtlich, aber wir werden ihren Code systematisch modernisieren. Daher schauen wir uns zunächst diese Anwendung in ihrer Ursprünglichkeit an.

Helloworld bereitstellen

1. Öffnen Sie das Terminal und wechseln Sie in das Stammverzeichnis von JBoss EAP (dies kann heruntergeladen werden hier), das heißt in den EAP_HOME-Ordner.

2. Starten Sie den JBoss EAP-Server mit dem Standardprofil:

$ EAP_HOME/bin/standalone.sh

Hinweis: unter Windows verwenden Sie das Skript EAP_HOMEbinstandalone.bat zum Start.

Nach ein paar Sekunden sollte im Log Folgendes erscheinen:

[org.jboss.as] (Controller Boot Thread) WFLYSRV0025: JBoss EAP 7.2.0.GA (WildFly Core 6.0.11.Final-redhat-00001) wurde in 3315 ms gestartet - 306 von 527 Diensten gestartet (321 Dienste sind faul, passiv oder nach Bedarf)

3. Öffnen Sie im Browser 127.0.0.1:8080 und sehen Sie Folgendes:

Quarkus: Anwendungsmodernisierung am Beispiel von helloworld aus dem JBoss EAP Quickstart

Abb. 1. Startseite von JBoss EAP.

4. Folgen Sie den Anweisungen im Handbuch Build and Deploy the Quickstart: Wir starten helloworld und führen (aus dem Hauptverzeichnis des Projekts) den folgenden Befehl aus:

$ mvn clean install wildfly:deploy

Nach erfolgreichem Ausführen dieses Befehls sehen wir im Log ungefähr Folgendes:

[INFO] ------------------------------------------------------------------------ 
[INFO] BUILD SUCCESS 
[INFO] ------------------------------------------------------------------------ 
[INFO] Gesamtzeit: 8,224 s

Das erste Deployment der Anwendung helloworld auf JBoss EAP dauerte etwas mehr als 8 Sekunden.

Testen von helloworld

Indem wir strikt den Anweisungen folgen Zugriff auf die Anwendung, öffnen wir im Browser 127.0.0.1:8080/helloworld und sehen Folgendes:

Quarkus: Anwendungsmodernisierung am Beispiel von helloworld aus dem JBoss EAP Quickstart

Abb. 2. Das ursprüngliche Hello World aus JBoss EAP.

Änderungen vornehmen

Ändern Sie den Eingabeparameter createHelloMessage(String name) von World zu Marco:

writer.println("<h1>" + helloService.createHelloMessage("Marco") + "</h1>");

Führen Sie erneut den folgenden Befehl aus:

$ mvn clean install wildfly:deploy

Aktualisieren Sie dann die Seite im Browser und sehen Sie, dass der Text geändert wurde:

Quarkus: Anwendungsmodernisierung am Beispiel von helloworld aus dem JBoss EAP Quickstart

Abb. 3. Hello Marco in JBoss EAP.

Das Deployment von helloworld zurücksetzen und JBoss EAP beenden

Dies ist nicht zwingend erforderlich, aber wenn Sie das Deployment rückgängig machen möchten, können Sie dies mit dem folgenden Befehl tun:

$ mvn clean install wildfly:undeploy

Um die Instanz von JBoss EAP zu beenden, drücken Sie einfach Ctrl+C im Terminalfenster.

Modernisierung von helloworld

Jetzt kümmern wir uns um die Modernisierung der ursprünglichen Anwendung helloworld.

Erstellen Sie einen neuen Branch

Wir erstellen einen neuen Arbeitszweig, nachdem das quickstart-Projekt abgeschlossen ist:

$ git checkout -b quarkus 7.2.0.GA

Wir ändern die Datei pom.xml

Wir beginnen mit den Änderungen an der Datei pom.xml. Um Quarkus das Einfügen von XML-Blocks zu ermöglichen, führen wir den folgenden Befehl im Ordner helloworld aus:

$ mvn io.quarkus:quarkus-maven-plugin:0.23.2:create

Für diesen Artikel wurde die Version 0.23.2 verwendet. Quarkus veröffentlicht häufig neue Versionen; die aktuellste Version finden Sie auf der Website github.com/quarkusio/quarkus/releases/latest.

Der obige Befehl fügt in pom.xml die folgenden Elemente ein:

  • Die Eigenschaft , die die verwendete Quarkus-Version angibt.
  • Der Block zum Importieren des Quarkus BOM (Bill of Materials), sodass die Version für jede Quarkus-Abhängigkeit nicht hinzugefügt werden muss.
  • Das Plugin quarkus-maven-plugin, das für das Verpacken der Anwendung verantwortlich ist und den Entwicklungmodus bereitstellt.
  • Das Native-Profil zum Erstellen von ausführbaren Dateien der Anwendung.

Darüber hinaus nehmen wir folgende Änderungen manuell in pom.xml vor:

  1. Wir ziehen das Tag aus dem Block heraus und platzieren es über dem Tag . Da wir im nächsten Schritt den Block entfernen werden, müssen wir speichern.
  2. Wir entfernen den Block , da die Anwendung in Quarkus keinen übergeordneten pom von JBoss mehr benötigt.
  3. Wir fügen das Tag hinzu und platzieren es unter dem Tag . Die Versionsnummer kann beliebig angegeben werden.
  4. Wir entfernen das Tag , da diese Anwendung jetzt kein WAR mehr ist, sondern ein herkömmliches JAR.
  5. Wir modifizieren die folgenden Abhängigkeiten:
    1. Wir ändern die Abhängigkeit javax.enterprise:cdi-api in io.quarkus:quarkus-arc und entfernen provided, da dieses Quarkus-Plugin laut den Dokumenten die CDI-Abhängigkeitsinjektion bereitstellt.
    2. Wir ändern die Abhängigkeit org.jboss.spec.javax.servlet:jboss-servlet-api_4.0_spec in io.quarkus:quarkus-undertow und entfernen provided, da dieses Quarkus-Plugin laut den Dokumenten die Servlet-Unterstützung bereitstellt.
    3. Wir entfernen die Abhängigkeit org.jboss.spec.javax.annotation:jboss-annotations-api_1.3_spec, da diese mit den Abhängigkeiten geliefert wird, die wir gerade geändert haben.

Die Version der pom.xml-Datei mit allen Änderungen befindet sich unter github.com/mrizzi/jboss-eap-quickstarts/blob/quarkus/helloworld/pom.xml.

Bitte beachten Sie, dass der oben angegebene Befehl mvn io.quarkus:quarkus-maven-plugin:0.23.2:create nicht nur die pom.xml-Datei ändert, sondern auch eine Reihe von Komponenten zum Projekt hinzufügt, darunter die folgenden Dateien und Ordner:

  • Die Datei mvnw und mvnw.cmd sowie der Ordner .mvn: Der Maven Wrapper ermöglicht es, Projekte mit einer bestimmten Maven-Version ohne deren Installation auszuführen.
  • Der Ordner docker (im Verzeichnis src/main/): Hier finden Sie Beispiele von Dockerfile-Dateien für die native und JVM-Ausführung (inklusive der Datei .dockerignore).
  • Der Ordner resources (im Verzeichnis src/main/): Hier befindet sich eine leere Datei application.properties und ein Beispiel für die Startseite Quarkus index.html (siehe Run the modernized helloworld für weitere Informationen).

Starten wir helloworld
Um die Anwendung zu testen, verwenden wir quarkus:dev, das Quarkus im Entwicklungsmodus startet (weitere Infos finden Sie in diesem Abschnitt der Dokumentation über Entwicklungsmodus).

Hinweis: Dieser Schritt wird erwartungsgemäß zu einem Fehler führen, da wir noch nicht alle notwendigen Änderungen vorgenommen haben.

Nun führen wir den Befehl aus, um zu prüfen, wie das funktioniert:

$ ./mvnw compile quarkus:dev
[INFO] Scanning for projects...
[INFO]
[INFO] ----------------< org.jboss.eap.quickstarts:helloworld >----------------
[INFO] Building Quickstart: helloworld quarkus
[INFO] --------------------------------[ war ]---------------------------------
[INFO]
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ helloworld ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] Copying 2 resources
[INFO]
[INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ helloworld ---
[INFO] Nothing to compile - all classes are up to date
[INFO]
[INFO] --- quarkus-maven-plugin:0.23.2:dev (default-cli) @ helloworld ---
Listening for transport dt_socket at address: 5005
INFO  [io.qua.dep.QuarkusAugmentor] Beginning quarkus augmentation
INFO  [org.jbo.threads] JBoss Threads version 3.0.0.Final
ERROR [io.qua.dev.DevModeMain] Failed to start quarkus: java.lang.RuntimeException: io.quarkus.builder.BuildException: Build failure: Build failed due to errors
	[error]: Build step io.quarkus.arc.deployment.ArcProcessor#validate threw an exception: javax.enterprise.inject.spi.DeploymentException: javax.enterprise.inject.UnsatisfiedResolutionException: Unsatisfied dependency for type org.jboss.as.quickstarts.helloworld.HelloService and qualifiers [@Default]
	- java member: org.jboss.as.quickstarts.helloworld.HelloWorldServlet#helloService
	- declared on CLASS bean [types=[javax.servlet.ServletConfig, java.io.Serializable, org.jboss.as.quickstarts.helloworld.HelloWorldServlet, javax.servlet.GenericServlet, javax.servlet.Servlet, java.lang.Object, javax.servlet.http.HttpServlet], qualifiers=[@Default, @Any], target=org.jboss.as.quickstarts.helloworld.HelloWorldServlet]
	at io.quarkus.arc.processor.BeanDeployment.processErrors(BeanDeployment.java:841)
	at io.quarkus.arc.processor.BeanDeployment.init(BeanDeployment.java:214)
	at io.quarkus.arc.processor.BeanProcessor.initialize(BeanProcessor.java:106)
	at io.quarkus.arc.deployment.ArcProcessor.validate(ArcProcessor.java:249)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at io.quarkus.deployment.ExtensionLoader$1.execute(ExtensionLoader.java:780)
	at io.quarkus.builder.BuildContext.run(BuildContext.java:415)
	at org.jboss.threads.ContextClassLoaderSavingRunnable.run(ContextClassLoaderSavingRunnable.java:35)
	at org.jboss.threads.EnhancedQueueExecutor.safeRun(EnhancedQueueExecutor.java:2011)
	at org.jboss.threads.EnhancedQueueExecutor$ThreadBody.doRunTask(EnhancedQueueExecutor.java:1535)
	at org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1426)
	at java.lang.Thread.run(Thread.java:748)
	at org.jboss.threads.JBossThread.run(JBossThread.java:479)
Caused by: javax.enterprise.inject.UnsatisfiedResolutionException: Unsatisfied dependency for type org.jboss.as.quickstarts.helloworld.HelloService and qualifiers [@Default]
	- java member: org.jboss.as.quickstarts.helloworld.HelloWorldServlet#helloService
	- declared on CLASS bean [types=[javax.servlet.ServletConfig, java.io.Serializable, org.jboss.as.quickstarts.helloworld.HelloWorldServlet, javax.servlet.GenericServlet, javax.servlet.Servlet, java.lang.Object, javax.servlet.http.HttpServlet], qualifiers=[@Default, @Any], target=org.jboss.as.quickstarts.helloworld.HelloWorldServlet]
	at io.quarkus.arc.processor.Beans.resolveInjectionPoint(Beans.java:428)
	at io.quarkus.arc.processor.BeanInfo.init(BeanInfo.java:371)
	at io.quarkus.arc.processor.BeanDeployment.init(BeanDeployment.java:206)
	... 14 more

Das funktioniert nicht... Aber warum?

Die Ausnahme UnsatisfiedResolutionException verweist auf die Klasse HelloService, die ein Mitglied der Klasse HelloWorldServlet ist (Java-Mitglied: org.jboss.as.quickstarts.helloworld.HelloWorldServlet#helloService). Das Problem ist, dass HelloWorldServlet eine injizierte Instanz von HelloService benötigt, die jedoch nicht gefunden werden kann (obwohl sich beide Klassen im selben Paket befinden).

Es ist Zeit, zurückzukehren zu Dokumentation. und zu lesen, wie Quarkus funktioniert Inject, und somit auch Contexts and Dependency Injection (CDI). Daher öffnen wir das Handbuch zu Contexts and Dependency Injection und lesen im Abschnitt Bean Discovery : «Eine Bean-Klasse, die keine definierende Bean-Annotation besitzt, wird nicht gefunden».

Schauen wir uns die Klasse HelloService an – sie hat tatsächlich keine solche Annotation. Daher muss sie hinzugefügt werden, damit Quarkus die Bean suchen und finden kann. Und da es sich um ein stateless-Objekt handelt, können wir die Annotation @ApplicationScoped wie folgt hinzufügen:

@ApplicationScoped
public class HelloService {

Hinweis: Hier könnte die Entwicklungsumgebung Sie auffordern, das erforderliche Paket hinzuzufügen (siehe Zeile unten), und das müssen Sie manuell tun, so:

import javax.enterprise.context.ApplicationScoped;

Wenn Sie sich unsicher sind, welchen Scope Sie verwenden sollten, wenn dieser für das ursprüngliche Bean überhaupt nicht festgelegt ist, lesen Sie die Dokumentation. JSR 365: Kontext- und Abhängigkeitsinjektion für Java 2.0—Standard-Scope.

Versuchen wir erneut, die Anwendung mit dem Befehl ./mvnw compile quarkus:dev zu starten:

$ ./mvnw compile quarkus:dev
[INFO] Suche nach Projekten...
[INFO]
[INFO] ----------------< org.jboss.eap.quickstarts:helloworld >----------------
[INFO] Erstelle Quickstart: helloworld quarkus
[INFO] --------------------------------[ war ]---------------------------------
[INFO]
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ helloworld ---
[INFO] Verwende 'UTF-8' Kodierung zum Kopieren gefilterter Ressourcen.
[INFO] Kopiere 2 Ressourcen
[INFO]
[INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ helloworld ---
[INFO] Änderungen erkannt - das Modul wird neu kompiliert!
[INFO] Kompiliere 2 Quell-Dateien nach /home/mrizzi/git/forked/jboss-eap-quickstarts/helloworld/target/classes
[INFO]
[INFO] --- quarkus-maven-plugin:0.23.2:dev (default-cli) @ helloworld ---
Warte auf Transport dt_socket unter der Adresse: 5005
INFO  [io.qua.dep.QuarkusAugmentor] (main) Beginne mit der Quarkus-Augmentierung
INFO  [io.qua.dep.QuarkusAugmentor] (main) Quarkus-Augmentierung in 576ms abgeschlossen
INFO  [io.quarkus] (main) Quarkus 0.23.2 wurde in 1.083s gestartet. Lauscht auf: http://0.0.0.0:8080
INFO  [io.quarkus] (main) Profil dev aktiviert. Live Coding aktiviert.
INFO  [io.quarkus] (main) Installierte Funktionen: [cdi]

Jetzt erfolgt alles ohne Fehler.

Starten wir das modernisierte helloworld.
Wie im Log angegeben, öffnen wir im Browser 0.0.0.0:8080 (Standard-Startseite von Quarkus) und sehen Folgendes:

Quarkus: Anwendungsmodernisierung am Beispiel von helloworld aus dem JBoss EAP Quickstart

Abbildung 4. Startseite Quarkus dev.

In der Annotation WebServlet dieser Anwendung ist die folgende Kontextdefinition angegeben:

@WebServlet("/HelloWorld")
public class HelloWorldServlet extends HttpServlet {

Daher gehen wir im Browser zu 0.0.0.0:8080/HelloWorld und sehen Folgendes:

Quarkus: Anwendungsmodernisierung am Beispiel von helloworld aus dem JBoss EAP Quickstart

Abbildung 5: Die Quarkus dev-Seite für die Hello World-Anwendung.

Und da haben wir es, alles funktioniert.

Jetzt ändern wir den Code. Beachten Sie, dass der Befehl ./mvnw compile quarkus:dev weiterhin läuft und wir ihn nicht anhalten wollen. Lassen Sie uns nun dieselben, ganz einfachen Änderungen am Code vornehmen und sehen, wie Quarkus das Entwickeln erleichtert:

writer.println("<h1>" + helloService.createHelloMessage("Marco") + "</h1>");

Wir speichern die Datei und aktualisieren dann die Webseite, um die Nachricht "Hello Marco" zu sehen, wie auf dem Screenshot unten gezeigt:

Quarkus: Anwendungsmodernisierung am Beispiel von helloworld aus dem JBoss EAP Quickstart

Abbildung 6. Die Seite Hello Marco in Quarkus dev.

Jetzt überprüfen wir die Ausgabe im Terminal:

INFO  [io.qua.dev] (vert.x-worker-thread-3) Änderungen an Quelldateien erkannt, Neucompilierung [/home/mrizzi/git/forked/jboss-eap-quickstarts/helloworld/src/main/java/org/jboss/as/quickstarts/helloworld/HelloWorldServlet.java]
INFO  [io.quarkus] (vert.x-worker-thread-3) Quarkus wurde nach 0,003s gestoppt
INFO  [io.qua.dep.QuarkusAugmentor] (vert.x-worker-thread-3) Beginne mit der Quarkus-Ausrüstung
INFO  [io.qua.dep.QuarkusAugmentor] (vert.x-worker-thread-3) Quarkus-Ausrüstung in 232 ms abgeschlossen
INFO  [io.quarkus] (vert.x-worker-thread-3) Quarkus 0.23.2 wurde in 0,257s gestartet. Höre auf: http://0.0.0.0:8080
INFO  [io.quarkus] (vert.x-worker-thread-3) Profil dev aktiviert. Live-Coding aktiviert.
INFO  [io.quarkus] (vert.x-worker-thread-3) Installierte Funktionen: [cdi]
INFO  [io.qua.dev] (vert.x-worker-thread-3) Gesamtzeit für Hot-Replace: 0,371s

Das Aktualisieren der Seite hat die Erkennung von Änderungen im Quellcode ausgelöst, und Quarkus hat automatisch die Stop-Start-Prozedur ausgeführt. Und das alles geschah in nur 0,371 Sekunden (hier ist sie, die „superschnelle subatomare Java“).

Bauen von helloworld in ein JAR-Paket
Jetzt, wo der Code wie gewünscht funktioniert, verpacken wir ihn mit folgendem Befehl:

$ ./mvnw clean package

Dieser Befehl erstellt zwei JAR-Dateien im Ordner /target: die Datei helloworld-.jar, die das Standardartefakt darstellt, das durch den Maven-Befehl zusammen mit den Klassen und Ressourcen des Projekts erstellt wurde. Und die Datei helloworld—runner.jar, die das ausführbare JAR darstellt.

Bitte beachten Sie, dass dies kein Uber-Jar ist, da alle Abhängigkeiten einfach in den Ordner /target/lib kopiert werden (statt in die JAR-Datei gepackt zu werden). Um dieses JAR aus einem anderen Ordner oder auf einem anderen Host auszuführen, müssen sowohl die JAR-Datei als auch der Ordner /lib kopiert werden, wobei zu beachten ist, dass das Element Class-Path in der MANIFEST.MF-Datei im JAR-Paket eine explizite Auflistung der JARs aus dem lib-Ordner enthält.
Um zu erfahren, wie man Uber-Jars erstellt, lesen Sie die Anleitung. Uber-Jar-Erstellung.

Starten von helloworld, verpackt in JAR

Jetzt können wir unser JAR mit dem Standardbefehl java ausführen:

$ java -jar ./target/helloworld-<version>-runner.jar
INFO  [io.quarkus] (main) Quarkus 0.23.2 wurde in 0.673s gestartet. Lauscht auf: http://0.0.0.0:8080
INFO  [io.quarkus] (main) Profil prod aktiviert.
INFO  [io.quarkus] (main) Installierte Funktionen: [cdi]

Nachdem dies abgeschlossen ist, gehen Sie in den Browser zu 0.0.0.0:8080 und überprüfen Sie, ob alles wie erwartet funktioniert.

Kompilieren von helloworld in eine native ausführbare Datei

Unser helloworld funktioniert also als eigenständige Java-Anwendung unter Verwendung von Quarkus-Abhängigkeiten. Aber wir können weitergehen und es in eine native ausführbare Datei umwandeln.

GraalVM installieren
Zuerst müssen die erforderlichen Tools installiert werden:

1. Laden Sie GraalVM 19.2.0.1 von github.com/oracle/graal/releases/tag/vm-19.2.0.1 herunter..

2. Entpacken Sie das heruntergeladene Archiv:

$ tar xvzf graalvm-ce-linux-amd64-19.2.0.1.tar.gz

3. Wechseln Sie in das Verzeichnis untar.

4. Führen Sie den folgenden Befehl aus, um das native Image herunterzuladen und hinzuzufügen:

$ ./bin/gu install native-image

5. Setzen Sie den Ordner, der in Schritt 2 erstellt wurde, in die Umgebungsvariable GRAALVM_HOME:

$ export GRAALVM_HOME={untar-folder}/graalvm-ce-19.2.0.1)

Weitere Informationen und Installationsanleitungen für andere Betriebssysteme finden Sie im Handbuch Building a Native Executable—Prerequisites.

Wir bauen helloworld zu einer nativen ausführbaren Datei
Lesen Sie das Handbuch Building a Native Executable—Producing a native executable: „Jetzt erstellen wir eine native ausführbare Datei für unsere Anwendung, um die Startzeit zu verkürzen und die Dateigröße zu reduzieren. Die ausführbare Datei enthält alles, was zum Ausführen der Anwendung erforderlich ist, einschließlich der JVM (oder besser gesagt, einer abgespeckten Version, die nur das enthält, was zur Ausführung der Anwendung benötigt wird) sowie unserer Anwendung selbst.“

Um eine native ausführbare Datei zu erstellen, müssen Sie das native Maven-Profil aktivieren:

$ ./mvnw package -Pnative

Unser Build dauerte eine Minute und 10 Sekunden, und die resultierende Datei helloworld—runner wurde im Ordner /target erstellt.

Führen Sie die native ausführbare Datei helloworld aus

Im vorherigen Schritt haben wir die ausführbare Datei /target/helloworld—runner erhalten. Jetzt starten wir sie:

$ ./target/helloworld-<version>-runner
INFO  [io.quarkus] (main) Quarkus 0.23.2 gestartet in 0,006s. Hört auf: http://0.0.0.0:8080
INFO  [io.quarkus] (main) Profil prod aktiviert.
INFO  [io.quarkus] (main) Installierte Funktionen: [cdi]

Öffnen Sie erneut im Browser 0.0.0.0:8080 und prüfen Sie, ob alles wie gewünscht funktioniert.

Fortsetzung folgt!

Wir sind überzeugt, dass die in diesem Beitrag behandelte Methode zur Modernisierung von Java-Anwendungen unter Verwendung der Möglichkeiten von Quarkus in der realen Welt aktiv angewendet werden sollte. Dabei werden Sie wahrscheinlich auf eine Reihe von Problemen stoßen, deren Lösung wir teilweise im nächsten Beitrag behandeln, der sich damit beschäftigt, wie man den Speicherverbrauch misst, um die Leistungsverbesserung zu bewerten, die ein wichtiger Teil des gesamten Modernisierungsprozesses von Anwendungen ist.

Quelle: habr.com

Zuverlässiges Webhosting mit DDoS-Schutz, VPS- und VDS-Server kaufen 🔥 Zuverlässiges Webhosting mit DDoS-Schutz, VPS- und VDS-Server kaufen | ProHoster