Quarkus: modernisering van toepassingen aan de hand van helloworld uit JBoss EAP Quickstart

Hallo iedereen op deze blog, en hier is de vierde post in de serie over Quarkus!

Quarkus: modernisering van toepassingen aan de hand van helloworld uit JBoss EAP Quickstart

De vorige post was over hoe Quarkus MicroProfile en Spring combineert. Laten we herinneren dat Quarkus het gepositioneerd is als "supersnelle subatomaire Java", ook wel "Kubernetes-georiƫnteerde Java-stack, geoptimaliseerd voor GraalVM en OpenJDK HotSpot en samengesteld uit de beste bibliotheken en standaarden". Vandaag laten we zien hoe we bestaande Java-applicaties kunnen moderniseren door gebruik te maken van de mogelijkheden van Quarkus, aan de hand van de helloworld-applicatie uit de Red Hat JBoss Enterprise Application Platform (JBoss EAP) Quickstart-repository, waar gebruik wordt gemaakt van de in Quarkus ondersteunde technologieƫn CDI en Servlet 3.

Het is belangrijk op te merken dat zowel Quarkus als JBoss EAP zich richten op het gebruik van tools die maximaal zijn gebouwd op basis van standaarden. Heb je geen applicatie die draait op JBoss EAP? Geen probleem, je kunt het gemakkelijk migreren van je huidige application server naar JBoss EAP met behulp van Red Hat Application Migration Toolkit. Daarna zal de definitieve en werkende versie van de gemoderniseerde code beschikbaar zijn in de repository github.com/mrizzi/jboss-eap-quickstarts/tree/quarkus, in de module helloworld.

Bij het schrijven van deze post zijn gebruikt gemaakt van de handleidingen voor Quarkus, voornamelijk Creating Your First Application en Building a Native Executable.

Krijg de code

Laten we beginnen met het maken van een lokale kloon van de repository JBoss EAP quickstarts:

$ git clone https://github.com/jboss-developer/jboss-eap-quickstarts.git
Cloning into 'jboss-eap-quickstarts'...
remote: Enumerating objects: 148133, done.
remote: Total 148133 (delta 0), reused 0 (delta 0), pack-reused 148133
Receiving objects: 100% (148133/148133), 59.90 MiB | 7.62 MiB/s, done.
Resolving deltas: 100% (66476/66476), done.
$ cd jboss-eap-quickstarts/helloworld/

Laten we kijken hoe de oorspronkelijke helloworld werkt

Eigenlijk is de essentie van deze applicatie duidelijk uit de titel, maar we gaan de code wetenschappelijk moderniseren. Daarom gaan we eerst naar deze applicatie in zijn oorspronkelijke vorm kijken.

Laten we helloworld opzetten

1. Open een terminal en ga naar de hoofdmap van JBoss EAP (je kunt het downloaden hier), dat wil zeggen naar de EAP_HOME-map.

2. Start de JBoss EAP-server met het standaardprofiel:

$ EAP_HOME/bin/standalone.sh

Opmerking: op Windows gebruik je het script EAP_HOMEbinstandalone.bat om te starten.

Na een paar seconden zou ongeveer het volgende in de log moeten verschijnen:

[org.jboss.as] (Controller Boot Thread) WFLYSRV0025: JBoss EAP 7.2.0.GA (WildFly Core 6.0.11.Final-redhat-00001) gestart in 3315ms - 306 van de 527 diensten gestart (321 diensten zijn lui, passief of op aanvraag)

3. Open in de browser 127.0.0.1:8080 en zie dit:

Quarkus: modernisering van toepassingen aan de hand van helloworld uit JBoss EAP Quickstart

Afbeelding 1. De startpagina van JBoss EAP.

4. Volg de instructies in de handleiding Build and Deploy the Quickstart: we draaien helloworld op en voeren (uit de hoofdmap van het project) de volgende opdracht uit:

$ mvn clean install wildfly:deploy

Na het succesvol uitvoeren van deze opdracht zullen we ongeveer het volgende in het log zien:

[INFO] ------------------------------------------------------------------------ 
[INFO] BOUW SUCCES 
[INFO] ------------------------------------------------------------------------ 
[INFO] Totale tijd: 8.224 s

Dus, de eerste implementatie van de helloworld-applicatie op JBoss EAP kostte iets meer dan 8 seconden.

We testen helloworld

Door strikt de instructies te volgen Toegang tot de applicatie, openen we in de browser 127.0.0.1:8080/helloworld en zien we het volgende:

Quarkus: modernisering van toepassingen aan de hand van helloworld uit JBoss EAP Quickstart

