Tere kÔigile sellel blogis ja siin on neljas postitus Quarkuse sarjast!

teema oli see, kuidas Quarkus ĂŒhendab MicroProfileâi ja Springi. Meenutame, et positsioneeritakse kui "ĂŒlikiire subaatomaarne Java", see on "Kubernetes-centriline Java-pesa, mis on kohandatud GraalVM-i ja OpenJDK HotSpot'i, ning kogutud parimatest raamatukogudest ja standarditest". TĂ€na nĂ€itame, kuidas uuendada juba olemasolevaid Java-rakendusi, kasutades Quarkuse funktsioone, jĂ€rgmise nĂ€ite abil , kus kasutatakse Quarkuses toetatud tehnoloogiaid CDI ja Servlet 3.
Siin on oluline mÀrkida, et nii Quarkus kui ka JBoss EAP keskenduvad tööriistadele, mis on maksimaalselt pÔhinenud standarditel. Kas teie rakendus ei tööta JBoss EAP-l? Pole probleemi, seda saab hÔlpsasti migreerida praeguselt rakendusserverilt JBoss EAP-le kasutades . PÀrast seda on lÔplik ja töötav versioon moderniseeritud koodist saadaval hoidlas , moodulis .
Selle postituse kirjutamisel kasutati , peamiselt ja .
Native Executable
Saame koodi :
$ git clone https://github.com/jboss-developer/jboss-eap-quickstarts.git
Kloonimine '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/
Vaadake, kuidas originaal helloworld töötab
Oma olemuselt on selle rakenduse sisu nimest arusaadav, kuid me uuendame selle koodi rangelt teaduslikult. SeetÔttu vaatame esmalt seda rakendust selle algses vormis.
KĂ€ivitame helloworldi
1. Avage terminal ja minge JBoss EAP kausta juure, kuhu selle alla laadida ), st EAP_HOME kausta.
2. KĂ€ivitage JBoss EAP server vaikimisi profiiliga:
$ EAP_HOME/bin/standalone.sh
MĂ€rkus: Windowsi puhul kasutage skripti EAP_HOMEbinstandalone.bat.
MÔne sekundi pÀrast peaks logis ilmuma umbes midagi sellist:
[org.jboss.as] (Controller Boot Thread) WFLYSRV0025: JBoss EAP 7.2.0.GA (WildFly Core 6.0.11.Final-redhat-00001) kÀivitatud 3315ms - KÀivitati 306 527 teenust (321 teenust on laisk, passiivne vÔi nÔudmisel)
3. Avage brauseris :8080 ja nÀete seda:

Joon. 1. JBoss EAP avaleht.
4. JÀrgige juhendites olevaid juhiseid : kÀivitame helloworld ja tÀidame (projekti juurkataloogis) jÀrgmise kÀskluse:
$ mvn clean install wildfly:deploy
Kuna see kÀsklus on edukalt tÀidetud, nÀeme logis umbes jÀrgmist:
[INFO] ------------------------------------------------------------------------
[INFO] EHITUS ĂNNESTUS
[INFO] ------------------------------------------------------------------------
[INFO] Kokku vÔetud aeg: 8.224 s
Seega kestis helloworld rakenduse esmane juurutamine JBoss EAP-s natuke ĂŒle 8 sekundi.
Testime helloworld
JÀrgides tÀpselt juhiseid , avame brauseris :8080/helloworld ja nÀeme jÀrgmist:

Joonis 2. Algne Hello World JBoss EAP-st.
Teeme muudatusi
Muudame sisendparameetri createHelloMessage(String name) World aga Marco-ks:
writer.println("<h1>" + helloService.createHelloMessage("Marco") + "</h1>");
Uuesti tÀidame jÀrgmise kÀskluse:
$ mvn clean install wildfly:deploy
SeejÀrel vÀrskendame brauseri lehte ja nÀeme, et tekst on muutunud:

