Quarkus: ืึทืคึผืคึผืœื™ืงืึทื˜ื™ืึธืŸ ืžืึทื“ืขืจื ืึทื–ื™ื™ืฉืึทืŸ ื ื™ืฆืŸ ื”ืขืœืœืึธื•ื•ืึธืจืœื“ ื•ื•ื™ ืึท ื‘ื™ื™ืฉืคึผื™ืœ ืคึฟื•ืŸ JBoss EAP ืงื•ื•ื™ืงืงืกื˜ืึทืจื˜

ื”ืขืœื ืึทืœืขืžืขืŸ ืื•ื™ืฃ ื“ืขื ื‘ืœืึธื’, ื“ืึธ ืก ื“ืขืจ ืคืขืจื˜ ืคึผืึธืกื˜ืŸ ืื™ืŸ ื“ื™ Quarkus ืกืขืจื™ืข!

Quarkus: ืึทืคึผืคึผืœื™ืงืึทื˜ื™ืึธืŸ ืžืึทื“ืขืจื ืึทื–ื™ื™ืฉืึทืŸ ื ื™ืฆืŸ ื”ืขืœืœืึธื•ื•ืึธืจืœื“ ื•ื•ื™ ืึท ื‘ื™ื™ืฉืคึผื™ืœ ืคึฟื•ืŸ JBoss EAP ืงื•ื•ื™ืงืงืกื˜ืึทืจื˜

ืคืจื™ื™ึทืขืจื“ื™ืง ืคึผืึธืกื˜ืŸ ืื™ื– ื’ืขื•ื•ืขืŸ ื•ื•ืขื’ืŸ ื•ื•ื™ Quarkus ืงืึทืžื‘ื™ื™ื ื– ืžื™ืงืจืึธืคึผืจืึธืคื™ืœืข ืื•ืŸ ืกืคึผืจื™ื ื’. ืœืืžื™ืจ ื“ืืก ื“ืขืจืžืื ืขืŸ ืงื•ื•ืึทืจืงื•ืก ืื™ื– ืคึผืึทื–ื™ืฉืึทื ื“ ื•ื•ื™ "ื”ื™ื ื˜ืขืจ-ืฉื ืขืœ ืกื•ื‘ืึทื˜ืึธืžื™ืง ื–'ืื‘ื", ืึทืงืึท "ืงื•ื‘ืขืจื ืขื˜ืขืก-ืึธืจื™ืขื ื˜ื™ื“ ื“ื–ืฉืึทื•ื•ืึท ืกื˜ืึทืง, ื˜ื™ื™ืœืขืจื“ ืคึฟืึทืจ GraalVM ืื•ืŸ OpenJDK HotSpot ืื•ืŸ ืคืืจื–ืืžืœื˜ ืคื•ืŸ ื“ื™ ื‘ืขืกื˜ืขืจ ืœื™ื™ื‘ืจืขืจื™ื– ืื•ืŸ ืกื˜ืึทื ื“ืึทืจื“ืก." ื”ื™ื™ึทื ื˜ ืžื™ืจ ื•ื•ืขืœืŸ ื•ื•ื™ื™ึทื–ืŸ ื•ื•ื™ ืฆื• ืคืึทืจื”ื™ื™ึทื ื˜ื™ืงืŸ ื™ื’ื–ื™ืกื˜ื™ื ื’ ื–'ืื‘ื ืึทืคึผืœืึทืงื™ื™ืฉืึทื ื– ืžื™ื˜ ื“ื™ ืงื™ื™ืคึผืึทื‘ื™ืœืึทื˜ื™ื– ืคื•ืŸ Quarkus, ื ื™ืฆืŸ ื“ืขื ื‘ื™ื™ึทืฉืคึผื™ืœ ื”ืขืœืœืึธื•ื•ืึธืจืœื“ ืึทืคึผืœืึทืงื™ื™ืฉืึทื ื– ืคื•ืŸ ื“ื™ Red Hat JBoss Enterprise Application Platform (JBoss EAP) ืงื•ื•ื™ืงืงืกื˜ืึทืจื˜ ืจื™ืคึผืึทื–ืึทื˜ืึธืจื™, ื•ื•ืึธืก ื ื™ืฆื˜ CDI ืื•ืŸ Servlet 3 ื˜ืขืงื ืึทืœืึทื“ื–ืฉื™ื– ื’ืขืฉื˜ื™ืฆื˜ ื“ื•ืจืš Quarkus.

ืขืก ืื™ื– ื•ื•ื™ื›ื˜ื™ืง ืฆื• ื˜ืึธืŸ ื“ืึธ ืึทื– ื‘ื™ื™ื“ืข Quarkus ืื•ืŸ JBoss EAP ื•ื ื˜ืขืจืฉื˜ืจื™ื™ึทื›ืŸ ื ื™ืฆืŸ ืžื›ืฉื™ืจื™ื ื•ื•ืึธืก ื–ืขื ืขืŸ ื•ื•ื™ ืกื˜ืึทื ื“ืึทืจื“ืก ื‘ืื–ื™ืจื˜ ื•ื•ื™ ืžืขื’ืœืขืš. ืฆื™ ื ื™ื˜ ื”ืึธื‘ืŸ ืึท ืึทืคึผืœืึทืงื™ื™ืฉืึทืŸ ืคืœื™ืกื ื“ื™ืง ืื•ื™ืฃ JBoss EAP? ืงื™ื™ืŸ ืคึผืจืึธื‘ืœืขื, ืขืก ืงืขื ืขืŸ ื–ื™ื™ืŸ ืœื™ื™ื›ื˜ ืžื™ื™ื’ืจื™ื™ื˜ื™ื“ ืคื•ืŸ ื“ื™ื™ืŸ ืงืจืึทื ื˜ ืึทืคึผืœืึทืงื™ื™ืฉืึทืŸ ืกืขืจื•ื•ืขืจ ืฆื• JBoss EAP Red Hat Application Migration Toolkit. ื ืึธืš ื•ื•ืึธืก ื“ื™ ืœืขืฆื˜ ืื•ืŸ ืืจื‘ืขื˜ืŸ ื•ื•ืขืจืกื™ืข ืคื•ืŸ โ€‹โ€‹ื“ื™ ืžืึทื“ืขืจื ื™ื™ื–ื“ ืงืึธื“ ื•ื•ืขื˜ ื–ื™ื™ืŸ ื‘ืืจืขื›ื˜ื™ื’ื˜ ืื™ืŸ ื“ื™ ืจื™ืคึผืึทื–ืึทื˜ืึธืจื™ github.com/mrizzi/jboss-eap-quickstarts/tree/quarkus, ืื™ืŸ ื“ื™ ืžืึธื“ื•ืœืข ื”ืขืœื ื•ื•ืขืœื˜.

ื•ื•ืขืŸ ืฉืจื™ื™ื‘ืŸ ื“ืขื ืคึผืึธืกื˜ืŸ ืžื™ืจ ื’ืขื•ื•ื™ื™ื ื˜ ืงื•ื•ืึทืจืงื•ืก ื˜ื•ื˜ืึธืจื™ืึทืœื–, ืžืขืจืกื˜ื ืก ืฉืึทืคึฟืŸ ื“ื™ื™ืŸ ืขืจืฉื˜ืขืจ ืึทืคึผืœืึทืงื™ื™ืฉืึทืŸ ืื•ืŸ ื‘ื ื™ืŸ ื ื’ืขื‘ื•ื™ืจืŸ ืขืงืกืขืงื•ื˜ืึทื‘ืœืข.

ื–ืืœ ืก ื‘ืึทืงื•ืžืขืŸ ื“ื™ ืงืึธื“

ืขืจืฉื˜ืขืจ ืคื•ืŸ ืึทืœืข, ืœืึธื–ืŸ ืื•ื ื“ื– ืžืึทื›ืŸ ืึท ื”ื™ื’ืข ืงืœืึธื•ืŸ ืคื•ืŸ ื“ื™ ืจื™ืคึผืึทื–ืึทื˜ืึธืจื™ JBoss EAP ืงื•ื•ื™ืงืงืกื˜ืึทืจื˜ื–:

$ 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/

ืœืึธืžื™ืจ ื–ืขืŸ ื•ื•ื™ ื“ืขืจ ืึธืจื™ื’ื™ื ืขืœ ื”ืขืœืœืึธื•ื•ืึธืจืœื“ ืึทืจื‘ืขื˜