Figuur 2. De originele Hello World uit JBoss EAP.

We brengen wijzigingen aan

We veranderen de invoerparameter createHelloMessage(String name) van World naar Marco:

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

We voeren opnieuw de volgende opdracht uit:

$ mvn clean install wildfly:deploy

Daarna verversen we de pagina in de browser en zien we dat de tekst is gewijzigd:

Quarkus: modernisering van toepassingen aan de hand van helloworld uit JBoss EAP Quickstart

Figuur 3. Hello Marco in JBoss EAP.

We rollen de implementatie van helloworld terug en beƫindigen JBoss EAP

Dit is niet verplicht, maar als je de implementatie wilt annuleren, kun je dat doen met de volgende opdracht:

$ mvn clean install wildfly:undeploy

Om een instantie van JBoss EAP te beƫindigen, druk gewoon op Ctrl+C in het terminalvenster.

We moderniseren helloworld

Laten we nu beginnen met het moderniseren van de oorspronkelijke helloworld-applicatie.

We maken een nieuwe tak aan

We maken een nieuwe werkbranch aan nadat het project quickstart is voltooid:

$ git checkout -b quarkus 7.2.0.GA

We wijzigen het bestand pom.xml

We beginnen met het wijzigen van de applicatie met het bestand pom.xml. Om ervoor te zorgen dat Quarkus XML-blokken kan invoegen, voeren we de volgende opdracht uit in de map helloworld:

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

Bij het schrijven van dit artikel werd versie 0.23.2 gebruikt. Quarkus brengt vaak nieuwe versies uit, je kunt vinden welke versie de laatste is op de website github.com/quarkusio/quarkus/releases/latest.

De bovenstaande opdracht zal de volgende elementen in pom.xml invoegen:

  • De eigenschap , die de gebruikte versie van Quarkus instelt.
  • Het blok voor de import van Quarkus BOM (bill of materials), zodat je de versie niet voor elke Quarkus-afhankelijkheid hoeft toe te voegen.
  • De plugin quarkus-maven-plugin, die verantwoordelijk is voor het verpakken van de applicatie en ontwikkeling in de ontwikkelingsmodus biedt.
  • Native profiel voor het maken van uitvoerbare bestanden van de applicatie.

Bovendien maken we handmatig de volgende wijzigingen in pom.xml:

  1. We verplaatsen de tag uit het blok en plaatsen deze boven de tag . Aangezien we in de volgende stap het blok verwijderen, is het nodig om te behouden.
  2. We verwijderen de <parent>-tag, omdat deze applicatie geen ouder pom van JBoss meer nodig heeft bij het werken met Quarkus.
  3. We voegen de <version>-tag toe en plaatsen deze onder de <artifactId>-tag. Het versienummer kan elke gewenste waarde hebben.
  4. We verwijderen de <packaging>-tag, omdat deze applicatie geen WAR meer is, maar een gewone JAR.
  5. We wijzigen de volgende afhankelijkheden:
    1. We veranderen de afhankelijkheid javax.enterprise:cdi-api in io.quarkus:quarkus-arc, waarbij we <scope>provided<\/scope> verwijderen, omdat deze Quarkus-extensie (volgens de documentatie) zorgt voor CDI dependency injection.
    2. We veranderen de afhankelijkheid org.jboss.spec.javax.servlet:jboss-servlet-api_4.0_spec in io.quarkus:quarkus-undertow, waarbij we <scope>provided<\/scope> verwijderen, omdat deze Quarkus-extensie (volgens de documentatie) ondersteuning biedt voor servlets.
    3. We verwijderen de afhankelijkheid org.jboss.spec.javax.annotation:jboss-annotations-api_1.3_spec, omdat deze wordt meegeleverd met de afhankelijkheden die we net hebben veranderd.

De versie van het pom.xml-bestand met alle wijzigingen bevindt zich op github.com/mrizzi/jboss-eap-quickstarts/blob/quarkus/helloworld/pom.xml.

Let op dat de bovenstaande opdracht mvn io.quarkus:quarkus-maven-plugin:0.23.2:create niet alleen het pom.xml-bestand verandert, maar ook een aantal componenten aan het project toevoegt, namelijk de volgende bestanden en mappen:

  • Bestand mvnw en mvnw.cmd en map .mvn: de Maven Wrapper stelt je in staat om Maven-projecten van een bepaalde versie uit te voeren zonder deze versie zelf te installeren.
  • Map docker (in de catalogus src/main/): hier bevinden zich voorbeeldbestanden Dockerfile voor de modes native en jvm (samen met het .dockerignore-bestand).
  • Map resources (in de catalogus src/main/): hier ligt een leeg bestand application.properties en een voorbeeld van de startpagina Quarkus index.html (zie meer in Run the modernized helloworld).

