Quarkus: Modernisierung von Anwendungen am Beispiel von helloworld aus dem JBoss EAP Quickstart

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

Quarkus: Modernisierung von Anwendungen am Beispiel von helloworld aus dem JBoss EAP Quickstart

Der vorherige Beitrag handelte davon, wie Quarkus MicroProfile und Spring vereint. Erinnern wir uns daran, dass unterstützt Quarkus die Verwendung des Advanced Message Queuing Protocol ( es als „superschnelles subatomares Java“ positioniert wird, auch bekannt als „Kubernetes-orientierter Java-Stack, optimiert für GraalVM und OpenJDK HotSpot, und zusammengestellt aus den besten Bibliotheken und Standards“. Heute zeigen wir, wie man bestehende Java-Anwendungen mithilfe von Quarkus modernisieren kann, am Beispiel der helloworld-Anwendung aus dem Red Hat JBoss Enterprise Application Platform (JBoss EAP) Quickstart-Repository, die Technologien wie CDI und Servlet 3 verwendet, die in Quarkus unterstützt werden.

Es ist wichtig zu beachten, dass sowohl Quarkus als auch JBoss EAP großen Wert darauf legen, Tools zu verwenden, die größtenteils auf Standards basieren. Haben Sie keine Anwendung, die auf JBoss EAP läuft? Kein Problem, sie kann problemlos vom aktuellen Anwendungsserver auf JBoss EAP mit Hilfe von Red Hat Application Migration Toolkitübertragen werden. Danach wird die endgültige und funktionsfähige Version des modernisierten Codes im Repository verfügbar sein github.com/mrizzi/jboss-eap-quickstarts/tree/quarkus, im Modul itsworking.

Bei der Erstellung dieses Beitrags wurden Leitfäden zu Quarkusverwendet, hauptsächlich Creating Your First Application und Building a Native Executable.

Besorgen wir uns den Code

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: Auflisten von Objekten: 148133, abgeschlossen.
remote: Insgesamt 148133 (delta 0), wiederverwendet 0 (delta 0), pack-wiederverwendet 148133
Empfange Objekte: 100% (148133/148133), 59.90 MiB | 7.62 MiB/s, abgeschlossen.
Auflösen von Deltas: 100% (66476/66476), abgeschlossen.
$ cd jboss-eap-quickstarts/helloworld/

Wir sehen uns an, wie die ursprüngliche helloworld funktioniert.

Im Grunde ist das Konzept dieser Anwendung aus dem Namen ersichtlich, aber wir werden ihren Code strikt wissenschaftlich modernisieren. Schauen wir uns also zunächst diese Anwendung in ihrem ursprünglichen Zustand an.

Starten wir helloworld

1. Öffnen Sie das Terminal und navigieren Sie zum Stammordner von JBoss EAP (diesen können Sie herunterladen hier), also zum Ordner EAP_HOME.

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

$ EAP_HOME/bin/standalone.sh

Hinweis: unter Windows verwenden Sie das Skript EAP_HOME/bin/standalone.bat zum Starten.

Nach ein paar Sekunden sollte im Log etwa 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 wurden gestartet (321 Dienste sind faul, passiv oder nach Bedarf)

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

Quarkus: Modernisierung von Anwendungen am Beispiel von helloworld aus dem JBoss EAP Quickstart

Abb. 1. Startseite von JBoss EAP.

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

$ mvn clean install wildfly:deploy

Nach erfolgreichem Abschluss dieses Befehls sehen wir Folgendes im Protokoll:

[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 streng nach der Anleitung vorgehen Zugriff auf die Anwendung, öffnen wir im Browser 127.0.0.1:8080/helloworld und sehen Folgendes:

Quarkus: Modernisierung von Anwendungen am Beispiel von helloworld aus dem JBoss EAP Quickstart

Abb. 2. Ursprüngliches Hello World aus JBoss EAP.

Änderungen vornehmen

Wir ändern den Eingabeparameter createHelloMessage(String name) von World auf Marco:

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

Führen wir erneut den folgenden Befehl aus:

$ mvn clean install wildfly:deploy

Dann aktualisieren wir die Seite im Browser und sehen, dass sich der Text geändert hat:

Quarkus: Modernisierung von Anwendungen am Beispiel von helloworld aus dem JBoss EAP Quickstart

Abb. 3. Hello Marco in JBoss EAP.

Rollback des Deployments von helloworld und Beendigung von JBoss EAP

Das 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.

Aktualisierung von helloworld

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

Erstellen eines neuen Branches

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

$ git checkout -b quarkus 7.2.0.GA

Ändern der Datei pom.xml

Wir werden mit der Datei pom.xml beginnen. Damit Quarkus XML-Blöcke einfügen kann, führen wir den folgenden Befehl im Verzeichnis helloworld aus:

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

Für das Verfassen dieses Artikels wurde Version 0.23.2 verwendet. Quarkus bringt häufig neue Versionen heraus, um herauszufinden, welche Version die neueste ist, besuchen Sie die Seite github.com/quarkusio/quarkus/releases/latest.

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

  • Die Eigenschaft , die die verwendete Version von Quarkus angibt.
  • Der Block zum Import von Quarkus BOM (Bill of Materials), damit für jede Quarkus-Abhängigkeit keine Version hinzugefügt werden muss.
  • Das Plugin quarkus-maven-plugin, das für das Verpacken der Anwendung verantwortlich ist und den Modus 'Entwicklungsmodus' bereitstellt.
  • Das native Profil zur Erstellung von ausführbaren Dateien der Anwendung.

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

  1. Wir ziehen das Tag aus dem Block und platzieren es über dem Tag . Da wir im nächsten Schritt den Block entfernen werden, müssen wir beibehalten.
  2. Wir entfernen den Block , da diese Anwendung bei der Arbeit mit Quarkus nicht mehr das übergeordnete pom von JBoss benötigt.
  3. Wir fügen das Tag hinzu und platzieren es unter dem Tag . Die Versionsnummer kann frei gewählt werden.
  4. Wir entfernen das Tag , da diese Anwendung nun kein WAR mehr ist, sondern ein gewöhnliches 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 (laut Dokumentation) dieses Quarkus-Plugin 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 (laut Dokumentation) dieses Quarkus-Plugin die Unterstützung für Servlets bietet.
    3. Wir entfernen die Abhängigkeit org.jboss.spec.javax.annotation:jboss-annotations-api_1.3_spec, da diese zusammen mit den gerade geänderten Abhängigkeiten geliefert wird.

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

Bitte beachten Sie, dass der obige Befehl mvn io.quarkus:quarkus-maven-plugin:0.23.2:create nicht nur die pom.xml ändert, sondern auch mehrere 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 das Ausführen von Maven-Projekten mit einer bestimmten Maven-Version, ohne diese Version installieren zu müssen.
  • Der Ordner docker (im Verzeichnis src/main/): Hier befinden sich Beispiel-Dockerfile-Dateien für den nativen und jvm Modus (neben 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 von Quarkus index.html (siehe dazu den Abschnitt Run the modernized helloworld).

Wir starten helloworld
Um die Anwendung zu testen, verwenden wir quarkus:dev, das Quarkus im Entwicklungsmodus startet (siehe dazu diesen Abschnitt im Handbuch über Entwicklungsmodus).

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

Wir führen jetzt den Befehl aus, um zu prüfen, wie dies funktioniert:

$ .\/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] Nichts zu kompilieren - alle Klassen sind auf dem neuesten Stand
[INFO]
[INFO] --- quarkus-maven-plugin:0.23.2:dev (default-cli) @ helloworld ---
Höre auf Transport dt_socket unter Adresse: 5005
INFO  [io.qua.dep.QuarkusAugmentor] Beginne mit der Quarkus-Augmentation
INFO  [org.jbo.threads] JBoss Threads Version 3.0.0.Final
ERROR [io.qua.dev.DevModeMain] Quarkus konnte nicht gestartet werden: java.lang.RuntimeException: io.quarkus.builder.BuildException: Buildfehler: Bau fehlgeschlagen wegen Fehlern
	[Fehler]: Der Build-Schritt io.quarkus.arc.deployment.ArcProcessor#validate warf eine Ausnahme: javax.enterprise.inject.spi.DeploymentException: javax.enterprise.inject.UnsatisfiedResolutionException: Unerfüllte Abhängigkeit für Typ org.jboss.as.quickstarts.helloworld.HelloService und Qualifikatoren [@Default]
	- Java-Mitglied: org.jboss.as.quickstarts.helloworld.HelloWorldServlet#helloService
	- deklariert auf CLASS-Bean [Typen=[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], Qualifikatoren=[@Default, @Any], Ziel=org.jboss.as.quickstarts.helloworld.HelloWorldServlet]
	bei io.quarkus.arc.processor.BeanDeployment.processErrors(BeanDeployment.java:841)
	bei io.quarkus.arc.processor.BeanDeployment.init(BeanDeployment.java:214)
	bei io.quarkus.arc.processor.BeanProcessor.initialize(BeanProcessor.java:106)
	bei io.quarkus.arc.deployment.ArcProcessor.validate(ArcProcessor.java:249)
	bei sun.reflect.NativeMethodAccessorImpl.invoke0(Native-Methode)
	bei sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	bei sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	bei java.lang.reflect.Method.invoke(Method.java:498)
	bei io.quarkus.deployment.ExtensionLoader$1.execute(ExtensionLoader.java:780)
	bei io.quarkus.builder.BuildContext.run(BuildContext.java:415)
	bei org.jboss.threads.ContextClassLoaderSavingRunnable.run(ContextClassLoaderSavingRunnable.java:35)
	bei org.jboss.threads.EnhancedQueueExecutor.safeRun(EnhancedQueueExecutor.java:2011)
	bei org.jboss.threads.EnhancedQueueExecutor$ThreadBody.doRunTask(EnhancedQueueExecutor.java:1535)
	bei org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1426)
	bei java.lang.Thread.run(Thread.java:748)
	bei org.jboss.threads.JBossThread.run(JBossThread.java:479)
Ursache: javax.enterprise.inject.UnsatisfiedResolutionException: Unerfüllte Abhängigkeit für Typ org.jboss.as.quickstarts.helloworld.HelloService und Qualifikatoren [@Default]
	- Java-Mitglied: org.jboss.as.quickstarts.helloworld.HelloWorldServlet#helloService
	- deklariert auf CLASS-Bean [Typen=[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], Qualifikatoren=[@Default, @Any], Ziel=org.jboss.as.quickstarts.helloworld.HelloWorldServlet]
	bei io.quarkus.arc.processor.Beans.resolveInjectionPoint(Beans.java:428)
	bei io.quarkus.arc.processor.BeanInfo.init(BeanInfo.java:371)
	bei io.quarkus.arc.processor.BeanDeployment.init(BeanDeployment.java:206)
	... 14 mehr

Also, es funktioniert nicht... Warum?

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

Jetzt ist es an der Zeit, zurückzukehren zu Dokumentation und zu lesen, wie es in Quarkus funktioniert Inject, und damit auch Contexts and Dependency Injection (CDI). Daher öffnen wir das Handbuch über Contexts and Dependency Injection und lesen im Abschnitt Bean Discovery : „Eine Bean-Klasse, die keine definierende Bean-Annotation hat, wird nicht gefunden.“

Wir schauen uns die Klasse HelloService an – tatsächlich hat sie keine solche Annotation. Daher muss diese hinzugefügt werden, damit Quarkus die Bean suchen und finden kann. Da es sich um ein stateless-Objekt handelt, können wir die Annotation @ApplicationScoped folgendermaßen 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 so machen:

import javax.enterprise.context.ApplicationScoped;

Wenn Sie sich nicht sicher sind, welchen Scope Sie verwenden sollen, wenn für die ursprüngliche Bean kein Scope festgelegt ist, studieren Sie die Dokumentation JSR 365: Contexts and Dependency Injection for Java 2.0—Standard-Scope.

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

$ .\/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] Changes detected - recompiling the module!
[INFO] Compiling 2 source files to \/home\/mrizzi\/git\/forked\/jboss-eap-quickstarts\/helloworld\/target\/classes
[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] (main) Beginning quarkus augmentation
INFO  [io.qua.dep.QuarkusAugmentor] (main) Quarkus augmentation completed in 576ms
INFO  [io.quarkus] (main) Quarkus 0.23.2 started in 1.083s. Listening on: http:\/\/0.0.0.0:8080
INFO  [io.quarkus] (main) Profile dev activated. Live Coding activated.
INFO  [io.quarkus] (main) Installed features: [cdi]