Joonis 3. Hello Marco JBoss EAP-s.
TĂŒhistame helloworld juurutamise ja lĂ”petame JBoss EAP töö
See ei ole kohustuslik, kuid kui soovite juurutamist tĂŒhistada, siis saate seda teha jĂ€rgmise kĂ€sklusega:
$ mvn clean install wildfly:undeploy
JBoss EAP eksemplari lÔpetamiseks vajutage lihtsalt Ctrl+C terminaliaknas.
Uuendame helloworld
NĂŒĂŒd tegeleme algse helloworld rakenduse uuendamisega.
Loome uue haru
Loome uue tööharu pÀrast quickstart projekti tÀitmist:
$ git checkout -b quarkus 7.2.0.GA
Muudame faili pom.xml
Rakenduse muutmise alustame failist pom.xml. Et Quarkus saaks sinna lisada XML-bloke, tÀidame jÀrgmise kÀskluse helloworld kataloogis:
$ mvn io.quarkus:quarkus-maven-plugin:0.23.2:create
KĂ€esoleva artikli kirjutamise ajal kasutati versiooni 0.23.2. Quarkusel ilmub sageli uusi versioone, viimase versiooni leidmiseks kĂŒlastage .
Ălaltoodud kĂ€sk lisab pom.xml jĂ€rgmised elemendid:
- Omadus , mis mÀÀrab kasutatava Quarkus versiooni.
- Block Quarkus BOM-i (materjalide arve) importimiseks, et iga Quarkus sÔltuvuse jaoks versiooni juurde ei lisataks.
- quarkus-maven-plugin, mis vastutab rakenduse pakkimise ja arendusreĆŸiimi pakkumise eest.
- Native profiil rakenduse kÀivitatavate failide loomiseks.
Lisaks viime pom.xml faili kÀsitsi sisse jÀrgmised muudatused:
- TÔmbame sildi plokist vÀlja ja asetame selle sildi kohale. Kuna jÀrgmises etapis eemaldame ploki , tuleb sÀilitada.
- Eemaldame bloki , kuna selle rakenduse jaoks ei ole Quarkusega enam vajalik JBossi vanem pom.
- Lisame sildi ja asetame selle sildi alla. Versiooni numbri vÔite mÀÀrata, nagu soovite.
- Eemaldame sildi , kuna see rakendus ei ole enam WAR, vaid tavaline JAR.
- Muudame jÀrgmisi sÔltuvusi:
- Vahetame sĂ”ltuvuse javax.enterprise:cdi-api io.quarkus:quarkus-arc vastu, eemaldades provided, kuna (vastavalt dokumentatsioonile) see Quarkus-i laiendus tagab CDI sĂ”ltuvuse sĂŒstimise.
- Vahetame sÔltuvuse org.jboss.spec.javax.servlet:jboss-servlet-api_4.0_spec io.quarkus:quarkus-undertow vastu, eemaldades provided, kuna (vastavalt dokumentatsioonile) see Quarkus-i laiendus tagab Servletide toe.
- Eemaldame sÔltuvuse org.jboss.spec.javax.annotation:jboss-annotations-api_1.3_spec, kuna see on kaasas sÔltuvustega, mida just muutsime.
Muudetud pom.xml faili versioon on saadaval aadressil .
Pange tĂ€hele, et ĂŒlaltoodud kĂ€sk mvn io.quarkus:quarkus-maven-plugin:0.23.2:create ei muudab mitte ainult pom.xml faili, vaid lisab projekti hulga komponente, nimelt jĂ€rgmised failid ja kaustad:
- Fail mvnw ja mvnw.cmd ning kaust .mvn: Maven Wrapper vÔimaldab teil kÀivitada Maven projekte mÀÀratud versiooniga ilma selle versiooni installimiseta.
- Kaust docker (kaustas src/main/): siin on nĂ€idis Dockerfile faile native ja jvm reĆŸiimide jaoks (koos faili .dockerignore).
- Kaust resources (kaustas src/main/): siin on tĂŒhi fail application.properties ja nĂ€idis Quarkus'i stardileht index.html (ĂŒlaltoodu kohta, vaata Run the modernized helloworld ).
KĂ€ivitame helloworld
Rakenduse testimiseks kasutame quarkus:dev, mis kĂ€ivitab Quarkuse arendusreĆŸiimis (ĂŒlaltoodud, vaata seda jaotist juhendis ).
MÀrkus: see samm toob oodatult kaasa vea, kuna me ei ole veel kÔik vajalikud muudatused teinud.
NĂŒĂŒd kĂ€ivitame kĂ€su, et kontrollida, kuidas see töötab:
$ ./mvnw compile quarkus:dev
[INFO] Otsitakse projekte...
[INFO]
[INFO] ----------------< org.jboss.eap.quickstarts:helloworld >----------------
[INFO] Ehitatakse Quickstart: helloworld quarkus
[INFO] --------------------------------[ war ]---------------------------------
[INFO]
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ helloworld ---
[INFO] Kasutatakse 'UTF-8' kodeeringut filtreeritud ressursside kopeerimiseks.
[INFO] Kopeeritakse 2 ressursi
[INFO]
[INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ helloworld ---
[INFO] Midagi pole kompileerida - kÔik klassid on ajakohased
[INFO]
[INFO] --- quarkus-maven-plugin:0.23.2:dev (default-cli) @ helloworld ---
Oodatakse transport dt_socket aadressil: 5005
INFO [io.qua.dep.QuarkusAugmentor] Algab quarkus'i tÀiendamine
INFO [org.jbo.threads] JBoss Threads versioon 3.0.0.Final
ERROR [io.qua.dev.DevModeMain] Quarkus'i kÀivitamine ebaÔnnestus: java.lang.RuntimeException: io.quarkus.builder.BuildException: Ehitus ebaÔnnestus: Ehitus ebaÔnnestus vigade tÔttu
[error]: Ehitus etapp io.quarkus.arc.deployment.ArcProcessor#validate viskas erandi: javax.enterprise.inject.spi.DeploymentException: javax.enterprise.inject.UnsatisfiedResolutionException: Rahuldamata sĂ”ltuvus tĂŒĂŒbi org.jboss.as.quickstarts.helloworld.HelloService ja kvalifikaatorite [@Default]
- java liik: org.jboss.as.quickstarts.helloworld.HelloWorldServlet#helloService
- deklareeritud KLASI bean'il [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)
PĂ”hjus: javax.enterprise.inject.UnsatisfiedResolutionException: Rahuldamata sĂ”ltuvus tĂŒĂŒbi org.jboss.as.quickstarts.helloworld.HelloService ja kvalifikaatorite [@Default]
- java liik: org.jboss.as.quickstarts.helloworld.HelloWorldServlet#helloService
- deklareeritud KLASI bean'il [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 rohkem
Nii, ei tööta... Aga miks?
UnsatisfiedResolutionException nĂ€itab klassi HelloService, mis on osa klassist HelloWorldServlet (java liikmed: org.jboss.as.quickstarts.helloworld.HelloWorldServlet#helloService). Probleem on selles, et HelloWorldServlet vajab sĂŒstimist HelloService'i eksemplarist, kuid seda ei leita (kuigi mĂ”lemad klassid asuvad samas paketis).
On aeg tagasi pöörduda ja lugeda, kuidas Quarkuses töötab , seega ka (CDI). SeetĂ”ttu avame Kontekstid ja SĂ”ltuvuse SĂŒstimise juhendi ja jaotises loeme: «Bean-i klass, millel ei ole mÀÀravat bean-annotatsiooni, ei otsita.»
Vaadake klassi HelloService â selles tĂ”epoolest ei ole sellist annotatsiooni. Seega tuleb see lisada, et Quarkus saaks bean'i otsida ja leida. Ja kuna see on stateless objekt, saame me kĂŒll lisada annotatsiooni @ApplicationScoped jĂ€rgmiselt:
@ApplicationScoped
public class HelloService {
MÀrkus: siin vÔib arenduskeskkond paluda teil lisada nÔutav pakett (vt allolevat rida), ja see tuleb kÀsitsi teha, nagu nii:
import javax.enterprise.context.ApplicationScoped;
Kui te kahtlete, millist ulatust tuleks kasutada juhul, kui algse bean'i ulatus ei ole ĂŒldse mÀÀratud, uurige dokumentatsiooni .
NĂŒĂŒd proovime uuesti kĂ€ivitada rakendust kĂ€suga .\/mvnw compile quarkus:dev:
$ .\/mvnw compile quarkus:dev
[INFO] Otsin projekte...
[INFO]
[INFO] ----------------< org.jboss.eap.quickstarts:helloworld >----------------
[INFO] Ehitan Quickstart: helloworld quarkus
[INFO] --------------------------------[ war ]---------------------------------
[INFO]
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ helloworld ---
[INFO] Kasutatakse 'UTF-8' kodeeringut filtreeritud ressursside kopeerimiseks.
[INFO] Kopeerin 2 ressurssi
[INFO]
[INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ helloworld ---
[INFO] Tuletatud muudatused - kompileerin mooduli uuesti!
[INFO] Kompileerimine 2 allika faili jaoks /home/mrizzi/git/forked/jboss-eap-quickstarts/helloworld/target/classes
[INFO]
[INFO] --- quarkus-maven-plugin:0.23.2:dev (default-cli) @ helloworld ---
Kuulan transpordi dt_socket aadressil: 5005
INFO [io.qua.dep.QuarkusAugmentor] (peamine) Algab quarkus augmentatsioon
INFO [io.qua.dep.QuarkusAugmentor] (peamine) Quarkuse augmentatsioon lÔpetatud 576ms jooksul
INFO [io.quarkus] (peamine) Quarkus 0.23.2 kÀivitatud 1.083s jooksul. Kuulab aadressil: http:\/\/0.0.0.0:8080
INFO [io.quarkus] (peamine) Profiil dev aktiveeritud. Elav kodeerimine aktiveeritud.
INFO [io.quarkus] (peamine) Installitud funktsioonid: [cdi]
NĂŒĂŒd lĂ€heb kĂ”ik veatult.
KĂ€ivitage uuendatud helloworld
Nagu logis öeldud, avame brauseris :8080 (Quarkuse vaikimisi algusleht) ja nÀeme jÀrgmist:

Joon. 4. Quarkuse arengu algusleht.
Selles rakenduses on annotatsioonis WebServlet jÀrgmine konteksti mÀÀratlemine:
@WebServlet("\/HelloWorld")
public class HelloWorldServlet extends HttpServlet {
SeetÔttu lÀheme brauseris aadressile :8080/HelloWorld ja nÀeme jÀrgmist:

Joonis 5: The Quarkus dev leht Hello World rakenduse jaoks.
Noh, kÔik töötab.
NĂŒĂŒd teeme koodis muudatusi. Pange tĂ€hele, et kĂ€sk ./mvnw compile quarkus:dev töötab endiselt ja me ei kavatse seda peatada. NĂŒĂŒd proovime teha samu â ÀÀretult lihtsaid â muudatusi koodis ja vaatame, kuidas Quarkus arendaja elu lihtsamaks teeb:
writer.println("<h1>" + helloService.createHelloMessage("Marco") + "</h1>");
Salvestame faili ja seejÀrel vÀrskendame veebilehte, et nÀha kirjutist Hello Marco, nagu on nÀidatud alloleval ekraanipildil:

Joonis 6. Leht Hello Marco Quarkus dev-is.
NĂŒĂŒd kontrollime vĂ€ljundit terminalis:
INFO [io.qua.dev] (vert.x-worker-thread-3) Muudetud allika faile tuvastatud, kompileerimine [ /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 peatatud 0.003s
INFO [io.qua.dep.QuarkusAugmentor] (vert.x-worker-thread-3) Alustatakse quarkus peensuse suurendamist
INFO [io.qua.dep.QuarkusAugmentor] (vert.x-worker-thread-3) Quarkus peensuse suurendamine lÔpetatud 232ms
INFO [io.quarkus] (vert.x-worker-thread-3) Quarkus 0.23.2 kÀivitatud 0.257s. Kuulab aadressil: http://0.0.0.0:8080
INFO [io.quarkus] (vert.x-worker-thread-3) Profiil dev aktiveeritud. Elav kodeerimine aktiveeritud.
INFO [io.quarkus] (vert.x-worker-thread-3) Paigaldatud funktsioonid: [cdi]
INFO [io.qua.dev] (vert.x-worker-thread-3) Kuum asendamise koguaeg: 0.371s
Lehe vÀrskendamine kÀivitas allika koodi muudatuste tuvastamise ja Quarkus sooritas automaatselt protseduuri "peatamine-alustamine". Ja kÔik see toimus vaid 0.371 sekundi jooksul (see ongi see "superkiire subaatomaarne Java").
Kogume helloworld paketti JAR-iks
NĂŒĂŒd, kui kood töötab nagu peab, pakime selle jĂ€rgmise kĂ€suga:
$ ./mvnw clean package
See kĂ€sk loob kaks JAR-faili kaustas /target: fail helloworld-.jar, mis on standardne artefakt, mis on loodud Maven-kĂ€suga koos projektide klasside ja ressurssidega. Ja fail helloworldârunner.jar, mis on kĂ€ivitatav JAR.
Pange tÀhele, et see ei ole uber-jar, kuna kÔik sÔltuvused on lihtsalt kopeeritud kausta /target/lib (mitte pakitud JAR-faili). SeetÔttu, et kÀivitada see JAR mujalt kaustast vÔi muul hostil, tuleb seal kopeerida nii JAR-fail kui ka kaust /lib, arvestades, et Class-Path element failis MANIFEST.MF JAR-pakendis sisaldab selget nimekirja JAR-idest kaustast lib.
Kuidas luua uber-jar rakendusi, vaata juhendist .
KĂ€ivitame helloworld, mis on pakitud JAR-iks
NĂŒĂŒd saame kĂ€ivitada meie JAR-i standardse Java kĂ€suga:
$ java -jar ./target/helloworld--runner.jar
INFO [io.quarkus] (main) Quarkus 0.23.2 kÀivitamine kestis 0.673 sekundit. Kuulamine aadressil: http://0.0.0.0:8080
INFO [io.quarkus] (main) Profiil prod aktiveeritud.
INFO [io.quarkus] (main) Installitud omadused: [cdi]
PÀrast selle lÔpetamist avage brauser ja minge :8080 ja kontrollige, et kÔik töötab nagu peab.
Kogume helloworldi natiivseks tÀidetavaks failiks
Nii et meie helloworld töötab kui standalone Java rakendus, kasutades Quarkuse sÔltuvusi. Kuid saame minna edasi ja muuta selle natiivseks tÀidetavaks failiks.
Paigaldame GraalVM
Esiteks tuleb installida vajalikud tööriistad:
1. Laadige alla GraalVM 19.2.0.1 aadressilt .
2. Pakkige lahti allalaaditud arhiiv:
$ tar xvzf graalvm-ce-linux-amd64-19.2.0.1.tar.gz
3. Liikuge avatud kausta.
4. KÀivitage allpool toodud kÀsk, et alla laadida ja lisada natiivne pilt:
$ ./bin/gu install native-image
5. Lisage 2. sammus loodud kaust keskkonnamuutujasse GRAALVM_HOME:
$ export GRAALVM_HOME={untar-folder}/graalvm-ce-19.2.0.1)
Lisainfot ja installijuhiseid teistele operatsioonisĂŒsteemidele leiate juhendist .
Kogume helloworldi natiivseks tÀidetavaks failiks
Lugege juhendit : «Ja nĂŒĂŒd loome natiivse tĂ€idetava faili meie rakenduse jaoks, et vĂ€hendada kĂ€ivitamise aega ja suurust kettal. TĂ€idetav fail sisaldab kĂ”ike, mis on vajalik rakenduse kĂ€ivitamiseks, sealhulgas JVM-masinat (tĂ€psemalt, selle kĂ€rbitud versioon, mis sisaldab ainult seda, mis on vajalik rakenduse tĂ€itmiseks) ja meie rakendust ise.»
Natiivse tÀidetava faili loomiseks tuleb aktiveerida Maven'i native-profiil:
$ ./mvnw package -Pnative
Meie kogumine kestis ĂŒhe minuti ja 10 sekundit ning lĂ”plik fail helloworld-runner loodi kaustas /target.
KÀivitame helloworldi natiivse tÀidetava faili
Eelmises etapis saime tĂ€idetava faili /target/helloworld-runner. NĂŒĂŒd kĂ€ivitame selle:
$ ./target/helloworld--runner
INFO [io.quarkus] (main) Quarkus 0.23.2 kÀivitamine kestis 0.006 sekundit. Kuulamine aadressil: http://0.0.0.0:8080
INFO [io.quarkus] (main) Profiil prod aktiveeritud.
INFO [io.quarkus] (main) Installitud omadused: [cdi]
Avame taas brauseris :8080 ja kontrollime, et kÔik töötab nagu peab.
JĂ€tkub!
Me arvan, et selles postituses kÀsitletud (kuigi kÔige lihtsama nÀite pÔhjal) Java-rakenduste moderniseerimise meetodit Quarkuse vÔimaluste kasutamisel tasub reaalses elus aktiivselt rakendada. Samuti vÔite tÔenÀoliselt silmitsi seista mitmete probleemidega, mille lahendust kÀsitleme osaliselt jÀrgmises postituses, kus rÀÀgime, kuidas mÔÔta mÀlu kasutust, et hinnata jÔudluse paranemist, mis on kogu rakenduste moderniseerimise protsessi oluline osa.
Allikas: habr.com
