Halo kabeh wong ing blog iki, lan sugeng rawuh ing kirim kaping papat ing seri Quarkus!

yaiku babagan carane Quarkus nggabungake MicroProfile lan Spring. Ayo padha elinga dipanggonke minangka "Jawa subatom super cepet", alias "tumpukan Jawa sing berorientasi Kubernetes, dirancang kanggo GraalVM lan OpenJDK HotSpot lan dirakit saka perpustakaan lan standar sing paling apik." Dina iki kita bakal nuduhake carane modernisasi aplikasi Jawa sing wis ana nggunakake kapabilitas Quarkus, nggunakake conto , sing nggunakake teknologi CDI lan Servlet 3 sing didhukung dening Quarkus.
Penting kanggo dicathet ing kene yen Quarkus lan JBoss EAP nandheske nggunakake alat sing bisa adhedhasar standar. Ora duwe aplikasi sing mlaku ing JBoss EAP? Ora masalah, sampeyan bisa kanthi gampang migrasi saka server aplikasi saiki menyang JBoss EAP nggunakake . Sawisé iku, versi final lan bisa digunakake saka kode nganyari bakal kasedhiya ing repositori , ing modul .
Posting iki ditulis nggunakake , biasane lan Gedung a .
Ayo njaluk sawetara kode
Pisanan, ayo nggawe klon lokal saka repositori :
$ 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/
Ayo ndeleng carane helloworld asli bisa digunakake
Bener, inti saka aplikasi iki cetha saka jeneng, nanging kita bakal modernisasi kode sawijining strictly scientifically. Mulane, pisanan, ayo ndeleng aplikasi iki ing wangun asline.
Ngembangake helloworld
1. Bukak terminal lan pindhah menyang root folder JBoss EAP (sampeyan bisa ngundhuh ), yaiku, ing folder EAP_HOME.
2. Bukak server JBoss EAP kanthi profil standar:
$ EAP_HOME/bin/standalone.sh
Wigati: ing Windows Skrip EAP_HOMEbinstandalone.bat digunakake kanggo miwiti.
Sawise sawetara detik, kaya ing ngisor iki bakal katon ing log:
[org.jboss.as] (Controller Boot Thread) WFLYSRV0025: JBoss EAP 7.2.0.GA (WildFly Core 6.0.11.Final-redhat-00001) started in 3315ms - Started 306 of 527 services (321 services are lazy, passive or on-demand)
3. Bukak ing browser :8080 lan kita ndeleng iki:

Gambar 1. kaca ngarep JBoss EAP.
4. Tindakake pandhuan ing manual : nyebarake helloworld lan nglakokake (saka folder root proyek) perintah ing ngisor iki:
$ mvn clean install wildfly:deploy
Sawise kasil nglakokake printah iki, kita bakal weruh kaya ing ngisor iki ing log:
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 8.224 s
Dadi, panyebaran pertama aplikasi helloworld ing JBoss EAP mung butuh 8 detik.
Nguji helloworld
Tumindak kanthi ketat miturut pandhuane , mbukak ing browser :8080/helloworld lan kita ndeleng iki:

Gambar 2. Hello World dhisikan saka JBoss EAP.
Kita nggawe owah-owahan
Ngganti parameter input createHelloMessage(String name) saka World menyang Marco:
writer.println("<h1>" + helloService.createHelloMessage("Marco") + "</h1>");
Maneh kita nglakokake perintah ing ngisor iki:
$ mvn clean install wildfly:deploy
Banjur kita refresh kaca ing browser lan ndeleng manawa teks wis diganti:

Gambar 3. Hello Marco ing JBoss EAP.
Rollback penyebaran helloworld lan mateni JBoss EAP
Iki opsional, nanging yen sampeyan pengin mbatalake panyebaran, sampeyan bisa nindakake kanthi printah ing ngisor iki:
$ mvn clean install wildfly:undeploy
Kanggo mateni conto JBoss EAP, cukup pencet Ctrl+C ing jendela terminal.
Modernisasi helloworld
Saiki ayo pindhah menyang nganyarke aplikasi helloworld asli.
Nggawe cabang anyar
Gawe cabang kerja anyar sawise proyek wiwitan rampung:
$ git checkout -b quarkus 7.2.0.GA
Ngganti file pom.xml
Kita bakal miwiti ngowahi aplikasi saka file pom.xml. Kanggo ngidini Quarkus nglebokake blok XML, kita bakal nglakokake perintah ing ngisor iki ing folder helloworld:
$ mvn io.quarkus:quarkus-maven-plugin:0.23.2:create
Artikel iki ditulis nganggo versi 0.23.2. Quarkus kerep ngeculake versi anyar, sampeyan bisa ngerteni versi sing paling anyar ing situs web .
Printah ing ndhuwur bakal nglebokake unsur ing ngisor iki menyang pom.xml:
- Properti , sing nemtokake versi Quarkus sing bakal digunakake.
- Blok kanggo ngimpor Quarkus BOM (bill of materials) supaya ora nambah versi kanggo saben ketergantungan Quarkus.
- Plugin quarkus-maven-plugin tanggung jawab kanggo ngemas aplikasi lan nyedhiyakake mode pangembangan.
- Profil asli kanggo nggawe eksekusi aplikasi.
Kajaba iku, kita kanthi manual nggawe owahan ing pom.xml ing ngisor iki:
- We tarik metu tag saka blok lan sijine ing ndhuwur tag . Amarga ing langkah sabanjure kita bakal mbusak pamblokiran , banjur sampeyan kudu nyimpen .
- Mbusak pamblokiran , amarga nalika mlaku karo Quarkus, aplikasi iki ora perlu maneh pom induk saka JBoss.
- Tambah tag lan sijine ing ngisor tag . Sampeyan bisa nemtokake nomer versi sing dikarepake.
- Mbusak tag , amarga aplikasi iki dudu WAR, nanging JAR biasa.
- Kita ngowahi dependensi ing ngisor iki:
- Ganti dependensi javax.enterprise:cdi-api dadi io.quarkus:quarkus-arc, mbusak diwenehake , wiwit (miturut docs) ekstensi Quarkus iki nyedhiyakake injeksi ketergantungan CDI.
- Ganti dependensi org.jboss.spec.javax.servlet:jboss-servlet-api_4.0_spec dadi io.quarkus:quarkus-undertow, mbusak diwenehake , wiwit (miturut docs) ekstensi Quarkus iki nyedhiyakake dhukungan kanggo servlet.
- Mbusak dependensi org.jboss.spec.javax.annotation:jboss-annotations-api_1.3_spec, amarga digabungake karo dependensi sing lagi wae diowahi.
Versi file pom.xml karo kabeh owah-owahan dumunung ing .
Elinga yen mvn io.quarkus:quarkus-maven-plugin:0.23.2:create ing ndhuwur ora mung ngowahi file pom.xml, nanging uga nambah sawetara komponen ing proyek kasebut, yaiku file lan folder ing ngisor iki:
- mvnw lan mvnw.cmd file lan .mvn folder: Maven Wrapper ngijini sampeyan kanggo mbukak proyek Maven versi Maven diwenehi tanpa nginstal versi sing.
- Folder docker (ing src / main /): Iki ngemot sampel Dockerfiles kanggo mode native lan jvm (bebarengan karo file .dockerignore).
- Folder sumber daya (ing src/main/): Iki ngemot file application.properties kosong lan conto kaca wiwitan Quarkus index.html (pirsani Run helloworld modern kanggo rincian liyane).
Lansiran helloworld
Kanggo nguji aplikasi kasebut, kita nggunakake quarkus:dev, sing nganggo Quarkus ing mode pangembangan (kanggo rincian liyane, deleng bagean iki ing pandhuan ).
Wigati: Langkah iki samesthine bakal nyebabake kesalahan, amarga kita durung nindakake kabeh owah-owahan sing dibutuhake.
Saiki ayo mbukak printah kanggo mriksa cara kerjane:
$ ./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
Dadi, ora bisa ... Kenapa?
UnsatisfiedResolutionException nunjukake kelas HelloService, sing dadi anggota saka kelas HelloWorldServlet (anggota java: org.jboss.as.quickstarts.helloworld.HelloWorldServlet#helloService). Masalah iku HelloWorldServlet perlu instance saka HelloService, lan ora bisa nemokake siji (sanajan loro kelas ing paket padha).
Iku wektu kanggo bali menyang lan maca cara kerjane ing Quarkus , lan mulane, (CDI). Dadi, bukak pandhuan Konteks lan Ketergantungan Injeksi lan ing bagean kasebut kita maca: "A kelas kacang sing ora duwe anotasi sing nemtokake kacang ora ditelusuri."
Ayo goleki kelas HelloService - pancen ora ana anotasi kasebut. Dadi kudu ditambahake supaya Quarkus bisa nggoleki lan nemokake kacang. Lan amarga iki minangka obyek tanpa negara, kita bisa kanthi gampang nambah anotasi @ApplicationScoped kaya iki:
@ApplicationScoped
public class HelloService {
Wigati: ing kene lingkungan pangembangan bisa uga njaluk sampeyan nambah paket sing dibutuhake (deleng baris ing ngisor iki), lan sampeyan kudu nindakake kanthi manual, kaya iki:
import javax.enterprise.context.ApplicationScoped;
Yen sampeyan ora yakin apa orane katrangan kanggo nggunakake nalika kacang asli ora duwe siji pesawat ing kabeh, mriksa dokumentasi. .
Saiki kita nyoba kanggo mbukak aplikasi maneh karo printah ./mvnw compile quarkus:dev:
$ ./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]
Saiki kabeh dadi tanpa kesalahan.
Ngluncurake helloworld modern
Kaya sing ditulis ing log, mbukak ing browser :8080 (kaca wiwitan Quarkus standar) lan kita ndeleng iki:

Gambar 4. kaca wiwitan Quarkus dev.
Anotasi WebServlet kanggo aplikasi iki nduweni definisi konteks ing ngisor iki:
@WebServlet("/HelloWorld")
public class HelloWorldServlet extends HttpServlet {
Supaya kita pindhah menyang browser :8080/HelloWorld lan kita ndeleng ing ngisor iki:

Gambar 5: Kaca dev Quarkus kanggo aplikasi Hello World.
Inggih, kabeh bisa.
Saiki ayo ngowahi kode kasebut. Elinga yen printah ./mvnw compile quarkus:dev isih mlaku, lan kita ora bakal mandheg. Saiki ayo nyoba nglamar sing padha - ora pati penting - owah-owahan ing kode kasebut lan deleng kepiye Quarkus nggawe urip luwih gampang kanggo pangembang:
writer.println("<h1>" + helloService.createHelloMessage("Marco") + "</h1>");
Simpen file banjur refresh kaca web kanggo ndeleng teks Hello Marco kaya sing ditampilake ing gambar ing ngisor iki:

Fig. 6. kaca Hello Marco ing Quarkus dev.
Saiki ayo mriksa output ing terminal:
INFO [io.qua.dev] (vert.x-worker-thread-3) Changed source files detected, recompiling [/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 stopped in 0.003s
INFO [io.qua.dep.QuarkusAugmentor] (vert.x-worker-thread-3) Beginning quarkus augmentation
INFO [io.qua.dep.QuarkusAugmentor] (vert.x-worker-thread-3) Quarkus augmentation completed in 232ms
INFO [io.quarkus] (vert.x-worker-thread-3) Quarkus 0.23.2 started in 0.257s. Listening on: http://0.0.0.0:8080
INFO [io.quarkus] (vert.x-worker-thread-3) Profile dev activated. Live Coding activated.
INFO [io.quarkus] (vert.x-worker-thread-3) Installed features: [cdi]
INFO [io.qua.dev] (vert.x-worker-thread-3) Hot replace total time: 0.371s
Refresh kaca micu deteksi owah-owahan kode sumber, lan Quarkus kanthi otomatis nindakake prosedur mandeg-wiwitan. Lan kabeh iki rampung mung 0.371 detik (yaiku "Subatomik Jawa super-cepet").
Nggawe helloworld dadi paket JAR
Saiki kode kasebut bisa digunakake kaya sing dikarepake, ayo bungkus nganggo printah ing ngisor iki:
$ ./mvnw clean package
Printah iki nggawe loro file JAR ing folder / target: helloworld-.jar, kang artefak standar nglumpuk dening printah Maven bebarengan karo kelas project lan sumber daya. Lan helloworld-runner.jar, yaiku JAR sing bisa dieksekusi.
Elinga yen iki dudu uber-jar, amarga kabeh dependensi mung disalin menyang folder / target / lib (tinimbang dikemas menyang file JAR). Dadi kanggo mbukak JAR iki saka folder liyane utawa ing host liyane, loro file JAR dhewe lan folder / lib kudu disalin ana, diwenehi sing unsur Class-Path ing file MANIFEST.MF ing paket JAR ngemot listing nyata saka JARs ing folder lib.
Kanggo mangerteni carane nggawe aplikasi uber-jar, waca pandhuane .
Mbukak helloworld dikemas ing JAR
Saiki kita bisa mbukak JAR nggunakake printah java standar:
$ java -jar ./target/helloworld-<version>-runner.jar
INFO [io.quarkus] (main) Quarkus 0.23.2 started in 0.673s. Listening on: http://0.0.0.0:8080
INFO [io.quarkus] (main) Profile prod activated.
INFO [io.quarkus] (main) Installed features: [cdi]
Sawise kabeh iki rampung, pindhah menyang browser lan pindhah menyang : 8080 lan priksa manawa kabeh bisa digunakake.
Nggawe helloworld dadi file eksekusi asli
Dadi, helloworld kita mlaku minangka aplikasi Java mandiri nggunakake dependensi Quarkus. Nanging kita bisa luwih maju lan ngowahi dadi file eksekusi asli.
Nginstal GraalVM
Kaping pisanan, sampeyan kudu nginstal alat sing dibutuhake kanggo iki:
1. Download GraalVM 19.2.0.1 saka .
2. Nggedhekake arsip sing diundhuh:
$ tar xvzf graalvm-ce-linux-amd64-19.2.0.1.tar.gz
3. Pindhah menyang folder untar.
4. Jalanake printah ing ngisor iki kanggo ngundhuh lan nambah gambar asli:
$ ./bin/gu install native-image
5. Kita ndhaptar folder sing digawe ing langkah 2 ing variabel lingkungan GRAALVM_HOME:
$ export GRAALVM_HOME={untar-folder}/graalvm-ce-19.2.0.1)
Kanggo informasi luwih lengkap lan instruksi instalasi ing sistem operasi liyane, waca manual .
Kita mbangun helloworld dadi file eksekusi asli
Maca manual : "Saiki ayo nggawe file eksekusi asli kanggo aplikasi kita kanggo nyuda wektu wiwitan lan ukuran ing disk. File eksekusi bakal duwe kabeh sing perlu kanggo mbukak aplikasi, kalebu mesin JVM (utawa luwih, versi truncated, mung ngemot apa sing dibutuhake kanggo mbukak aplikasi) lan aplikasi kita dhewe. "
Kanggo nggawe file eksekusi asli, sampeyan kudu ngaktifake profil asli Maven:
$ ./mvnw package -Pnative
Kanggo kita, mbangun njupuk siji menit lan 10 detik, lan asil helloworld-runner f file digawe ing folder / target.
Jalanake file eksekusi helloworld asli
Ing langkah sadurunge, kita entuk file eksekusi / target / helloworld-runner. Saiki ayo mbukak:
$ ./target/helloworld-<version>-runner
INFO [io.quarkus] (main) Quarkus 0.23.2 started in 0.006s. Listening on: http://0.0.0.0:8080
INFO [io.quarkus] (main) Profile prod activated.
INFO [io.quarkus] (main) Installed features: [cdi]
Bukak maneh ing browser : 8080 lan priksa manawa kabeh bisa digunakake.
Muga-muga!
Kita pitados bilih cara modernisasi aplikasi Jawa nggunakake kapabilitas Quarkus, rembugan ing kirim iki (sanajan ing conto paling gampang), iku worth aktif digunakake ing urip nyata. Ing wektu sing padha, sampeyan bakal paling kamungkinan nemokke sawetara masalah, solusi sing sebagian bakal nimbang ing kirim sabanjuré, ngendi kita bakal pirembagan bab carane ngukur konsumsi memori kanggo ngira-ngira kinerja dandan, bagéyan penting saka kabeh proses modernizing aplikasi.
Source: www.habr.com