Jetzt läuft alles ohne Fehler.

Wir starten das modernisierte helloworld
Wie im Protokoll angegeben, öffnen wir im Browser 0.0.0.0:8080 (standard Quarkus-Startseite) und sehen Folgendes:

Quarkus: Modernisierung von Anwendungen am Beispiel von helloworld aus dem JBoss EAP Quickstart

Abb. 4. Quarkus dev-Startseite.

In der Annotation WebServlet hat diese Anwendung die folgende Kontextdefinition angegeben:

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

Gehen wir also im Browser zu 0.0.0.0:8080/HelloWorld und sehen Folgendes:

Quarkus: Modernisierung von Anwendungen am Beispiel von helloworld aus dem JBoss EAP Quickstart

Abb. 5: Die Quarkus-Entwicklungsseite für die Hello World-Anwendung.

Nun, es funktioniert alles.

Jetzt nehmen wir Änderungen am Code vor. Beachten Sie, dass der Befehl ./mvnw compile quarkus:dev weiterhin läuft, und wir haben nicht vor, ihn zu stoppen. Lassen Sie uns jetzt dieselben trivialen Änderungen im Code vornehmen und sehen, wie Quarkus das Leben für Entwickler 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 unten im Screenshot gezeigt:

Quarkus: Modernisierung von Anwendungen am Beispiel von helloworld aus dem JBoss EAP Quickstart