We starten helloworld
Om de applicatie te testen, gebruiken we quarkus:dev, dat Quarkus in de ontwikkelingsmodus uitvoert (zie meer in deze sectie van de gids over De ontwikkelingsmodus).

Opmerking: Deze stap zal zoals verwacht leiden tot een fout, aangezien we nog niet alle noodzakelijke wijzigingen hebben aangebracht.

Nu voeren we de opdracht uit om te controleren hoe dit zal werken:

$ ./mvnw compile quarkus:dev
[INFO] Projecten aan het scannen...
[INFO]
[INFO] ----------------< org.jboss.eap.quickstarts:helloworld >----------------
[INFO] Quickstart bouwen: helloworld quarkus
[INFO] --------------------------------[ war ]---------------------------------
[INFO]
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ helloworld ---
[INFO] 'UTF-8' encoding gebruikt om gefilterde middelen te kopiƫren.
[INFO] 2 middelen kopiƫren
[INFO]
[INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ helloworld ---
[INFO] Niets te compileren - alle klassen zijn up-to-date
[INFO]
[INFO] --- quarkus-maven-plugin:0.23.2:dev (default-cli) @ helloworld ---
Luisteren naar transport dt_socket op adres: 5005
INFO  [io.qua.dep.QuarkusAugmentor] Begin met quarkus-vergroting
INFO  [org.jbo.threads] JBoss Threads versie 3.0.0.Final
ERROR [io.qua.dev.DevModeMain] Kon quarkus niet starten: java.lang.RuntimeException: io.quarkus.builder.BuildException: Bouwfout: Bouw mislukt door fouten
	[error]: Bouwstap io.quarkus.arc.deployment.ArcProcessor#validate gooide een uitzondering: javax.enterprise.inject.spi.DeploymentException: javax.enterprise.inject.UnsatisfiedResolutionException: Onvervulde afhankelijkheid voor type org.jboss.as.quickstarts.helloworld.HelloService en kwalificaties [@Default]
	- java lid: org.jboss.as.quickstarts.helloworld.HelloWorldServlet#helloService
	- gedeclareerd op 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], kwalificaties=[@Default, @Any], doel=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)
Veroorzaakt door: javax.enterprise.inject.UnsatisfiedResolutionException: Onvervulde afhankelijkheid voor type org.jboss.as.quickstarts.helloworld.HelloService en kwalificaties [@Default]
	- java lid: org.jboss.as.quickstarts.helloworld.HelloWorldServlet#helloService
	- gedeclareerd op 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], kwalificaties=[@Default, @Any], doel=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 meer

Dus, het werkt niet... Waarom?