ืึทืงื˜ื•ืึทืœืœื™, ื“ื™ ืขืกืึทื ืก ืคื•ืŸ ื“ืขื ืึทืคึผืœืึทืงื™ื™ืฉืึทืŸ ืื™ื– ืงืœืึธืจ ืคึฟื•ืŸ ื“ืขื ื ืึธืžืขืŸ, ืึธื‘ืขืจ ืžื™ืจ ื•ื•ืขืœืŸ ืคืึทืจื”ื™ื™ึทื ื˜ื™ืงืŸ ื–ื™ื™ืŸ ืงืึธื“ ืฉื˜ืจืขื ื’ ืกื™ื™ืึทื ื˜ื™ืคื™ืงืœื™. ื“ืขืจื™ื‘ืขืจ, ืขืจืฉื˜ืขืจ, ืœืึธื–ืŸ ืก ืงื•ืง ืื™ืŸ ื“ืขื ืึทืคึผืœืึทืงื™ื™ืฉืึทืŸ ืื™ืŸ ื–ื™ื™ึทืŸ ืึธืจื™ื’ื™ื ืขืœ ืคืึธืจืขื.

ื“ื™ืคึผืœื™ื™ื™ื ื’ ื”ืขืœืœืึธื•ื•ืึธืจืœื“

1. ืขืคึฟืขื ืขืŸ ืึท ื•ื•ืึธืงื–ืึทืœ ืื•ืŸ ื’ื™ื™ืŸ ืฆื• ื“ื™ ื•ื•ืึธืจืฆืœ ืคื•ืŸ ื“ื™ JBoss EAP ื˜ืขืงืข (ืื™ืจ ืงืขื ืขืŸ ืืจืืคืงืืคื™ืข ืขืก ื“ืึธ), ื“ืึธืก ืื™ื–, ืฆื• ื“ื™ EAP_HOME ื˜ืขืงืข.

2. ืงืึทื˜ืขืจ ื“ื™ JBoss EAP ืกืขืจื•ื•ืขืจ ืžื™ื˜ ื“ื™ ืคืขืœื™ืงื™ื™ึทื˜ ืคึผืจืึธืคื™ืœ:

$ EAP_HOME/bin/standalone.sh

ื‘ืึทืžืขืจืงื•ื ื’: ืื•ื™ืฃ Windows, ื“ื™ EAP_HOMEbinstandalone.bat ืฉืจื™ืคื˜ ืื™ื– ื’ืขื ื™ืฆื˜ ืฆื• ืงืึทื˜ืขืจ ืขืก.

ื ืึธืš ืึท ืคึผืึธืจ ืคื•ืŸ ืกืขืงื•ื ื“ืขืก, ืขืคึผืขืก ื•ื•ื™ ื“ืึธืก ื–ืึธืœ ื“ืขืจืฉื™ื™ึทื ืขืŸ ืื™ืŸ ื“ื™ ืงืœืึธืฅ:

[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. ืขืคึฟืขื ืขืŸ ืื™ืŸ ืึท ื‘ืœืขื˜ืขืจืขืจ 127.0.0.1:8080 ืื•ืŸ ืžื™ืจ ื–ืขืŸ ื“ืขื:

Quarkus: ืึทืคึผืคึผืœื™ืงืึทื˜ื™ืึธืŸ ืžืึทื“ืขืจื ืึทื–ื™ื™ืฉืึทืŸ ื ื™ืฆืŸ ื”ืขืœืœืึธื•ื•ืึธืจืœื“ ื•ื•ื™ ืึท ื‘ื™ื™ืฉืคึผื™ืœ ืคึฟื•ืŸ JBoss EAP ืงื•ื•ื™ืงืงืกื˜ืึทืจื˜

ืจื™ื™ืก. 1. JBoss EAP ื”ืึธืžืขืคึผืึทื’ืข.

4. ื’ื™ื™ ื“ื™ ื™ื ืกื˜ืจืึทืงืฉืึทื ื– ืื™ืŸ ื“ื™ ืžืึทื ื•ืึทืœ ื‘ื•ื™ืขืŸ ืื•ืŸ ืฆืขื•ื•ื™ืงืœืขืŸ ื“ื™ ืงื•ื•ื™ืงืงืกื˜ืึทืจื˜: ื™ืงืกืคึผืึทื ื“ ื”ืขืœืœืึธื•ื•ืึธืจืœื“ ืื•ืŸ ืœื•ื™ืคืŸ (ืคึฟื•ืŸ ื“ื™ ืคึผืจื•ื™ืขืงื˜ ื•ื•ืึธืจืฆืœ ื˜ืขืงืข) ื“ื™ ืคืืœื’ืขื ื“ืข ื‘ืึทืคึฟืขืœ:

$ mvn clean install wildfly:deploy

ื ืึธืš ื”ืฆืœื—ื” ืขืงืกืึทืงื™ื•ื˜ื™ื ื’ ื“ืขื ื‘ืึทืคึฟืขืœ, ืžื™ืจ ื•ื•ืขืœืŸ ื–ืขืŸ ืขืคึผืขืก ื•ื•ื™ ื“ื™ ืคืืœื’ืขื ื“ืข ืื™ืŸ ื“ื™ ืงืœืึธืฅ:

[INFO] ------------------------------------------------------------------------ 
[INFO] BUILD SUCCESS 
[INFO] ------------------------------------------------------------------------ 
[INFO] Total time: 8.224 s

ืึทื–ื•ื™, ื“ืขืจ ืขืจืฉื˜ืขืจ ื“ื™ืคึผืœื•ื™ืžืึทื ื˜ ืคื•ืŸ ื“ื™ ื”ืขืœืœืึธื•ื•ืึธืจืœื“ ืึทืคึผืœืึทืงื™ื™ืฉืึทืŸ ืื•ื™ืฃ JBoss EAP ื’ืขื ื•ืžืขืŸ ื ืึธืจ ืื™ื‘ืขืจ 8 ืกืขืงื•ื ื“ืขืก.

ื˜ืขืกื˜ื™ื ื’ ื”ืขืœืœืึธื•ื•ืึธืจืœื“

ืึทืงื˜ื™ื ื’ ืฉื˜ืจืขื ื’ ืœื•ื™ื˜ ืฆื• ื™ื ืกื˜ืจืึทืงืฉืึทื ื– ืึทืงืกืขืก ื“ื™ ืึทืคึผืœืึทืงื™ื™ืฉืึทืŸ, ืขืคืขื ืขืŸ ืื™ืŸ ื“ืขื ื‘ืœืขื˜ืขืจืขืจ 127.0.0.1:8080/helloworld ืื•ืŸ ืžื™ืจ ื–ืขืŸ ื“ืขื:

Quarkus: ืึทืคึผืคึผืœื™ืงืึทื˜ื™ืึธืŸ ืžืึทื“ืขืจื ืึทื–ื™ื™ืฉืึทืŸ ื ื™ืฆืŸ ื”ืขืœืœืึธื•ื•ืึธืจืœื“ ื•ื•ื™ ืึท ื‘ื™ื™ืฉืคึผื™ืœ ืคึฟื•ืŸ JBoss EAP ืงื•ื•ื™ืงืงืกื˜ืึทืจื˜

ืจื™ื™ืก. 2. ืึธืจื™ื’ื™ื ืขืœ ื”ืขืœื ื•ื•ืขืœื˜ ืคึฟื•ืŸ JBoss EAP.

ืžืื›ืŸ ืขื ื“ืขืจื•ื ื’ืขืŸ

ื˜ื•ื™ืฉืŸ ื“ื™ ืึทืจื™ื™ึทื ืฉืจื™ื™ึทื‘ ืคึผืึทืจืึทืžืขื˜ืขืจ createHelloMessage (ืฉื˜ืจื™ืงืœ ื ืึธืžืขืŸ) ืคื•ืŸ ื•ื•ืขืœื˜ ืฆื• ืžืึทืจืงืึธ:

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

ืœื•ื™ืคืŸ ื“ื™ ืคืืœื’ืขื ื“ืข ื‘ืึทืคึฟืขืœ ื•ื•ื™ื“ืขืจ:

$ mvn clean install wildfly:deploy

ื“ืขืจื ืึธืš ืžื™ืจ ื“ืขืจืคืจื™ืฉืŸ ื“ืขื ื‘ืœืึทื˜ ืื™ืŸ ื“ืขื ื‘ืœืขื˜ืขืจืขืจ ืื•ืŸ ื–ืขืŸ ืึทื– ื“ืขืจ ื˜ืขืงืกื˜ ืื™ื– ืคืืจืขื ื“ืขืจื˜:

Quarkus: ืึทืคึผืคึผืœื™ืงืึทื˜ื™ืึธืŸ ืžืึทื“ืขืจื ืึทื–ื™ื™ืฉืึทืŸ ื ื™ืฆืŸ ื”ืขืœืœืึธื•ื•ืึธืจืœื“ ื•ื•ื™ ืึท ื‘ื™ื™ืฉืคึผื™ืœ ืคึฟื•ืŸ JBoss EAP ืงื•ื•ื™ืงืงืกื˜ืึทืจื˜

ืจื™ื™ืก. 3. ื”ืขืœื ืžืึทืจืงืึธ ืื™ืŸ JBoss EAP.

ืฆื•ืจื™ืงืงืจื™ื’ืŸ ื“ื™ ื”ืขืœืœืึธื•ื•ืึธืจืœื“ ื“ื™ืคึผืœื•ื™ืžืึทื ื˜ ืื•ืŸ ืคืึทืจืžืึทื›ืŸ JBoss EAP

ื“ืึธืก ืื™ื– ืึทืคึผืฉืึทื ืึทืœ, ืึธื‘ืขืจ ืื•ื™ื‘ ืื™ืจ ื•ื•ื™ืœืŸ ืฆื• ื‘ืึธื˜ืœ ืžืึทื›ืŸ ื“ื™ ื“ื™ืคึผืœื•ื™ืžืึทื ื˜, ืื™ืจ ืงืขื ืขืŸ ื˜ืึธืŸ ื“ืึธืก ืžื™ื˜ ื“ื™ ืคืืœื’ืขื ื“ืข ื‘ืึทืคึฟืขืœ:

$ mvn clean install wildfly:undeploy

ืฆื• ืคืึทืจืžืึทื›ืŸ ื“ื™ื™ืŸ JBoss EAP ื‘ื™ื™ึทืฉืคึผื™ืœ, ื“ืจื™ืงืŸ ืงื˜ืจืœ + C ืื™ืŸ ื“ื™ ื•ื•ืึธืงื–ืึทืœ ืคึฟืขื ืฆื˜ืขืจ.

ืึทืคึผื’ืจื™ื™ื“ื™ื ื’ ื”ืขืœืœืึธื•ื•ืึธืจืœื“

ืื™ืฆื˜ ืœืึธื–ืŸ ืื•ื ื“ื– ืคืึทืจื”ื™ื™ึทื ื˜ื™ืงืŸ ื“ื™ ืึธืจื™ื’ื™ื ืขืœ ื”ืขืœืœืึธื•ื•ืึธืจืœื“ ืึทืคึผืœืึทืงื™ื™ืฉืึทืŸ.

ืฉืึทืคึฟืŸ ืึท ื ื™ื™ึทืข ืฆื•ื•ื™ื™ึทื’

ืžื™ืจ ืžืึทื›ืŸ ืึท ื ื™ื™ึทืข ืืจื‘ืขื˜ืŸ ืฆื•ื•ื™ื™ึทื’ ื ืึธืš ื“ื™ ืงื•ื•ื™ืงืงืกื˜ืึทืจื˜ ืคึผืจื•ื™ืขืงื˜ ืื™ื– ื’ืขืขื ื“ื™ืงื˜:

$ git checkout -b quarkus 7.2.0.GA

ื˜ืฉืึทื ื’ื™ื ื’ ื“ื™ ืคึผืึธืž.ืงืกืžืœ ื˜ืขืงืข

ืžื™ืจ ื•ื•ืขืœืŸ ืึธื ื”ื™ื™ื‘ืŸ ื˜ืฉืึทื ื’ื™ื ื’ ื“ื™ ืึทืคึผืœืึทืงื™ื™ืฉืึทืŸ ืคึฟื•ืŸ ื“ื™ pom.xml ื˜ืขืงืข. ืฆื• ืœืึธื–ืŸ Quarkus ืฆื• ืึทืจื™ื™ึทื ืœื™ื™ื’ืŸ XML ื‘ืœืึทืงืก ืื™ืŸ ืขืก, ืœื•ื™ืคืŸ ื“ื™ ืคืืœื’ืขื ื“ืข ื‘ืึทืคึฟืขืœ ืื™ืŸ ื“ื™ ื”ืขืœืœืึธื•ื•ืึธืจืœื“ ื˜ืขืงืข:

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

ื•ื•ืขืŸ ืฉืจื™ื™ื‘ืŸ ื“ืขื ืึทืจื˜ื™ืงืœ, ื•ื•ืขืจืกื™ืข 0.23.2 ืื™ื– ื’ืขื ื™ืฆื˜. Quarkus ืึธืคื˜ ืจื™ืœื™ืกื™ื– ื ื™ื™ึทืข ื•ื•ืขืจืกื™ืขืก, ืื™ืจ ืงืขื ืขืŸ ื’ืขืคึฟื™ื ืขืŸ ืื•ื™ืก ื•ื•ืึธืก ื•ื•ืขืจืกื™ืข ืื™ื– ื“ื™ ืœืขืฆื˜ืข ืื•ื™ืฃ ื“ืขื ื•ื•ืขื‘ื–ื™ื™ื˜ืœ github.com/quarkusio/quarkus/releases/latest.

ื“ืขืจ ืื•ื™ื‘ืŸ ื‘ืึทืคึฟืขืœ ื•ื•ืขื˜ ืึทืจื™ื™ึทื ืœื™ื™ื’ืŸ ื“ื™ ืคืืœื’ืขื ื“ืข ืขืœืขืžืขื ื˜ืŸ ืื™ืŸ pom.xml:

  • ืคืึทืจืžืึธื’ , ื•ื•ืึธืก ืกืคึผืขืฆื™ืคื™ืฆื™ืจื˜ ื“ื™ ื•ื•ืขืจืกื™ืข ืคื•ืŸ โ€‹โ€‹โ€‹โ€‹ืงื•ื•ืึทืจืงื•ืก ืฆื• ื ื•ืฆืŸ.
  • ืคืึทืจืฉืคึผืึทืจืŸ ืฆื• ืึทืจื™ื™ึทื ืคื™ืจ Quarkus BOM (ื‘ื™ืœ ืคื•ืŸ ืžืึทื˜ืขืจื™ืึทืœืก), ืึทื–ื•ื™ ื ื™ืฉื˜ ืฆื• ืœื™ื™ื’ืŸ ืึท ื•ื•ืขืจืกื™ืข ืคึฟืึทืจ ื™ืขื“ืขืจ ืงื•ื•ืึทืจืงื•ืก ื“ืขืคึผืขื ื“ืขื ืกื™.
  • ื“ื™ quarkus-maven-plugin ืื™ื– ืคืึทืจืึทื ื˜ื•ื•ืึธืจื˜ืœืขืš ืคึฟืึทืจ ืคึผืึทืงืงืึทื’ื™ื ื’ ื“ื™ ืึทืคึผืœืึทืงื™ื™ืฉืึทืŸ ืื•ืŸ ืคึผืจืึทื•ื•ื™ื™ื“ื™ื ื’ ืึทื ื˜ื•ื•ื™ืงืœื•ื ื’ ืžืึธื“ืข.
  • ื“ืขืจ ื’ืขื‘ื•ื™ืจืŸ ืคึผืจืึธืคื™ืœ ืคึฟืึทืจ ืงืจื™ื™ื™ื˜ื™ื ื’ ืึทืคึผืœืึทืงื™ื™ืฉืึทืŸ ืขืงืกืขืงื•ื˜ืึทื‘ืœืขืก.

ืื™ืŸ ืึทื“ื™ืฉืึทืŸ, ืžื™ืจ ืžืึทื ื™ื•ืึทืœื™ ืžืึทื›ืŸ ื“ื™ ืคืืœื’ืขื ื“ืข ืขื ื“ืขืจื•ื ื’ืขืŸ ืฆื• pom.xml:

  1. ืฆื™ืขืŸ ืื•ื™ืก ื“ื™ ืงื•ื•ื™ื˜ืœ ืคื•ืŸ ื“ื™ ื‘ืœืึธืง ืื•ืŸ ืฉื˜ืขืœืŸ ืขืก ืื•ื™ื‘ืŸ ื“ื™ ืงื•ื•ื™ื˜ืœ . ื•ื•ื™ื™ึทืœ ืื™ืŸ ื“ืขืจ ื•ื•ื™ื™ึทื˜ืขืจ ืฉืจื™ื˜ ืžื™ืจ ื•ื•ืขืœืŸ ื‘ืึทื–ื™ื™ึทื˜ื™ืงืŸ ื“ื™ ื‘ืœืึธืง , ื“ืขืžืึธืœื˜ ืื™ืจ ื“ืึทืจืคึฟืŸ ืฆื• ืจืึทื˜ืขื•ื•ืขืŸ .
  2. ืจื™ืžื•ื•ื•ื™ื ื’ ืึท ื‘ืœืึธืง , ื•ื•ื™ื™ึทืœ ื•ื•ืขืŸ ืคืœื™ืกื ื“ื™ืง ืžื™ื˜ Quarkus, ื“ื™ ืึทืคึผืœืึทืงื™ื™ืฉืึทืŸ ื•ื•ืขื˜ ื ื™ื˜ ืžืขืจ ื“ืึทืจืคึฟืŸ ืึท ืคืึธื˜ืขืจ ืคึผืึธื ืคื•ืŸ JBoss.
  3. ืœื™ื™ื’ ืึท ืงื•ื•ื™ื˜ืœ ืื•ืŸ ืฉื˜ืขืœืŸ ืขืก ืื•ื ื˜ืขืจ ื“ื™ ืงื•ื•ื™ื˜ืœ . ืื™ืจ ืงืขื ืขืŸ ืกืคึผืขืฆื™ืคื™ืฆื™ืจืŸ ื“ื™ ื•ื•ืขืจืกื™ืข ื ื•ืžืขืจ ืื™ืจ ื•ื•ื™ืœืŸ.
  4. ืจื™ืžื•ื•ื•ื™ื ื’ ื“ื™ ืงื•ื•ื™ื˜ืœ , ื–ื™ื ื˜ ื“ื™ ืึทืคึผืœืึทืงื™ื™ืฉืึทืŸ ืื™ื– ื ื™ื˜ ืžืขืจ ืึท WAR, ืึธื‘ืขืจ ืึท ืจืขื’ื•ืœืขืจ JAR.
  5. ืžื™ืจ ืžืึธื“ื™ืคื™ืฆื™ืจืŸ ื“ื™ ืคืืœื’ืขื ื“ืข ื“ื™ืคึผืขื ื“ืึทื ืกื™ื–:
    1. ื˜ื•ื™ืฉืŸ ื“ื™ ื“ืขืคึผืขื ื“ืขื ืกื™ javax.enterprise:cdi-api ืฆื• io.quarkus:quarkus-arc, ืจื™ืžื•ื•ื•ื™ื ื’ ืฆื•ื’ืขืฉื˜ืขืœื˜ , ื–ื™ื ื˜ (ืœื•ื™ื˜ ื“ื™ ื“ืึธืงื•ืžืขื ื˜ืŸ) ื“ืขื Quarkus ืคืึทืจืœืขื ื’ืขืจื•ื ื’ ื’ื™ื˜ ื™ื ื“ื–ืฉืขืงืฉืึทืŸ ืคื•ืŸ CDI ื“ื™ืคึผืขื ื“ืึทื ืกื™ื–.
    2. ื˜ื•ื™ืฉืŸ ื“ื™ ื“ืขืคึผืขื ื“ืขื ืกื™ org.jboss.spec.javax.servlet:jboss-servlet-api_4.0_spec ืฆื• io.quarkus:quarkus-undertow, ืจื™ืžื•ื•ื•ื™ื ื’ ืฆื•ื’ืขืฉื˜ืขืœื˜ , ื•ื•ื™ื™ึทืœ (ืœื•ื™ื˜ ื“ื™ ื“ืึธืงื•ืžืขื ื˜ืŸ) ื“ืขื Quarkus ืคืึทืจืœืขื ื’ืขืจื•ื ื’ ื’ื™ื˜ ืฉื˜ื™ืฆืŸ ืคึฟืึทืจ ืกืขืจื•ื•ืœืขืฅ.
    3. ืžื™ืจ ื‘ืึทื–ื™ื™ึทื˜ื™ืงืŸ ื“ื™ org.jboss.spec.javax.annotation:jboss-annotations-api_1.3_spec ื“ืขืคึผืขื ื“ืขื ืกื™ ื–ื™ื ื˜ ืขืก ืงื•ืžื˜ ืžื™ื˜ ื“ื™ ื“ื™ืคึผืขื ื“ืึทื ืกื™ื– ื•ื•ืึธืก ืžื™ืจ ื ืึธืจ ื’ืขื‘ื™ื˜ืŸ.

ื“ื™ ื•ื•ืขืจืกื™ืข ืคื•ืŸ โ€‹โ€‹ื“ื™ ืคึผืึธืž.ืงืกืžืœ ื˜ืขืงืข ืžื™ื˜ ืึทืœืข ื“ื™ ืขื ื“ืขืจื•ื ื’ืขืŸ ืื™ื– ืœื™ื’ืŸ ื‘ื™ื™ึท github.com/mrizzi/jboss-eap-quickstarts/blob/quarkus/helloworld/pom.xml.

ื‘ืึทืžืขืจืงื•ื ื’ ืึทื– ื“ื™ mvn io.quarkus:quarkus-maven-plugin:0.23.2:create ื‘ืึทืคึฟืขืœืŸ ืื•ื™ื‘ืŸ ื ื™ืฉื˜ ื‘ืœื•ื™ื– ืขื ื“ืขืจื•ื ื’ืขืŸ ื“ื™ ืคึผืึธืž.ืงืกืžืœ ื˜ืขืงืข, ืึธื‘ืขืจ ืื•ื™ืš ืžื•ืกื™ืฃ ืึท ื ื•ืžืขืจ ืคื•ืŸ ืงืึทืžืคึผืึธื•ื ืึทื ืฅ ืฆื• ื“ื™ ืคึผืจื•ื™ืขืงื˜, ื ื™ื™ืžืœื™ ื“ื™ ืคืืœื’ืขื ื“ืข ื˜ืขืงืขืก ืื•ืŸ ืคืึธืœื“ืขืจืก:

  • ื“ื™ mvnw ืื•ืŸ mvnw.cmd ื˜ืขืงืข ืื•ืŸ ื“ื™ .mvn ื˜ืขืงืข: Maven Wrapper ืึทืœืึทื•ื– ืื™ืจ ืฆื• ืœื•ื™ืคืŸ ืžืึทื•ื•ืขืŸ ืคึผืจืึทื“ื–ืฉืขืงืก ืคื•ืŸ ืึท ื’ืขื’ืขื‘ืŸ Maven ื•ื•ืขืจืกื™ืข ืึธืŸ ื™ื ืกื˜ืึธืœื™ื ื’ ื“ื™ ื•ื•ืขืจืกื™ืข.
  • ื“ืึธืงืงืขืจ ื˜ืขืงืข (ืื™ืŸ ื“ื™ src/main/ ื•ื•ืขื’ื•ื•ื™ื™ึทื–ืขืจ): ื“ืึธืก ื›ึผื•ืœืœ ื‘ื™ื™ืฉืคื™ืœืŸ Dockerfiles ืคึฟืึทืจ ื’ืขื‘ื•ื™ืจืŸ ืื•ืŸ jvm ืžืึธื“ืขืก (ืฆื•ื–ืืžืขืŸ ืžื™ื˜ ื“ื™ .dockerignore ื˜ืขืงืข).
  • ืจืขืกืึธื•ืจืกืขืก ื˜ืขืงืข (ืื™ืŸ ื“ื™ src/main/ ื•ื•ืขื’ื•ื•ื™ื™ึทื–ืขืจ): ื“ืึธืก ื›ึผื•ืœืœ ืึท ืœื™ื™ื“ื™ืง ืึทืคึผืœืึทืงื™ื™ืฉืึทืŸ.ืคึผืจืึธืคึผืขืจื˜ื™ืขืก ื˜ืขืงืข ืื•ืŸ ืึท ืžื•ืกื˜ืขืจ Quarkus index.html ืึธื ื”ื™ื™ื‘ ื‘ืœืึทื˜ (ื–ืขืŸ ืœื•ื™ืคืŸ ื“ื™ ืžืึทื“ืขืจื ื™ื™ื–ื“ ื”ืขืœืœืึธื•ื•ืึธืจืœื“ ืคึฟืึทืจ ืžืขืจ ื“ืขื˜ืึทื™ืœืก).

ืงืึทื˜ืขืจ ื”ืขืœืœืึธื•ื•ืึธืจืœื“
ืฆื• ืคึผืจื•ื‘ื™ืจืŸ ื“ื™ ืึทืคึผืœืึทืงื™ื™ืฉืึทืŸ, ืžื™ืจ ื ื•ืฆืŸ quarkus:dev, ื•ื•ืึธืก ืœืึธื ื˜ืฉื™ื– Quarkus ืื™ืŸ ืึทื ื˜ื•ื•ื™ืงืœื•ื ื’ ืžืึธื“ืข (ืคึฟืึทืจ ืžืขืจ ื“ืขื˜ืึทื™ืœืก, ื–ืขืŸ ื“ืขื ืึธืคึผื˜ื™ื™ืœื•ื ื’ ืื™ืŸ ื“ื™ ืžืึทื ื•ืึทืœ ืึทื ื˜ื•ื•ื™ืงืœื•ื ื’ ืžืึธื“ืข).

ื‘ืึทืžืขืจืงื•ื ื’: ื“ืขืจ ืฉืจื™ื˜ ื•ื•ืขื˜ ื“ืขืจื•ื•ืึทืจื˜ืŸ ืึท ื˜ืขื•ืช, ื•ื•ื™ื™ึทืœ ืžื™ืจ ื”ืึธื‘ืŸ ื ื™ืฉื˜ ื ืึธืš ื’ืขืžืื›ื˜ ืึทืœืข ื“ื™ ื ื™ื™ื˜ื™ืง ืขื ื“ืขืจื•ื ื’ืขืŸ.

ืื™ืฆื˜ ืœืึธื–ืŸ ืื•ื ื“ื– ืœื•ื™ืคืŸ ื“ื™ ื‘ืึทืคึฟืขืœ ืฆื• ื–ืขืŸ ื•ื•ื™ ืขืก ืึทืจื‘ืขื˜:

$ ./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

ืึทื–ื•ื™, ืขืก ื˜ื•ื˜ ื ื™ืฉื˜ ืึทืจื‘ืขื˜ืŸ ... ืคืืจื•ื•ืืก?

ื“ื™ UnsatisfiedResolutionException ื•ื•ื™ื™ื–ื˜ ืฆื• ื“ื™ HelloService ืงืœืึทืก, ื•ื•ืึธืก ืื™ื– ืึท ืžื™ื˜ื’ืœื™ื“ ืคื•ืŸ ื“ื™ HelloWorldServlet ืงืœืึทืก (ื–'ืื‘ื ืžื™ื˜ื’ืœื™ื“: org.jboss.as.quickstarts.helloworld.HelloWorldServlet#helloService). ื“ืขืจ ืคึผืจืึธื‘ืœืขื ืื™ื– ืึทื– HelloWorldServlet ื“ืึทืจืฃ ืึทืŸ ื™ื ื“ื–ืฉืขืงื˜ื™ื“ ื‘ื™ื™ึทืฉืคึผื™ืœ ืคื•ืŸ HelloService, ืื•ืŸ ืขืก ืงืขืŸ ื ื™ืฉื˜ ื–ื™ื™ืŸ ื’ืขืคึฟื•ื ืขืŸ (ื›ืึธื˜ืฉ ื‘ื™ื™ื“ืข ื“ื™ ืงืœืืกืŸ ื–ืขื ืขืŸ ืื™ืŸ ื“ืขืจ ื–ืขืœื‘ื™ืงืขืจ ืคึผืขืงืœ).

ืขืก ืก ืฆื™ื™ึทื˜ ืฆื• ืฆื•ืจื™ืงืงื•ืžืขืŸ ืฆื• ื“ืึทืงื™ื•ืžืขื ื˜ื™ื™ืฉืึทืŸ ืื•ืŸ ืœื™ื™ืขื ืขืŸ ื•ื•ื™ ืขืก ืึทืจื‘ืขื˜ ืื™ืŸ Quarkus ืึทืจื™ื™ึทื ืฉืคึผืจื™ืฆืŸ, ืื•ืŸ ื“ืขืจื™ื‘ืขืจ ืงืึธื ื˜ืขืงืกืฅ ืื•ืŸ ืึธืคืขื ื’ื™ืงื™ื™ึทื˜ ื™ื ื“ื–ืฉืขืงืฉืึทืŸ (CDI). ื“ืขืจื™ื‘ืขืจ, ืขืคืขื ืขืŸ ื“ื™ ืงืึทื ื˜ืขืงืกืฅ ืื•ืŸ ืึธืคืขื ื’ื™ืงื™ื™ึทื˜ ื™ื ื“ื–ืฉืขืงืฉืึทืŸ ืคื™ืจืŸ ืื•ืŸ ืื™ืŸ ื“ื™ ืึธืคึผื˜ื™ื™ืœื•ื ื’ ื‘ืขื‘ืœ ื“ื™ืกืงืึธื•ื•ืขืจื™ ืžื™ืจ ืœื™ื™ืขื ืขืŸ: "ื ื‘ืขื‘ืœ ืงืœืึทืก ื•ื•ืึธืก ื”ืื˜ ื ื™ืฉื˜ ืึท ื‘ืขื‘ืœ-ื“ื™ืคื™ื™ื ื™ื ื’ ืึทื ืึธื˜ืึทืฆื™ืข ืื™ื– ื ื™ืฉื˜ ื’ืขื–ื•ื›ื˜."

ื–ืืœ ืก ืงื•ืง ืื™ืŸ ื“ื™ HelloService ืงืœืึทืก - ืขืก ื˜ืึทืงืข ื˜ื•ื˜ ื ื™ืฉื˜ ื”ืึธื‘ืŸ ืึทื–ืึท ืึท ืึทื ืึธื˜ืึทืฆื™ืข. ื“ืขืจื™ื‘ืขืจ ื“ืึทืจืฃ ืžืขืŸ ืขืก ืฆื•ื’ืขื‘ืŸ ื›ึผื“ื™ ืงื•ื•ืึทืจืงื•ืก ื–ืึธืœ ื–ื•ื›ืŸ ืื•ืŸ ื’ืขืคึฟื™ื ืขืŸ ื“ื™ ื‘ืขื‘ืœ. ืื•ืŸ ื–ื™ื ื˜ ื“ืึธืก ืื™ื– ืึท ืกื˜ื™ื™ื˜ืœืึทืก ื›ื™ื™ืคืขืฅ, ืžื™ืจ ืงืขื ืขืŸ ืœื™ื™ื›ื˜ ืœื™ื™ื’ืŸ ื“ื™ @ApplicationScoped ืึทื ืึธื˜ืึทืฆื™ืข ื•ื•ื™ ื“ืึธืก:

@ApplicationScoped
public class HelloService {

ื‘ืึทืžืขืจืงื•ื ื’: ื“ืึธ ื“ื™ ืึทื ื˜ื•ื•ื™ืงืœื•ื ื’ ืกื•ื•ื™ื•ื•ืข ืงืขืŸ ืคืจืขื’ืŸ ืื™ืจ ืฆื• ืœื™ื™ื’ืŸ ื“ื™ ืคืืจืœืื ื’ื˜ ืคึผืขืงืœ (ื–ืขืŸ ืฉื•ืจื” ืื•ื ื˜ืŸ), ืื•ืŸ ืื™ืจ ื•ื•ืขื˜ ื”ืึธื‘ืŸ ืฆื• ื˜ืึธืŸ ื“ืึธืก ืžืึทื ื™ื•ืึทืœื™, ื•ื•ื™ ื“ืึธืก:

import javax.enterprise.context.ApplicationScoped;

ืื•ื™ื‘ ืื™ืจ ื–ืขื ื˜ ืื™ืŸ ืฆื•ื•ื™ื™ืคืœ ื•ื•ืขื’ืŸ ื•ื•ืึธืก ืคืึทืจื ืขื ื–ืึธืœ ื–ื™ื™ืŸ ื’ืขื ื™ืฆื˜ ืื™ืŸ ื“ืขื ืคืึทืœ ื•ื•ืขืŸ ืขืก ืื™ื– ื ื™ืฉื˜ ืกืคึผืขืกื™ืคื™ืขื“ ืคึฟืึทืจ ื“ื™ ืžืงื•ืจ ื‘ืขื‘ืœ, ืœื™ื™ืขื ืขืŸ ื“ื™ ื“ืึทืงื™ื•ืžืขื ื˜ื™ื™ืฉืึทืŸ JSR 365: ืงืึทื ื˜ืขืงืกืฅ ืื•ืŸ ืึธืคืขื ื’ื™ืงื™ื™ึทื˜ ื™ื ื“ื–ืฉืขืงืฉืึทืŸ ืคึฟืึทืจ Java 2.0 - ืคืขืœื™ืงื™ื™ึทื˜ ืคืึทืจื ืขื.

ืื™ืฆื˜ ืžื™ืจ ื•ื•ื™ื“ืขืจ ืคึผืจื•ื‘ื™ืจืŸ ืฆื• ืงืึทื˜ืขืจ ื“ื™ ืึทืคึผืœืึทืงื™ื™ืฉืึทืŸ ืžื™ื˜ ื“ื™ ื‘ืึทืคึฟืขืœ ./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]

ืื™ืฆื˜ ืึทืœืฅ ื’ื™ื™ื˜ ืึธืŸ ืขืจืจืึธืจืก.

ืœืึธื ื˜ืฉื™ื ื’ ื“ื™ ืžืึทื“ืขืจื ื™ื™ื–ื“ ื”ืขืœืœืึธื•ื•ืึธืจืœื“
ื•ื•ื™ ื’ืขืฉืจื™ื‘ืŸ ืื™ืŸ ื“ื™ ืงืœืึธืฅ, ืขืคืขื ืขืŸ ืขืก ืื™ืŸ ื“ืขื ื‘ืœืขื˜ืขืจืขืจ 0.0.0.0:8080 (ื“ื™ ืคืขืœื™ืงื™ื™ึทื˜ Quarkus ืึธื ื”ื™ื™ื‘ ื‘ืœืึทื˜) ืื•ืŸ ืžื™ืจ ื–ืขืŸ ื“ืขื:

Quarkus: ืึทืคึผืคึผืœื™ืงืึทื˜ื™ืึธืŸ ืžืึทื“ืขืจื ืึทื–ื™ื™ืฉืึทืŸ ื ื™ืฆืŸ ื”ืขืœืœืึธื•ื•ืึธืจืœื“ ื•ื•ื™ ืึท ื‘ื™ื™ืฉืคึผื™ืœ ืคึฟื•ืŸ JBoss EAP ืงื•ื•ื™ืงืงืกื˜ืึทืจื˜

ืจื™ื™ืก. 4. Quarkus dev ืึธื ื”ื™ื™ื‘ ื‘ืœืึทื˜.

ื“ื™ WebServlet ืึทื ืึธื˜ืึทืฆื™ืข ืคึฟืึทืจ ื“ืขื ืึทืคึผืœืึทืงื™ื™ืฉืึทืŸ ื›ึผื•ืœืœ ื“ื™ ืคืืœื’ืขื ื“ืข ืงืึธื ื˜ืขืงืกื˜ ื“ืขืคึฟื™ื ื™ืฆื™ืข:

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

ื“ืขืจื™ื‘ืขืจ, ืžื™ืจ ื’ื™ื™ืŸ ืื™ืŸ ื“ืขื ื‘ืœืขื˜ืขืจืขืจ ืฆื• 0.0.0.0:8080/HelloWorld ืื•ืŸ ืžื™ืจ ื–ืขืŸ ื“ื™ ืคืืœื’ืขื ื“ืข:

Quarkus: ืึทืคึผืคึผืœื™ืงืึทื˜ื™ืึธืŸ ืžืึทื“ืขืจื ืึทื–ื™ื™ืฉืึทืŸ ื ื™ืฆืŸ ื”ืขืœืœืึธื•ื•ืึธืจืœื“ ื•ื•ื™ ืึท ื‘ื™ื™ืฉืคึผื™ืœ ืคึฟื•ืŸ JBoss EAP ืงื•ื•ื™ืงืงืกื˜ืึทืจื˜

ืจื™ื™ืก. 5: ื“ื™ Quarkus ื“ืขื•ื• ื‘ืœืึทื˜ ืคึฟืึทืจ ื“ื™ ื”ืขืœื ื•ื•ืขืœื˜ ืึทืคึผืœืึทืงื™ื™ืฉืึทืŸ.

ื ื•, ืึทืœืฅ ืึทืจื‘ืขื˜.

ืื™ืฆื˜ ืœืึธื–ืŸ ืื•ื ื“ื– ืžืึทื›ืŸ ืขื ื“ืขืจื•ื ื’ืขืŸ ืฆื• ื“ื™ ืงืึธื“. ื‘ืึทืžืขืจืงื•ื ื’ ืึทื– ื“ื™ ./mvnw ืงืึทืžืคึผื™ื™ืœ quarkus:dev ื‘ืึทืคึฟืขืœ ืื™ื– ื ืึธืš ืคืœื™ืกื ื“ื™ืง ืื•ืŸ ืžื™ืจ ื”ืึธื‘ืŸ ืงื™ื™ืŸ ื›ื•ื•ื ื” ืฆื• ื”ืึทืœื˜ืŸ ืขืก. ืื™ืฆื˜ ืœืึธืžื™ืจ ืคึผืจื•ื‘ื™ืจืŸ ืฆื• ืฆื•ืœื™ื™ื’ืŸ ื“ื™ ื–ืขืœื‘ืข - ื–ื™ื™ืขืจ ื ื™ืฉื˜ื™ืง - ืขื ื“ืขืจื•ื ื’ืขืŸ ืฆื• ื“ื™ ืงืึธื“ ื–ื™ืš ืื•ืŸ ื–ืขืŸ ื•ื•ื™ Quarkus ืžืื›ื˜ ืœืขื‘ืŸ ื’ืจื™ื ื’ืขืจ ืคึฟืึทืจ ื“ื™ ื“ืขื•ื•ืขืœืึธืคึผืขืจ:

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

ื”ื™ื˜ ื“ื™ ื˜ืขืงืข ืื•ืŸ ื“ืขืจืคืจื™ืฉืŸ ื“ื™ ื•ื•ืขื‘ ื‘ืœืึทื˜ ืฆื• ื–ืขืŸ ื”ืขืœื ืžืึทืจืงืึธ, ื•ื•ื™ ื’ืขื•ื•ื™ื–ืŸ ืื™ืŸ ื“ื™ ืกืงืจืขืขื ืฉืึธื˜ ืื•ื ื˜ืŸ:

Quarkus: ืึทืคึผืคึผืœื™ืงืึทื˜ื™ืึธืŸ ืžืึทื“ืขืจื ืึทื–ื™ื™ืฉืึทืŸ ื ื™ืฆืŸ ื”ืขืœืœืึธื•ื•ืึธืจืœื“ ื•ื•ื™ ืึท ื‘ื™ื™ืฉืคึผื™ืœ ืคึฟื•ืŸ JBoss EAP ืงื•ื•ื™ืงืงืกื˜ืึทืจื˜

ืจื™ื™ืก. 6. ื”ืขืœื ืžืึทืจืงืึธ ื‘ืœืึทื˜ ืื™ืŸ Quarkus dev.

ืื™ืฆื˜ ืœืึธืžื™ืจ ืงืึธื ื˜ืจืึธืœื™ืจืŸ ื“ื™ ืจืขื–ื•ืœื˜ืึทื˜ ืื™ืŸ ื“ื™ ื•ื•ืึธืงื–ืึทืœ:

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

ื“ืขืจ ื“ืขืจืคืจื™ืฉืŸ ื‘ืœืึทื˜ ื˜ืจื™ื’ืขืจื“ ื“ื™ ื“ื™ื˜ืขืงืฉืึทืŸ ืคื•ืŸ ืขื ื“ืขืจื•ื ื’ืขืŸ ืื™ืŸ ื“ื™ ืžืงื•ืจ ืงืึธื“, ืื•ืŸ Quarkus ืื•ื™ื˜ืึธืžืึทื˜ื™ืฉ ื“ื•ืจื›ื’ืขืงืึธื›ื˜ ืึท ื”ืึทืœื˜ืŸ-ืึธื ื”ื™ื™ื‘ ืคึผืจืึธืฆืขื“ื•ืจ. ืื•ืŸ ืึทืœืข ื“ืขื ืื™ื– ื’ืขื•ื•ืขืŸ ื’ืขืขื ื“ื™ืงื˜ ืื™ืŸ ื‘ืœื•ื™ื– 0.371 ืกืขืงื•ื ื“ืขืก (ื“ืึธ ืขืก ืื™ื– ืึทื– "ื”ื™ื ื˜ืขืจ-ืฉื ืขืœ ืกื•ื‘ืึทื˜ืึธืžื™ืง ื“ื–ืฉืึทื•ื•ืึท").

ื‘ื•ื™ืขืŸ ื”ืขืœืœืึธื•ื•ืึธืจืœื“ ืื™ืŸ ืึท JAR ืคึผืขืงืœ
ืื™ืฆื˜ ืึทื– ื“ืขืจ ืงืึธื“ ืึทืจื‘ืขื˜ ื•ื•ื™ ืขืก ื–ืึธืœ, ืœืึธื–ืŸ ืื•ื ื“ื– ืคึผืขืงืœ ืขืก ืžื™ื˜ ื“ื™ ืคืืœื’ืขื ื“ืข ื‘ืึทืคึฟืขืœ:

$ ./mvnw clean package

ื“ืขืจ ื‘ืึทืคึฟืขืœ ืงืจื™ื™ื™ืฅ ืฆื•ื•ื™ื™ JAR ื˜ืขืงืขืก ืื™ืŸ ื“ื™ /target ื˜ืขืงืข: ื“ื™ ื”ืขืœืœืึธื•ื•ืึธืจืœื“-.ื“ื–ืฉืึทืจ ื˜ืขืงืข, ื•ื•ืึธืก ืื™ื– ืึท ื ืึธืจืžืึทืœ ืึทืจื˜ืึทืคืึทืงื˜ ืึทืกืขืžื‘ืึทืœื“ ื“ื•ืจืš ื“ื™ ืžืึทื•ื•ืขืŸ ืžืึทื ืฉืึทืคึฟื˜ ืฆื•ื–ืึทืžืขืŸ ืžื™ื˜ ื“ื™ ืงืœืืกืŸ ืื•ืŸ ืจืขืกื•ืจืกืŸ ืคื•ืŸ ื“ื™ ืคึผืจื•ื™ืขืงื˜. ืื•ืŸ ื“ื™ ื”ืขืœืœืึธื•ื•ืึธืจืœื“-runner.jar ื˜ืขืงืข, ื•ื•ืึธืก ืื™ื– ืึทืŸ ืขืงืกืขืงื•ื˜ืึทื‘ืœืข JAR.

ื‘ื™ื˜ืข ื˜ืึธืŸ ืึทื– ื“ืึธืก ืื™ื– ื ื™ืฉื˜ ืึทืŸ ื•ื‘ืขืจ-ืกืœื•ื™, ื•ื•ื™ื™ึทืœ ืึทืœืข ื“ื™ืคึผืขื ื“ืึทื ืกื™ื– ื–ืขื ืขืŸ ืคืฉื•ื˜ ืงืึทืคึผื™ื“ ืื™ืŸ ื“ื™ /target/lib ื˜ืขืงืข (ื ื™ื˜ ืคึผืึทืงื™ื“ื–ืฉื“ ืื™ืŸ ืึท JAR ื˜ืขืงืข). ื“ืขืจื™ื‘ืขืจ, ืฆื• ืœื•ื™ืคืŸ ื“ืขื JAR ืคึฟื•ืŸ ืืŸ ืื ื“ืขืจ ื˜ืขืงืข ืึธื“ืขืจ ืื•ื™ืฃ ืืŸ ืื ื“ืขืจ ื‘ืึทืœืขื‘ืึธืก, ืื™ืจ ื“ืึทืจืคึฟืŸ ืฆื• ื ืึธื›ืžืึทื›ืŸ ื‘ื™ื™ื“ืข ื“ื™ JAR ื˜ืขืงืข ื–ื™ืš ืื•ืŸ ื“ื™ / lib ื˜ืขืงืข ื“ืึธืจื˜, ื•ื•ื™ื™ึทืœ ื“ื™ Class-Path ืขืœืขืžืขื ื˜ ืื™ืŸ ื“ื™ MANIFEST.MF ื˜ืขืงืข ืื™ืŸ ื“ื™ JAR ืคึผืขืงืœ ื›ึผื•ืœืœ ืึท ื™ืงืกืคึผืœื™ืกืึทื˜ ืœื™ืกื˜ื™ื ื’ ืคื•ืŸ JARs ืคึฟื•ืŸ lib ืคืึธืœื“ืขืจืก
ืฆื• ืœืขืจื ืขืŸ ื•ื•ื™ ืฆื• ืฉืึทืคึฟืŸ uber-jar ืึทืคึผืœืึทืงื™ื™ืฉืึทื ื–, ื‘ื™ื˜ืข ืึธืคึผืฉื™ืงืŸ ืฆื• ื“ื™ ื˜ื•ื˜ืึธืจื™ืึทืœ Uber-Jar Creation.

ืงืึทื˜ืขืจ ื”ืขืœืœืึธื•ื•ืึธืจืœื“ ืคึผืึทืงื™ื“ื–ืฉื“ ืื™ืŸ JAR

ืื™ืฆื˜ ืžื™ืจ ืงืขื ืขืŸ ืœื•ื™ืคืŸ ืื•ื ื“ื–ืขืจ JAR ื ื™ืฆืŸ ื“ื™ ื ืึธืจืžืึทืœ ื–'ืื‘ื ื‘ืึทืคึฟืขืœ:

$ 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]

ื ืึธืš ืึทืœืข ื“ืขื ืื™ื– ื’ืขื˜ืืŸ, ื’ื™ื™ืŸ ืฆื• ื“ื™ื™ืŸ ื‘ืœืขื˜ืขืจืขืจ ื‘ื™ื™ึท 0.0.0.0:8080 ืื•ืŸ ื˜ืฉืขืง ืึทื– ืึทืœืฅ ืึทืจื‘ืขื˜ ื•ื•ื™ ืขืก ื–ืึธืœ.

ืงืึทืžืคึผื™ื™ืœื™ื ื’ ื”ืขืœืœืึธื•ื•ืึธืจืœื“ ืื™ืŸ ืึท ื’ืขื‘ื•ื™ืจืŸ ืขืงืกืขืงื•ื˜ืึทื‘ืœืข ื˜ืขืงืข

ืึทื–ื•ื™ ืื•ื ื“ื–ืขืจ ื”ืขืœืœืึธื•ื•ืึธืจืœื“ ืœื•ื™ืคื˜ ื•ื•ื™ ืึท ืกื˜ืึทื ื“ืึทืœืึธื ืข Java ืึทืคึผืœืึทืงื™ื™ืฉืึทืŸ ื ื™ืฆืŸ Quarkus ื“ื™ืคึผืขื ื“ืึทื ืกื™ื–. ืึธื‘ืขืจ ืื™ืจ ืงืขื ืขืŸ ื’ื™ื™ืŸ ื•ื•ื™ื™ึทื˜ืขืจ ืื•ืŸ ื•ื•ืขื ื“ืŸ ืขืก ืื™ืŸ ืึท ื’ืขื‘ื•ื™ืจืŸ ืขืงืกืขืงื•ื˜ืึทื‘ืœืข ื˜ืขืงืข.

ื™ื ืกื˜ืึธืœื™ื ื’ GraalVM
ืขืจืฉื˜ืขืจ ืคื•ืŸ ืึทืœืข, ืคึฟืึทืจ ื“ืขื ืื™ืจ ื“ืึทืจืคึฟืŸ ืฆื• ื™ื ืกื˜ืึทืœื™ืจืŸ ื“ื™ ื ื™ื™ื˜ื™ืง ืžื›ืฉื™ืจื™ื:

1. ืืจืืคืงืืคื™ืข GraalVM 19.2.0.1 ืคึฟื•ืŸ github.com/oracle/graal/releases/tag/vm-19.2.0.1.

2. ื™ืงืกืคึผืึทื ื“ ื“ื™ ื“ืึทื•ื ืœืึธื•ื“ื™ื“ ืึทืจืงื™ื™ื•ื•:

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

3. ื’ื™ื™ืŸ ืฆื• ื“ื™ ื•ื ื˜ืึท ื˜ืขืงืข.

4. ืœื•ื™ืคืŸ ื“ื™ ื‘ืึทืคึฟืขืœ ืื•ื ื˜ืŸ ืฆื• ืึธืคึผืœืึธื“ื™ืจืŸ ืื•ืŸ ืœื™ื™ื’ืŸ ื“ื™ ื’ืขื‘ื•ื™ืจืŸ ื‘ื™ืœื“:

$ ./bin/gu install native-image

5. ืจืขื’ื™ืกื˜ืจื™ืจืŸ ื“ื™ ื˜ืขืงืข ื‘ืืฉืืคืŸ ืื™ืŸ ืฉืจื™ื˜ 2 ืฆื• ื“ื™ GRAALVM_HOME ืกื•ื•ื™ื•ื•ืข ื‘ื™ื™ึทื˜ืขื•ื•ื“ื™ืง:

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

ืคึฟืึทืจ ืžืขืจ ืื™ื ืคึฟืึธืจืžืึทืฆื™ืข ืื•ืŸ ื™ื™ึทื ืžืึธื ื˜ื™ืจื•ื ื’ ื™ื ืกื˜ืจืึทืงืฉืึทื ื– ืื•ื™ืฃ ืื ื“ืขืจืข ืึทืก, ื–ืขืŸ ื“ื™ ืžืึทื ื•ืึทืœ ื‘ื•ื™ืขืŸ ืึท ื’ืขื‘ื•ื™ืจืŸ ืขืงืกืขืงื•ื˜ืึทื‘ืœืข - ืคึผืจื™ืจืขืงื•ื•ืึทื–ืึทืฅ.

ื‘ื•ื™ืขืŸ ื”ืขืœืœืึธื•ื•ืึธืจืœื“ ืื™ืŸ ืึท ื’ืขื‘ื•ื™ืจืŸ ืขืงืกืขืงื•ื˜ืึทื‘ืœืข ื˜ืขืงืข
ืœื™ื™ืขื ืขืŸ ื“ื™ ืžืึทื ื•ืึทืœ ื‘ื•ื™ืขืŸ ืึท ื ืึทื˜ื™ื•ื•ืข ืขืงืกืขืงื•ื˜ืึทื‘ืœืข-ืคึผืจืึทื“ื•ืกื™ื ื’ ืึท ื’ืขื‘ื•ื™ืจืŸ ืขืงืกืขืงื•ื˜ืึทื‘ืœืข: "ืื™ืฆื˜ ืœืึธืžื™ืจ ืžืึทื›ืŸ ืึท ื’ืขื‘ื•ื™ืจืŸ ืขืงืกืขืงื•ื˜ืึทื‘ืœืข ื˜ืขืงืข ืคึฟืึทืจ ืื•ื ื“ื–ืขืจ ืึทืคึผืœืึทืงื™ื™ืฉืึทืŸ ืฆื• ืจืขื“ื•ืฆื™ืจืŸ ื“ื™ ืงืึทื˜ืขืจ ืฆื™ื™ื˜ ืื•ืŸ ื“ื™ืกืง ื’ืจื™ื™ืก. ื“ื™ ืขืงืกืขืงื•ื˜ืึทื‘ืœืข ื˜ืขืงืข ื•ื•ืขื˜ ื”ืึธื‘ืŸ ืึทืœืฅ ื ื™ื™ื˜ื™ืง ืฆื• ืœื•ื™ืคืŸ ื“ื™ ืึทืคึผืœืึทืงื™ื™ืฉืึทืŸ, ืึทืจื™ื™ึทื ื’ืขืจืขื›ื ื˜ ื“ื™ JVM (ืึธื“ืขืจ ื’ืึทื ืฅ, ืึท ื˜ืจืึทื ื’ืงื™ื™ื˜ื™ื“ ื•ื•ืขืจืกื™ืข ืคื•ืŸ โ€‹โ€‹โ€‹โ€‹ืขืก, ืžื™ื˜ ื‘ืœื•ื™ื– ื•ื•ืึธืก ืื™ื– ืคืืจืœืื ื’ื˜ ืฆื• ืœื•ื™ืคืŸ ื“ื™ ืึทืคึผืœืึทืงื™ื™ืฉืึทืŸ) ืื•ืŸ ืื•ื ื“ื–ืขืจ ืึทืคึผืœืึทืงื™ื™ืฉืึทืŸ ื–ื™ืš.

ืฆื• ืฉืึทืคึฟืŸ ืึท ื’ืขื‘ื•ื™ืจืขื ืขืจ ืขืงืกืขืงื•ื˜ืึทื‘ืœืข ื˜ืขืงืข, ืื™ืจ ื“ืึทืจืคึฟืŸ ืฆื• ื’ืขื‘ืŸ ื“ื™ ื’ืขื‘ื•ื™ืจืŸ Maven ืคึผืจืึธืคื™ืœ:

$ ./mvnw package -Pnative

ืื•ื ื“ื–ืขืจ ื‘ื•ื™ืขืŸ ื’ืขื ื•ืžืขืŸ ืื™ื™ืŸ ืžื™ื ื•ื˜ ืื•ืŸ 10 ืกืขืงื•ื ื“ืขืก, ืื•ืŸ ื“ื™ ืœืขืฆื˜ ื”ืขืœืœืึธื•ื•ืึธืจืœื“-ืœื•ื™ืคืขืจ ืค ื˜ืขืงืข ืื™ื– ื‘ืืฉืืคืŸ ืื™ืŸ ื“ื™ / ืฆื™ืœ ื˜ืขืงืข.

ืœื•ื™ืคืŸ ื“ื™ ื’ืขื‘ื•ื™ืจืขื ืขืจ ื”ืขืœืœืึธื•ื•ืึธืจืœื“ ืขืงืกืขืงื•ื˜ืึทื‘ืœืข

ืื™ืŸ ื“ื™ ืคืจื™ืขืจื“ื™ืงืข ืฉืจื™ื˜, ืžื™ืจ ื‘ืืงื•ืžืขืŸ ื“ื™ ืขืงืกืขืงื•ื˜ืึทื‘ืœืข ื˜ืขืงืข /target/helloworldโ€”runner. ืื™ืฆื˜ ืœืึธื–ืŸ ืื•ื ื“ื– ืœื•ื™ืคืŸ ืขืก:

$ ./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]