Abb. 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) Geänderte Quelldateien erkannt, wird neu kompiliert [/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 gestoppt in 0.003s
INFO  [io.qua.dep.QuarkusAugmentor] (vert.x-worker-thread-3) Quarkus-Augenaugmentierung beginnt
INFO  [io.qua.dep.QuarkusAugmentor] (vert.x-worker-thread-3) Quarkus-Augenaugmentierung abgeschlossen in 232ms
INFO  [io.quarkus] (vert.x-worker-thread-3) Quarkus 0.23.2 gestartet in 0.257s. Hört 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) Hot Replace Gesamtzeit: 0.371s

Das Aktualisieren der Seite hat die Änderungen im Quellcode erkannt, und Quarkus hat automatisch die Stop-Start-Prozedur durchgeführt. Und das alles geschah in nur 0.371 Sekunden (da ist sie, die „superschnelle subatomare Java“).

Wir führen den Build von helloworld in ein JAR-Paket durch.
Jetzt, wo der Code wie gewünscht funktioniert, verpacken wir ihn mit dem folgenden Befehl:

$ ./mvnw clean package

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

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

Wir starten helloworld, das in ein JAR gepackt ist.

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

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

Nachdem das alles abgeschlossen ist, rufen Sie im Browser 0.0.0.0:8080 auf und überprüfen Sie, ob alles funktioniert.