De uitzondering UnsatisfiedResolutionException verwijst naar de klasse HelloService, die een lid is van de klasse HelloWorldServlet (java lid: org.jboss.as.quickstarts.helloworld.HelloWorldServlet#helloService). Het probleem is dat HelloWorldServlet een geĆÆnjecteerde instantie van HelloService nodig heeft, maar deze kan niet worden gevonden (hoewel beide klassen zich in hetzelfde pakket bevinden).

Het is tijd om terug te keren naar de documentatie en te lezen hoe Injectwerkt in Quarkus, en dus ook Contexts and Dependency Injection (CDI). Daarom openen we de handleiding voor Contexts and Dependency Injection en lezen we in de sectie Bean Discovery : ā€˜Een bean-klasse zonder een definiĆ«rende bean-annotatie wordt niet gezocht’.

Laten we de klasse HelloService bekijken - daar ontbreekt inderdaad zo’n annotatie. Daarom moeten we deze toevoegen, zodat Quarkus de bean kan zoeken en vinden. En aangezien dit een stateless-object is, kunnen we de annotatie @ApplicationScoped op de volgende manier toevoegen:

@ApplicationScoped
public class HelloService {

Opmerking: hier kan de ontwikkelomgeving je vragen om het vereiste pakket toe te voegen (zie de regel hieronder), en dit moet je handmatig doen, zo:

import javax.enterprise.context.ApplicationScoped;

Als je twijfelt welke scope je moet gebruiken als de oorspronkelijke bean helemaal geen scope heeft opgegeven, bestudeer dan de documentatie JSR 365: Contexts and Dependency Injection for Java 2.0—Standaard scope.

Probeer nu weer de applicatie te starten met de opdracht .\mvnw compile quarkus:dev:

$ .\mvnw compile quarkus:dev
[INFO] Projecten scannen...
[INFO]
[INFO] ----------------< org.jboss.eap.quickstarts:helloworld >----------------
[INFO] Quickstart bouwen: helloworld quarkus
[INFO] --------------------------------[ war ]---------------------------------
[INFO]
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ helloworld ---
[INFO] Gebruik 'UTF-8' codering om gefilterde bronnen te kopiƫren.
[INFO] 2 bronnen kopiƫren
[INFO]
[INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ helloworld ---
[INFO] Wijzigingen gedetecteerd - het module opnieuw compileren!
[INFO] 2 source-bestanden compileren naar /home/mrizzi/git/forked/jboss-eap-quickstarts/helloworld/target/classes
[INFO]
[INFO] --- quarkus-maven-plugin:0.23.2:dev (default-cli) @ helloworld ---
Luistert naar transport dt_socket op adres: 5005
INFO  [io.qua.dep.QuarkusAugmentor] (main) Begin quarkus-augmentatie
INFO  [io.qua.dep.QuarkusAugmentor] (main) Quarkus-augmentatie voltooid in 576ms
INFO  [io.quarkus] (main) Quarkus 0.23.2 gestart in 1.083s. Luistert op: http://0.0.0.0:8080
INFO  [io.quarkus] (main) Profiel dev geactiveerd. Live Coding geactiveerd.
INFO  [io.quarkus] (main) GeĆÆnstalleerde functies: [cdi]

Nu verloopt alles zonder fouten.

We starten de gemoderniseerde helloworld
Zoals in de log is vermeld, openen we in de browser 0.0.0.0:8080 (de standaard startpagina van Quarkus) en zien het volgende:

Quarkus: modernisering van toepassingen aan de hand van helloworld uit JBoss EAP Quickstart

Figuur 4. Startpagina van Quarkus dev.

In de annotatie WebServlet van deze applicatie is het volgende contextdefinitie opgenomen:

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

Daarom gaan we in de browser naar 0.0.0.0:8080/HelloWorld en zien we het volgende:

Quarkus: modernisering van toepassingen aan de hand van helloworld uit JBoss EAP Quickstart

Figuur 5: De Quarkus dev-pagina voor de Hello World-applicatie.

En daar gaan we, alles werkt.

Nu gaan we wijzigingen in de code aanbrengen. Let op, het commando ./mvnw compile quarkus:dev werkt nog steeds, en we zijn niet van plan het te stoppen. Laten we proberen dezelfde - uiterst triviale - wijzigingen op de code toe te passen en zien hoe Quarkus het leven van de ontwikkelaar vergemakkelijkt:

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

We slaan het bestand op en vernieuwen vervolgens de webpagina om de tekst Hello Marco te zien, zoals weergegeven in de onderstaande screenshot:

Quarkus: modernisering van toepassingen aan de hand van helloworld uit JBoss EAP Quickstart

Figuur 6: De Hello Marco-pagina in Quarkus dev.

Laten we nu de uitvoer in de terminal controleren:

INFO  [io.qua.dev] (vert.x-worker-thread-3) Gewijzigde bronbestanden gedetecteerd, opnieuw compileren [/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 gestopt in 0.003s
INFO  [io.qua.dep.QuarkusAugmentor] (vert.x-worker-thread-3) Quarkus-augmentatie begint
INFO  [io.qua.dep.QuarkusAugmentor] (vert.x-worker-thread-3) Quarkus-augmentatie voltooid in 232ms
INFO  [io.quarkus] (vert.x-worker-thread-3) Quarkus 0.23.2 gestart in 0.257s. Luistert op: http://0.0.0.0:8080
INFO  [io.quarkus] (vert.x-worker-thread-3) Profiel dev geactiveerd. Live Coding geactiveerd.
INFO  [io.quarkus] (vert.x-worker-thread-3) GeĆÆnstalleerde functies: [cdi]
INFO  [io.qua.dev] (vert.x-worker-thread-3) Hot replace totale tijd: 0.371s

Het vernieuwen van de pagina heeft de detectie van wijzigingen in de broncode getriggerd, en Quarkus heeft automatisch de 'stop-start' procedure uitgevoerd. En dat alles gebeurde in slechts 0.371 seconden (hier is het, de zogenaamde 'supersnelle subatomaire Java').

We bouwen helloworld in een JAR-pakket
Nu de code werkt zoals het hoort, verpakken we het met de volgende opdracht:

$ ./mvnw clean package

Deze opdracht creĆ«ert twee JAR-bestanden in de map /target: het bestand helloworld-.jar, dat het standaard artifact is dat door de Maven-opdracht is opgebouwd, samen met de klassen en resources van het project. En het bestand helloworld—runner.jar, dat een uitvoerbare JAR is.

Let op, dit is geen uber-jar, aangezien alle afhankelijkheden gewoon naar de map /target/lib zijn gekopieerd (en niet in het JAR-bestand zijn verpakt). Dus om deze JAR vanuit een andere map of op een andere host uit te voeren, moet je zowel het JAR-bestand zelf als de map /lib kopiĆ«ren, waarbij je in gedachten houdt dat het element Class-Path in het MANIFEST.MF-bestand van het JAR-pakket een expliciete opsomming van de JAR’s uit de lib-map bevat.
Om te leren hoe je uber-jars maakt, raadpleeg de handleiding Uber-Jar Creatie.

We starten helloworld, verpakt in een JAR

Nu kunnen we onze JAR uitvoeren met het standaardcommando java:

$ java -jar ./target/helloworld--runner.jar
INFO  [io.quarkus] (main) Quarkus 0.23.2 gestart in 0.673s. Luisterend op: http://0.0.0.0:8080
INFO  [io.quarkus] (main) Profielfunctie prod geactiveerd.
INFO  [io.quarkus] (main) GeĆÆnstalleerde functies: [cdi]

Nadat alles is uitgevoerd, gaat u in de browser naar 0.0.0.0:8080 en controleer of alles werkt zoals het hoort.

We bouwen helloworld naar een native uitvoerbaar bestand

Dus, onze helloworld werkt nu als een standalone Java-toepassing met gebruik van Quarkus-afhankelijkheden. Maar we kunnen verder gaan en het omvormen tot een native uitvoerbaar bestand.

GraalVM installeren
Voordat we beginnen, moeten we de nodige tools installeren:

1. Download GraalVM 19.2.0.1 van github.com/oracle/graal/releases/tag/vm-19.2.0.1.

2. Pak het gedownloade archief uit:

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

3. Ga naar de untar-map.

4. Voer de onderstaande opdracht uit om het native-image te downloaden en toe te voegen:

$ ./bin/gu install native-image

5. Voeg de map die in stap 2 is gemaakt toe aan de omgevingsvariabele GRAALVM_HOME:

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

Meer informatie en installatie-instructies voor andere besturingssystemen zijn te vinden in de handleiding Building a Native Executable—Prerequisites.

We bouwen helloworld naar een native uitvoerbaar bestand
Lees de handleiding Building a Native Executable—Producing a native executable: "Laten we nu een native uitvoerbaar bestand voor onze toepassing creĆ«ren, om de opstarttijd en de schijfgrootte te verkorten. Het uitvoerbare bestand zal alles bevatten wat nodig is om de toepassing uit te voeren, inclusief de JVM-machine (meer bepaald een ingekorte versie die alleen datgene bevat wat nodig is om de toepassing uit te voeren) en onze toepassing zelf."

Om een native uitvoerbaar bestand te maken, moeten we het native-profiel van Maven inschakelen:

$ ./mvnw package -Pnative

Onze build duurde ƩƩn minuut en 10 seconden, en het eindresultaat helloworld-runner werd aangemaakt in de map /target.

We starten het native uitvoerbare bestand helloworld

In de vorige stap hebben we het uitvoerbare bestand /target/helloworld-runner verkregen. Laten we het nu uitvoeren:

$ ./target/helloworld--runner
INFO  [io.quarkus] (main) Quarkus 0.23.2 gestart in 0.006s. Luisterend op: http://0.0.0.0:8080
INFO  [io.quarkus] (main) Profielfunctie prod geactiveerd.
INFO  [io.quarkus] (main) GeĆÆnstalleerde functies: [cdi]

Laten we opnieuw in de browser openen 0.0.0.0:8080 en controleren of alles werkt zoals het hoort.

Wordt vervolgd!

Wij geloven dat de in deze post besproken (zelfs aan de hand van een eenvoudig voorbeeld) methode voor het moderniseren van Java-toepassingen met de mogelijkheden van Quarkus, actief toegepast moet worden in de praktijk. U zult waarschijnlijk tegen verschillende problemen aanlopen, waarvan we er enkele gedeeltelijk zullen behandelen in de volgende post, waarin we het zullen hebben over hoe het geheugengebruik te meten om de prestatieverbetering te beoordelen, een belangrijk onderdeel van het hele proces van modernisering van toepassingen.

Bron: habr.com

Koop betrouwbare webhosting met bescherming tegen DDoS, VPS VDS servers šŸ”„ Koop betrouwbare webhosting met bescherming tegen DDoS, VPS VDS servers | ProHoster