ืขืคึฟืขื ืขืŸ ืขืก ื•ื•ื™ื“ืขืจ ืื™ืŸ ื“ืขื ื‘ืœืขื˜ืขืจืขืจ 0.0.0.0:8080 ืื•ืŸ ื˜ืฉืขืง ืึทื– ืึทืœืฅ ืึทืจื‘ืขื˜ ื•ื•ื™ ืขืก ื–ืึธืœ.

ืฆื• ื–ื™ื™ืŸ ืคืืจื‘ืœื™ื‘ืŸ!

ืžื™ืจ ื’ืœื•ื™ื‘ืŸ ืึทื– ื“ืขืจ ืื•ืคึฟืŸ ืคื•ืŸ ืžืึทื“ืขืจื ื™ื™ื–ื™ื ื’ ื–'ืื‘ื ืึทืคึผืœืึทืงื™ื™ืฉืึทื ื– ื ื™ืฆืŸ Quarkus ืงื™ื™ืคึผืึทื‘ื™ืœืึทื˜ื™ื– ื“ื™ืกืงืึทืกื˜ ืื™ืŸ ื“ืขื ืคึผืึธืกื˜ืŸ (ืึธืœื‘ื™ื™ื˜ ื ื™ืฆืŸ ืึท ืคึผืฉื•ื˜ ื‘ื™ื™ึทืฉืคึผื™ืœ) ื–ืึธืœ ื–ื™ื™ืŸ ืึทืงื˜ื™ื•ื•ืœื™ ื’ืขื ื™ืฆื˜ ืื™ืŸ ืคืึทืงื˜ื™ืฉ ืœืขื‘ืŸ. ืื™ืŸ ื˜ืืŸ ืึทื–ื•ื™, ืื™ืจ ื•ื•ืขื˜ ืžืกืชึผืžื ื˜ืจืขืคืŸ ืึท ื ื•ืžืขืจ ืคื•ืŸ ืคึผืจืึธื‘ืœืขืžืก, ื•ื•ืึธืก ืžื™ืจ ื•ื•ืขืœืŸ ื˜ื™ื™ืœื•ื•ื™ื™ื– ืึทื“ืจืขืก ืื™ืŸ ื“ืขืจ ื•ื•ื™ื™ึทื˜ืขืจ ืคึผืึธืกื˜ืŸ, ื•ื•ื• ืžื™ืจ ื•ื•ืขืœืŸ ืจืขื“ืŸ ื•ื•ืขื’ืŸ ื•ื•ื™ ืฆื• ืžืขืกื˜ืŸ ื–ื›ึผืจื•ืŸ ืงืึทื ืกืึทืžืฉืึทืŸ ืฆื• ืึทืกืกืขืกืก ืคืึธืจืฉื˜ืขืœื•ื ื’ ื™ืžืคึผืจื•ื•ื•ืžืึทื ืฅ, ืึท ื•ื•ื™ื›ื˜ื™ืง ื˜ื™ื™ืœ ืคื•ืŸ ื“ื™ ื’ืื ืฆืข ืึทืคึผืœืึทืงื™ื™ืฉืึทืŸ ืžืึทื“ืขืจื ื™ื™ื–ื™ื™ืฉืึท ืคึผืจืึธืฆืขืก.

ืžืงื•ืจ: www.habr.com

ืœื™ื™ื’ืŸ ืึท ื‘ืึทืžืขืจืงื•ื ื’