Wir bauen helloworld in eine native ausführbare Datei

Unser helloworld funktioniert also als eigenständige Java-Anwendung mit Quarkus-Abhängigkeiten. Aber wir können es noch weiterführen und 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.

2. Entpacken Sie das heruntergeladene Archiv:

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

3. Gehen Sie in den untar-Ordner.

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 Installationsanweisungen für andere Betriebssysteme finden Sie im Handbuch Building a Native Executable—Prerequisites.

Wir führen den Build von helloworld in eine native ausführbare Datei durch
Lesen Sie das Handbuch Building a Native Executable—Producing a native executable: „Lassen Sie uns nun eine native ausführbare Datei für unsere Anwendung erstellen, um die Startzeit und die Dateigröße zu reduzieren. Die ausführbare Datei enthält alles, was benötigt wird, um die Anwendung auszuführen, einschließlich der JVM (bzw. einer abgespeckten Version, die nur das Notwendige zur Ausführung der Anwendung enthält) und unsere Anwendung selbst.“

Um eine native ausführbare Datei zu erstellen, muss das native Maven-Profil aktiviert werden:

$ ./mvnw package -Pnative

Unser Build dauerte eine Minute und 10 Sekunden, und die endgültige Datei helloworld-runner wurde im Ordner /target erstellt.

Wir starten die native ausführbare Datei helloworld

Im vorherigen Schritt haben wir die ausführbare Datei /target/helloworld-runner erhalten. Lassen Sie sie uns jetzt starten:

$ ./target/helloworld--runner
INFO  [io.quarkus] (main) Quarkus 0.23.2 gestartet in 0.006s. Lauscht auf: http://0.0.0.0:8080
INFO  [io.quarkus] (main) Profil prod aktiviert.
INFO  [io.quarkus] (main) Installierte Features: [cdi]

Öffnen Sie erneut im Browser 0.0.0.0:8080 und überprüfen Sie, ob alles funktioniert.

Fortsetzung folgt!

Wir sind der Meinung, dass die in diesem Beitrag vorgestellte Methode zur Modernisierung von Java-Anwendungen unter Verwendung der Möglichkeiten von Quarkus aktiv im realen Leben angewendet werden sollte (auch wenn es sich nur um ein einfaches Beispiel handelt). Dabei werden Sie höchstwahrscheinlich auf eine Reihe von Problemen stoßen, deren Lösungen wir teilweise im nächsten Beitrag behandeln werden, in dem es darum geht, wie man den Speicherverbrauch zur Bewertung der Leistungsverbesserung misst, einem wichtigen Bestandteil des gesamten Modernisierungsprozesses von Anwendungen.

Quelle: habr.com

60GB SSD 8Gb DDR4