ΠΠ΄ΡΠ°Π²ΠΎ Π½Π° ΡΠΈΡΠ΅ Π½Π° ΠΎΠ²ΠΎΡ Π±Π»ΠΎΠ³, Π΅Π²Π΅ Π³ΠΎ ΡΠ΅ΡΠ²ΡΡΠΈΠΎΡ ΠΏΠΎΡΡ ΠΎΠ΄ ΡΠ΅ΡΠΈΡΠ°ΡΠ° ΠΠ²Π°ΡΠΊΡΡ!
ΠΠ²Π΄Π΅ Π΅ Π²Π°ΠΆΠ½ΠΎ Π΄Π° ΡΠ΅ Π·Π°Π±Π΅Π»Π΅ΠΆΠΈ Π΄Π΅ΠΊΠ° ΠΈ Quarkus ΠΈ JBoss EAP Π½Π°Π³Π»Π°ΡΡΠ²Π°Π°Ρ ΠΊΠΎΡΠΈΡΡΠ΅ΡΠ΅ Π½Π° Π°Π»Π°ΡΠΊΠΈ ΡΡΠΎ ΡΠ΅ ΠΊΠΎΠ»ΠΊΡ ΡΡΠΎ Π΅ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΡΠ½ΠΎΠ²Π°Π½ΠΈ Π½Π° ΡΡΠ°Π½Π΄Π°ΡΠ΄ΠΈ. ΠΠ΅ΠΌΠ°ΡΠ΅ Π°ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡΠ° ΠΊΠΎΡΠ° ΡΠ°Π±ΠΎΡΠΈ Π½Π° JBoss EAP? ΠΠ΅ΠΌΠ° ΠΏΡΠΎΠ±Π»Π΅ΠΌ, ΠΌΠΎΠΆΠ΅ Π»Π΅ΡΠ½ΠΎ Π΄Π° ΡΠ΅ ΠΏΡΠ΅ΡΡΠ»ΠΈ ΠΎΠ΄ Π²Π°ΡΠΈΠΎΡ ΡΠ΅ΠΊΠΎΠ²Π΅Π½ ΡΠ΅ΡΠ²Π΅Ρ Π·Π° Π°ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΠΈ Π½Π° 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/
ΠΡΠ΄Π΅ Π΄Π° Π²ΠΈΠ΄ΠΈΠΌΠ΅ ΠΊΠ°ΠΊΠΎ ΡΡΠ½ΠΊΡΠΈΠΎΠ½ΠΈΡΠ° ΠΎΡΠΈΠ³ΠΈΠ½Π°Π»Π½ΠΈΠΎΡ helloworld
ΠΡΡΡΠ½ΠΎΡΡ, ΡΡΡΡΠΈΠ½Π°ΡΠ° Π½Π° ΠΎΠ²Π°Π° Π°ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡΠ° Π΅ ΡΠ°ΡΠ½Π° ΠΎΠ΄ ΠΈΠΌΠ΅ΡΠΎ, Π½ΠΎ Π½ΠΈΠ΅ ΡΠ΅ Π³ΠΎ ΠΌΠΎΠ΄Π΅ΡΠ½ΠΈΠ·ΠΈΡΠ°ΠΌΠ΅ Π½Π΅ΡΠ·ΠΈΠ½ΠΈΠΎΡ ΠΊΠΎΠ΄ ΡΡΡΠΎΠ³ΠΎ Π½Π°ΡΡΠ½ΠΎ. ΠΠ°ΡΠΎΠ°, ΠΏΡΠ²ΠΎ, Π΄Π° ΡΠ° ΠΏΠΎΠ³Π»Π΅Π΄Π½Π΅ΠΌΠ΅ ΠΎΠ²Π°Π° Π°ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡΠ° Π²ΠΎ Π½Π΅ΡΠ·ΠΈΠ½Π°ΡΠ° ΠΎΡΠΈΠ³ΠΈΠ½Π°Π»Π½Π° ΡΠΎΡΠΌΠ°.
Π Π°ΡΠΏΠΎΡΠ΅Π΄ΡΠ²Π°ΡΠ΅ Π½Π° helloworld
1. ΠΡΠ²ΠΎΡΠ΅ΡΠ΅ ΡΠ΅ΡΠΌΠΈΠ½Π°Π» ΠΈ ΠΎΠ΄Π΅ΡΠ΅ Π²ΠΎ ΠΊΠΎΡΠ΅Π½ΠΎΡ Π½Π° ΠΏΠ°ΠΏΠΊΠ°ΡΠ° JBoss EAP (ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΡΠ° ΠΏΡΠ΅Π·Π΅ΠΌΠ΅ΡΠ΅
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. ΠΡΠ²ΠΎΡΠ΅ΡΠ΅ Π²ΠΎ ΠΏΡΠ΅Π»ΠΈΡΡΡΠ²Π°Ρ
ΠΡΠΈΠ·. 1. ΠΠΎΡΠ΅ΡΠ½Π° ΡΡΡΠ°Π½ΠΈΡΠ° Π½Π° JBoss EAP.
4. Π‘Π»Π΅Π΄Π΅ΡΠ΅ Π³ΠΈ ΡΠΏΠ°ΡΡΡΠ²Π°ΡΠ° Π²ΠΎ ΡΠΏΠ°ΡΡΡΠ²ΠΎΡΠΎ
$ mvn clean install wildfly:deploy
ΠΠΎ ΡΡΠΏΠ΅ΡΠ½ΠΎ ΠΈΠ·Π²ΡΡΡΠ²Π°ΡΠ΅ Π½Π° ΠΎΠ²Π°Π° ΠΊΠΎΠΌΠ°Π½Π΄Π°, ΡΠ΅ Π²ΠΈΠ΄ΠΈΠΌΠ΅ Π½Π΅ΡΡΠΎ ΠΊΠ°ΠΊΠΎ ΡΠ»Π΅Π΄Π½ΠΎΠ²ΠΎ Π²ΠΎ Π΄Π½Π΅Π²Π½ΠΈΠΊΠΎΡ:
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 8.224 s
ΠΠ½Π°ΡΠΈ, ΠΏΡΠ²ΠΎΡΠΎ ΡΠ°ΡΠΏΠΎΡΠ΅Π΄ΡΠ²Π°ΡΠ΅ Π½Π° Π°ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡΠ°ΡΠ° helloworld Π½Π° JBoss EAP ΡΡΠ°Π΅ΡΠ΅ Π½Π΅ΡΡΠΎ ΠΏΠΎΠ²Π΅ΡΠ΅ ΠΎΠ΄ 8 ΡΠ΅ΠΊΡΠ½Π΄ΠΈ.
Π’Π΅ΡΡΠΈΡΠ°ΡΠ΅ Π½Π° helloworld
ΠΠΎΡΡΠ°ΠΏΡΠ²Π°ΡΡΠΈ ΡΡΡΠΎΠ³ΠΎ ΡΠΏΠΎΡΠ΅Π΄ ΡΠΏΠ°ΡΡΡΠ²Π°ΡΠ°
ΠΡΠΈΠ·. 2. ΠΡΠΈΠ³ΠΈΠ½Π°Π»Π΅Π½ Hello World ΠΎΠ΄ JBoss EAP.
ΠΡΠ°Π²Π΅ΡΠ΅ ΠΏΡΠΎΠΌΠ΅Π½ΠΈ
ΠΡΠΎΠΌΠ΅Π½Π΅ΡΠ΅ Π³ΠΎ Π²Π»Π΅Π·Π½ΠΈΠΎΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΠ°Ρ createHelloMessage(String name) ΠΎΠ΄ World Π²ΠΎ Marco:
writer.println("<h1>" + helloService.createHelloMessage("Marco") + "</h1>");
ΠΠΎΠ²ΡΠΎΡΠ½ΠΎ ΠΈΠ·Π²ΡΡΠ΅ΡΠ΅ ΡΠ° ΡΠ»Π΅Π΄Π½Π°Π²Π° ΠΊΠΎΠΌΠ°Π½Π΄Π°:
$ mvn clean install wildfly:deploy
ΠΠΎΡΠΎΠ° ΡΠ° ΠΎΡΠ²Π΅ΠΆΡΠ²Π°ΠΌΠ΅ ΡΡΡΠ°Π½ΠΈΡΠ°ΡΠ° Π²ΠΎ ΠΏΡΠ΅Π»ΠΈΡΡΡΠ²Π°ΡΠΎΡ ΠΈ Π³Π»Π΅Π΄Π°ΠΌΠ΅ Π΄Π΅ΠΊΠ° ΡΠ΅ΠΊΡΡΠΎΡ Π΅ ΠΏΡΠΎΠΌΠ΅Π½Π΅Ρ:
ΠΡΠΈΠ·. 3. ΠΠ΄ΡΠ°Π²ΠΎ ΠΠ°ΡΠΊΠΎ Π²ΠΎ JBoss EAP.
ΠΡΠ°ΡΠ΅ΡΠ΅ Π³ΠΎ ΡΠ°ΡΠΏΠΎΡΠ΅Π΄ΡΠ²Π°ΡΠ΅ΡΠΎ Π½Π° helloworld ΠΈ ΠΈΡΠΊΠ»ΡΡΠ΅ΡΠ΅ Π³ΠΎ JBoss EAP
ΠΠ²Π° Π΅ ΠΎΠΏΡΠΈΠΎΠ½Π°Π»Π½ΠΎ, Π½ΠΎ Π°ΠΊΠΎ ΡΠ°ΠΊΠ°ΡΠ΅ Π΄Π° Π³ΠΎ ΠΎΡΠΊΠ°ΠΆΠ΅ΡΠ΅ ΡΠ°ΡΠΏΠΎΡΠ΅Π΄ΡΠ²Π°ΡΠ΅ΡΠΎ, ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π³ΠΎ Π½Π°ΠΏΡΠ°Π²ΠΈΡΠ΅ ΡΠΎ ΡΠ»Π΅Π΄Π½Π°Π²Π° ΠΊΠΎΠΌΠ°Π½Π΄Π°:
$ mvn clean install wildfly:undeploy
ΠΠ° Π΄Π° Π³ΠΎ ΠΈΡΠΊΠ»ΡΡΠΈΡΠ΅ ΠΏΡΠΈΠΌΠ΅ΡΠΎΡ Π½Π° JBoss EAP, Π΅Π΄Π½ΠΎΡΡΠ°Π²Π½ΠΎ ΠΏΡΠΈΡΠΈΡΠ½Π΅ΡΠ΅ Ctrl+C Π²ΠΎ ΡΠ΅ΡΠΌΠΈΠ½Π°Π»Π½ΠΈΠΎΡ ΠΏΡΠΎΠ·ΠΎΡΠ΅Ρ.
ΠΠ°Π΄Π³ΡΠ°Π΄Π±Π° Π½Π° helloworld
Π‘Π΅Π³Π° Π΄Π° ΡΠ° ΠΌΠΎΠ΄Π΅ΡΠ½ΠΈΠ·ΠΈΡΠ°ΠΌΠ΅ ΠΎΡΠΈΠ³ΠΈΠ½Π°Π»Π½Π°ΡΠ° Π°ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡΠ° helloworld.
Π‘ΠΎΠ·Π΄Π°Π΄Π΅ΡΠ΅ Π½ΠΎΠ²Π° Π³ΡΠ°Π½ΠΊΠ°
ΠΠΈΠ΅ ΡΠΎΠ·Π΄Π°Π²Π°ΠΌΠ΅ Π½ΠΎΠ²Π° ΡΠ°Π±ΠΎΡΠ½Π° Π³ΡΠ°Π½ΠΊΠ° ΠΏΠΎ Π·Π°Π²ΡΡΡΠ²Π°ΡΠ΅ΡΠΎ Π½Π° ΠΏΡΠΎΠ΅ΠΊΡΠΎΡ Π·Π° Π±ΡΠ· ΠΏΠΎΡΠ΅ΡΠΎΠΊ:
$ git checkout -b quarkus 7.2.0.GA
ΠΡΠΎΠΌΠ΅Π½Π° Π½Π° Π΄Π°ΡΠΎΡΠ΅ΠΊΠ°ΡΠ° pom.xml
ΠΠ΅ Π·Π°ΠΏΠΎΡΠ½Π΅ΠΌΠ΅ Π΄Π° ΡΠ° ΠΌΠ΅Π½ΡΠ²Π°ΠΌΠ΅ Π°ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡΠ°ΡΠ° ΠΎΠ΄ Π΄Π°ΡΠΎΡΠ΅ΠΊΠ°ΡΠ° pom.xml. ΠΠ° Π΄Π° Π΄ΠΎΠ·Π²ΠΎΠ»ΠΈΡΠ΅ Quarkus Π΄Π° Π²ΠΌΠ΅ΡΠ½ΡΠ²Π° XML Π±Π»ΠΎΠΊΠΎΠ²ΠΈ Π²ΠΎ Π½Π΅Π³ΠΎ, ΠΈΠ·Π²ΡΡΠ΅ΡΠ΅ ΡΠ° ΡΠ»Π΅Π΄Π½Π°Π²Π° ΠΊΠΎΠΌΠ°Π½Π΄Π° Π²ΠΎ ΠΏΠ°ΠΏΠΊΠ°ΡΠ° helloworld:
$ mvn io.quarkus:quarkus-maven-plugin:0.23.2:create
ΠΡΠΈ ΠΏΠΈΡΡΠ²Π°ΡΠ΅ΡΠΎ Π½Π° ΠΎΠ²ΠΎΡ Π½Π°ΠΏΠΈΡ, ΠΊΠΎΡΠΈΡΡΠ΅Π½Π° Π΅ Π²Π΅ΡΠ·ΠΈΡΠ° 0.23.2. Quarkus ΡΠ΅ΡΡΠΎ ΠΎΠ±ΡΠ°Π²ΡΠ²Π° Π½ΠΎΠ²ΠΈ Π²Π΅ΡΠ·ΠΈΠΈ, ΠΊΠΎΡΠ° Π²Π΅ΡΠ·ΠΈΡΠ° Π΅ Π½Π°ΡΠ½ΠΎΠ²Π° ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π΄ΠΎΠ·Π½Π°Π΅ΡΠ΅ Π½Π° Π²Π΅Π±-ΡΡΡΠ°Π½ΠΈΡΠ°ΡΠ°
ΠΠΎΡΠ΅Π½Π°Π²Π΅Π΄Π΅Π½Π°ΡΠ° ΠΊΠΎΠΌΠ°Π½Π΄Π° ΡΠ΅ Π³ΠΈ Π²ΠΌΠ΅ΡΠ½Π΅ ΡΠ»Π΅Π΄Π½ΠΈΡΠ΅ Π΅Π»Π΅ΠΌΠ΅Π½ΡΠΈ Π²ΠΎ pom.xml:
- ΠΠΌΠΎΡΠΎΡ , ΡΡΠΎ ΡΠ° ΠΎΠ΄ΡΠ΅Π΄ΡΠ²Π° Π²Π΅ΡΠ·ΠΈΡΠ°ΡΠ° Π½Π° Quarkus ΡΡΠΎ ΡΡΠ΅Π±Π° Π΄Π° ΡΠ΅ ΠΊΠΎΡΠΈΡΡΠΈ.
- ΠΠ»ΠΎΠΊΠΈΡΠ°Ρ Π΄Π° ΡΠ΅ ΡΠ²Π΅Π·Π΅ Quarkus BOM (ΡΠΌΠ΅ΡΠΊΠ° Π·Π° ΠΌΠ°ΡΠ΅ΡΠΈΡΠ°Π»ΠΈ), Π·Π° Π΄Π° Π½Π΅ ΡΠ΅ Π΄ΠΎΠ΄Π°Π΄Π΅ Π²Π΅ΡΠ·ΠΈΡΠ° Π·Π° ΡΠ΅ΠΊΠΎΡΠ° Π·Π°Π²ΠΈΡΠ½ΠΎΡΡ ΠΎΠ΄ Quarkus.
- ΠΡΠΈΠΊΠ»ΡΡΠΎΠΊΠΎΡ quarkus-maven Π΅ ΠΎΠ΄Π³ΠΎΠ²ΠΎΡΠ΅Π½ Π·Π° ΠΏΠ°ΠΊΡΠ²Π°ΡΠ΅ Π½Π° Π°ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡΠ°ΡΠ° ΠΈ ΠΎΠ±Π΅Π·Π±Π΅Π΄ΡΠ²Π°ΡΠ΅ Π½Π° ΡΠ΅ΠΆΠΈΠΌ Π½Π° ΡΠ°Π·Π²ΠΎΡ.
- ΠΡΠΈΡΠΎΠ΄Π½ΠΈΠΎΡ ΠΏΡΠΎΡΠΈΠ» Π·Π° ΠΊΡΠ΅ΠΈΡΠ°ΡΠ΅ ΠΈΠ·Π²ΡΡΠ½ΠΈ Π΄Π°ΡΠΎΡΠ΅ΠΊΠΈ Π½Π° Π°ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡΠ°ΡΠ°.
ΠΠΎΠΊΡΠ°Ρ ΡΠΎΠ°, Π½ΠΈΠ΅ ΡΠ°ΡΠ½ΠΎ Π³ΠΈ ΠΏΡΠ°Π²ΠΈΠΌΠ΅ ΡΠ»Π΅Π΄Π½ΠΈΡΠ΅ ΠΏΡΠΎΠΌΠ΅Π½ΠΈ Π²ΠΎ pom.xml:
- ΠΠ·Π²Π»Π΅ΠΊΡΠ²Π°ΡΠ΅ Π½Π° ΠΎΠ·Π½Π°ΠΊΠ°ΡΠ° ΠΎΠ΄ Π±Π»ΠΎΠΊΠΎΡ ΠΈ ΡΡΠ°Π²Π΅ΡΠ΅ Π³ΠΎ Π½Π°Π΄ ΠΎΠ·Π½Π°ΠΊΠ°ΡΠ° . ΠΠ°ΡΠΎΠ° ΡΡΠΎ Π²ΠΎ ΡΠ»Π΅Π΄Π½ΠΈΠΎΡ ΡΠ΅ΠΊΠΎΡ ΡΠ΅ Π³ΠΎ ΠΎΡΡΡΡΠ°Π½ΠΈΠΌΠ΅ Π±Π»ΠΎΠΊΠΎΡ , ΡΠΎΠ³Π°Ρ ΡΡΠ΅Π±Π° Π΄Π° Π·Π°ΡΡΠ΅Π΄ΠΈΡΠ΅ .
- ΠΡΡΡΡΠ°Π½ΡΠ²Π°ΡΠ΅ Π½Π° Π±Π»ΠΎΠΊ Π·Π°ΡΠΎΠ° ΡΡΠΎ ΠΊΠΎΠ³Π° ΡΠ°Π±ΠΎΡΠΈ ΡΠΎ Quarkus, Π½Π° ΠΎΠ²Π°Π° Π°ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡΠ° ΠΏΠΎΠ²Π΅ΡΠ΅ Π½Π΅ΠΌΠ° Π΄Π° ΠΈ ΡΡΠ΅Π±Π° ΡΠΎΠ΄ΠΈΡΠ΅Π»ΡΠΊΠ° ΠΏΠΎΡΠ°ΠΊΠ° ΠΎΠ΄ JBoss.
- ΠΠΎΠ΄Π°Π΄Π΅ΡΠ΅ ΠΎΠ·Π½Π°ΠΊΠ° ΠΈ ΡΡΠ°Π²Π΅ΡΠ΅ Π³ΠΎ ΠΏΠΎΠ΄ ΠΎΠ·Π½Π°ΠΊΠ°ΡΠ° . ΠΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π³ΠΎ Π½Π°Π²Π΅Π΄Π΅ΡΠ΅ Π±ΡΠΎΡΠΎΡ Π½Π° Π²Π΅ΡΠ·ΠΈΡΠ°ΡΠ° ΡΡΠΎ ΡΠ° ΡΠ°ΠΊΠ°ΡΠ΅.
- ΠΡΡΡΡΠ°Π½ΡΠ²Π°ΡΠ΅ Π½Π° ΠΎΠ·Π½Π°ΠΊΠ°ΡΠ° , Π±ΠΈΠ΄Π΅ΡΡΠΈ ΠΎΠ²Π°Π° Π°ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡΠ° ΠΏΠΎΠ²Π΅ΡΠ΅ Π½Π΅ Π΅ ΠΠΠΠΠ, ΡΡΠΊΡ ΠΎΠ±ΠΈΡΠ΅Π½ JAR.
- ΠΠΈ ΠΌΠ΅Π½ΡΠ²Π°ΠΌΠ΅ ΡΠ»Π΅Π΄Π½ΠΈΡΠ΅ Π·Π°Π²ΠΈΡΠ½ΠΎΡΡΠΈ:
- ΠΡΠΎΠΌΠ΅Π½Π΅ΡΠ΅ ΡΠ° Π·Π°Π²ΠΈΡΠ½ΠΎΡΡΠ° javax.enterprise:cdi-api Π²ΠΎ io.quarkus:quarkus-arc, ΠΎΡΡΡΡΠ°Π½ΡΠ²Π°ΡΡΠΈ ΠΎΠ±Π΅Π·Π±Π΅Π΄Π΅Π½ΠΈ , Π±ΠΈΠ΄Π΅ΡΡΠΈ (ΡΠΏΠΎΡΠ΅Π΄ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠΈΡΠ΅) ΠΎΠ²Π°Π° Π΅ΠΊΡΡΠ΅Π½Π·ΠΈΡΠ° Π½Π° Quarkus ΠΎΠ±Π΅Π·Π±Π΅Π΄ΡΠ²Π° ΠΈΠ½ΡΠ΅ΠΊΡΠΈΡΠ°ΡΠ΅ Π½Π° CDI Π·Π°Π²ΠΈΡΠ½ΠΎΡΡΠΈ.
- ΠΡΠΎΠΌΠ΅Π½Π΅ΡΠ΅ ΡΠ° Π·Π°Π²ΠΈΡΠ½ΠΎΡΡΠ° org.jboss.spec.javax.servlet:jboss-servlet-api_4.0_spec Π²ΠΎ io.quarkus:quarkus-underdow, ΠΎΡΡΡΡΠ°Π½ΡΠ²Π°ΡΡΠΈ ΠΎΠ±Π΅Π·Π±Π΅Π΄Π΅Π½ΠΈ , Π±ΠΈΠ΄Π΅ΡΡΠΈ (ΡΠΏΠΎΡΠ΅Π΄ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠΈΡΠ΅) ΠΎΠ²Π°Π° Π΅ΠΊΡΡΠ΅Π½Π·ΠΈΡΠ° Π½Π° Quarkus ΠΎΠ±Π΅Π·Π±Π΅Π΄ΡΠ²Π° ΠΏΠΎΠ΄Π΄ΡΡΠΊΠ° Π·Π° ΡΠ΅ΡΠ²Π»Π΅ΡΠΈ.
- ΠΠ° ΠΎΡΡΡΡΠ°Π½ΡΠ²Π°ΠΌΠ΅ Π·Π°Π²ΠΈΡΠ½ΠΎΡΡΠ° org.jboss.spec.javax.annotation:jboss-annotations-api_1.3_spec Π±ΠΈΠ΄Π΅ΡΡΠΈ Π΄ΠΎΠ°ΡΠ° ΡΠΎ Π·Π°Π²ΠΈΡΠ½ΠΎΡΡΠΈΡΠ΅ ΡΡΠΎ ΡΡΠΎΡΡΠΊΡ Π³ΠΈ ΡΠΌΠ΅Π½ΠΈΠ²ΠΌΠ΅.
ΠΠ΅ΡΠ·ΠΈΡΠ°ΡΠ° Π½Π° Π΄Π°ΡΠΎΡΠ΅ΠΊΠ°ΡΠ° pom.xml ΡΠΎ ΡΠΈΡΠ΅ ΠΏΡΠΎΠΌΠ΅Π½ΠΈ ΡΠ΅ Π½Π°ΠΎΡΠ° Π½Π°
ΠΠ°Π±Π΅Π»Π΅ΠΆΠ΅ΡΠ΅ Π΄Π΅ΠΊΠ° mvn io.quarkus:quarkus-maven-plugin:0.23.2:create ΠΊΠΎΠΌΠ°Π½Π΄Π°ΡΠ° Π½Π΅ ΡΠ°ΠΌΠΎ ΡΡΠΎ ΡΠ° ΠΌΠ΅Π½ΡΠ²Π° Π΄Π°ΡΠΎΡΠ΅ΠΊΠ°ΡΠ° pom.xml, ΡΡΠΊΡ Π΄ΠΎΠ΄Π°Π²Π° ΠΈ Π³ΠΎΠ»Π΅ΠΌ Π±ΡΠΎΡ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΈ Π½Π° ΠΏΡΠΎΠ΅ΠΊΡΠΎΡ, ΠΈΠΌΠ΅Π½ΠΎ ΡΠ»Π΅Π΄Π½ΠΈΡΠ΅ Π΄Π°ΡΠΎΡΠ΅ΠΊΠΈ ΠΈ ΠΏΠ°ΠΏΠΊΠΈ:
- ΠΠ°ΡΠΎΡΠ΅ΠΊΠ°ΡΠ° mvnw ΠΈ mvnw.cmd ΠΈ ΠΏΠ°ΠΏΠΊΠ°ΡΠ° .mvn: Maven Wrapper Π²ΠΈ ΠΎΠ²ΠΎΠ·ΠΌΠΎΠΆΡΠ²Π° Π΄Π° ΠΈΠ·Π²ΡΡΠΈΡΠ΅ Maven ΠΏΡΠΎΠ΅ΠΊΡΠΈ Π½Π° Π΄Π°Π΄Π΅Π½Π° Maven Π²Π΅ΡΠ·ΠΈΡΠ° Π±Π΅Π· Π΄Π° ΡΠ° ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°ΡΠ΅ ΡΠ°Π° Π²Π΅ΡΠ·ΠΈΡΠ°.
- ΠΠ°ΠΏΠΊΠ° Docker (Π²ΠΎ Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡΠΌΠΎΡ src/main/): ΠΠ²Π° ΡΠΎΠ΄ΡΠΆΠΈ ΠΏΡΠΈΠΌΠ΅Ρ Dockerfiles Π·Π° ΠΌΠ°ΡΡΠΈΠ½ ΠΈ jvm ΡΠ΅ΠΆΠΈΠΌΠΈ (Π·Π°Π΅Π΄Π½ΠΎ ΡΠΎ Π΄Π°ΡΠΎΡΠ΅ΠΊΠ°ΡΠ° .dockerignore).
- ΠΠ°ΠΏΠΊΠ° Resources (Π²ΠΎ Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡΠΌΠΎΡ src/main/): ΠΠ²Π° ΡΠΎΠ΄ΡΠΆΠΈ ΠΏΡΠ°Π·Π½Π° Π΄Π°ΡΠΎΡΠ΅ΠΊΠ° application.properties ΠΈ ΠΏΡΠΈΠΌΠ΅ΡΠΎΠΊ ΠΎΠ΄ ΠΏΠΎΡΠ΅ΡΠ½Π°ΡΠ° ΡΡΡΠ°Π½ΠΈΡΠ° Quarkus index.html (Π²ΠΈΠ΄Π΅ΡΠ΅ Π‘ΡΠ°ΡΡΡΠ²Π°Ρ Π³ΠΎ ΠΌΠΎΠ΄Π΅ΡΠ½ΠΈΠ·ΠΈΡΠ°Π½ΠΈΠΎΡ helloworld Π·Π° ΠΏΠΎΠ²Π΅ΡΠ΅ Π΄Π΅ΡΠ°Π»ΠΈ).
Π‘ΡΠ°ΡΡΡΠ²Π°ΡΡΠ΅ helloworld
ΠΠ° Π΄Π° ΡΠ° ΡΠ΅ΡΡΠΈΡΠ°ΠΌΠ΅ Π°ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡΠ°ΡΠ°, ΠΊΠΎΡΠΈΡΡΠΈΠΌΠ΅ 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 (ΡΠ»Π΅Π½ Π½Π° Java: org.jboss.as.quickstarts.helloworld.HelloWorldServlet#helloService). ΠΡΠΎΠ±Π»Π΅ΠΌΠΎΡ Π΅ ΡΡΠΎ Π½Π° HelloWorldServlet ΠΌΡ ΡΡΠ΅Π±Π° ΠΈΠ½ΡΠ΅ΠΊΡΠΈΡΠ°Π½Π° ΠΈΠ½ΡΡΠ°Π½ΡΠ° Π½Π° HelloService, ΠΈ ΡΠ°Π° Π½Π΅ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ Π½Π°ΡΠ΄Π΅ (ΠΈΠ°ΠΊΠΎ ΠΈ Π΄Π²Π΅ΡΠ΅ ΠΎΠ΄ ΠΎΠ²ΠΈΠ΅ ΠΊΠ»Π°ΡΠΈ ΡΠ΅ Π²ΠΎ ΠΈΡΡΠΈΠΎΡ ΠΏΠ°ΠΊΠ΅Ρ).
ΠΡΠ΅ΠΌΠ΅ Π΅ Π΄Π° ΡΠ΅ Π²ΡΠ°ΡΠΈΠΌΠ΅ Π½Π°
ΠΡΠ΄Π΅ Π΄Π° ΡΠ° ΠΏΠΎΠ³Π»Π΅Π΄Π½Π΅ΠΌΠ΅ ΠΊΠ»Π°ΡΠ°ΡΠ° HelloService - ΡΠ°Π° Π½Π°Π²ΠΈΡΡΠΈΠ½Π° Π½Π΅ΠΌΠ° ΡΠ°ΠΊΠ²Π° ΠΏΡΠΈΠ±Π΅Π»Π΅ΡΠΊΠ°. ΠΠ°ΡΠΎΠ°, ΠΌΠΎΡΠ° Π΄Π° ΡΠ΅ Π΄ΠΎΠ΄Π°Π΄Π΅ Π·Π° Π΄Π° ΠΌΠΎΠΆΠ΅ Quarkus Π΄Π° ΠΏΡΠ΅Π±Π°ΡΡΠ²Π° ΠΈ Π΄Π° Π³ΠΎ Π½Π°ΡΠ΄Π΅ Π³ΡΠ°Π²ΠΎΡ. Π Π±ΠΈΠ΄Π΅ΡΡΠΈ ΠΎΠ²Π° Π΅ ΠΎΠ±ΡΠ΅ΠΊΡ Π±Π΅Π· Π΄ΡΠΆΠ°Π²ΡΠ°Π½ΡΡΠ²ΠΎ, Π»Π΅ΡΠ½ΠΎ ΠΌΠΎΠΆΠ΅ΠΌΠ΅ Π΄Π° ΡΠ° Π΄ΠΎΠ΄Π°Π΄Π΅ΠΌΠ΅ ΠΏΡΠΈΠ±Π΅Π»Π΅ΡΠΊΠ°ΡΠ° @ApplicationScoped Π²Π°ΠΊΠ°:
@ApplicationScoped
public class HelloService {
ΠΠ°Π±Π΅Π»Π΅ΡΠΊΠ°: ΠΎΠ²Π΄Π΅ ΡΠ°Π·Π²ΠΎΡΠ½Π°ΡΠ° ΠΎΠΊΠΎΠ»ΠΈΠ½Π° ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΏΠΎΠ±Π°ΡΠ° ΠΎΠ΄ Π²Π°Ρ Π΄Π° Π³ΠΎ Π΄ΠΎΠ΄Π°Π΄Π΅ΡΠ΅ ΠΏΠΎΡΡΠ΅Π±Π½ΠΈΠΎΡ ΠΏΠ°ΠΊΠ΅Ρ (Π²ΠΈΠ΄Π΅ΡΠ΅ ΡΠ° Π»ΠΈΠ½ΠΈΡΠ°ΡΠ° ΠΏΠΎΠ΄ΠΎΠ»Ρ), ΠΈ ΡΠ΅ ΠΌΠΎΡΠ° Π΄Π° Π³ΠΎ Π½Π°ΠΏΡΠ°Π²ΠΈΡΠ΅ ΡΠΎΠ° ΡΠ°ΡΠ½ΠΎ, Π²Π°ΠΊΠ°:
import javax.enterprise.context.ApplicationScoped;
ΠΠΊΠΎ ΡΠ΅ Π΄Π²ΠΎΡΠΌΠΈΡΠ΅ Π·Π° ΡΠΎΠ° ΠΊΠΎΡ ΠΎΠΏΡΠ΅Π³ ΡΡΠ΅Π±Π° Π΄Π° ΡΠ΅ ΠΊΠΎΡΠΈΡΡΠΈ Π²ΠΎ ΡΠ»ΡΡΠ°Ρ ΠΊΠΎΠ³Π° Π²ΠΎΠΎΠΏΡΡΠΎ Π½Π΅ Π΅ Π½Π°Π²Π΅Π΄Π΅Π½ Π·Π° ΠΈΠ·Π²ΠΎΡΠ½ΠΈΠΎΡ Π³ΡΠ°Π², ΠΏΡΠΎΡΠΈΡΠ°ΡΡΠ΅ ΡΠ° Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡΠ°ΡΠ°
Π‘Π΅Π³Π° ΠΏΠΎΠ²ΡΠΎΡΠ½ΠΎ ΡΠ΅ ΠΎΠ±ΠΈΠ΄ΡΠ²Π°ΠΌΠ΅ Π΄Π° ΡΠ° ΡΡΠ°ΡΡΡΠ²Π°ΠΌΠ΅ Π°ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡΠ°ΡΠ° ΡΠΎ ΠΊΠΎΠΌΠ°Π½Π΄Π°ΡΠ° ./mvnw compile quarcus: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]
Π‘Π΅Π³Π° ΡΓ¨ ΠΎΠ΄ΠΈ Π±Π΅Π· Π³ΡΠ΅ΡΠΊΠΈ.
ΠΠ°Π½ΡΠΈΡΠ°ΡΠ΅ Π½Π° ΠΌΠΎΠ΄Π΅ΡΠ½ΠΈΠ·ΠΈΡΠ°Π½ΠΈΠΎΡ helloworld
ΠΠ°ΠΊΠΎ ΡΡΠΎ Π΅ Π½Π°ΠΏΠΈΡΠ°Π½ΠΎ Π²ΠΎ Π΄Π½Π΅Π²Π½ΠΈΠΊΠΎΡ, ΠΎΡΠ²ΠΎΡΠ΅ΡΠ΅ Π³ΠΎ Π²ΠΎ ΠΏΡΠ΅Π»ΠΈΡΡΡΠ²Π°ΡΠΎΡ
ΠΡΠΈΠ·. 4. ΠΠΎΡΠ΅ΡΠ½Π° ΡΡΡΠ°Π½ΠΈΡΠ° Π½Π° Quarcus dev.
ΠΡΠΈΠ±Π΅Π»Π΅ΡΠΊΠ°ΡΠ° WebServlet Π·Π° ΠΎΠ²Π°Π° Π°ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡΠ° ΡΠ° ΡΠΎΠ΄ΡΠΆΠΈ ΡΠ»Π΅Π΄Π½Π°ΡΠ° Π΄Π΅ΡΠΈΠ½ΠΈΡΠΈΡΠ° Π½Π° ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡ:
@WebServlet("/HelloWorld")
public class HelloWorldServlet extends HttpServlet {
ΠΠ°ΡΠΎΠ°, ΠΎΠ΄ΠΈΠΌΠ΅ Π²ΠΎ ΠΏΡΠ΅Π»ΠΈΡΡΡΠ²Π°ΡΠΎΡ Π΄ΠΎ
ΠΡΠΈΠ·. 5: Π‘ΡΡΠ°Π½Π°ΡΠ° Π·Π° ΡΠ°Π·Π²ΠΎΡ Π½Π° Quarcus Π·Π° Π°ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡΠ°ΡΠ° Hello World.
ΠΠ°, ΡΓ¨ ΡΡΠ½ΠΊΡΠΈΠΎΠ½ΠΈΡΠ°.
Π‘Π΅Π³Π° Π°ΡΠ΄Π΅ Π΄Π° Π½Π°ΠΏΡΠ°Π²ΠΈΠΌΠ΅ ΠΏΡΠΎΠΌΠ΅Π½ΠΈ Π²ΠΎ ΠΊΠΎΠ΄ΠΎΡ. ΠΠ°Π±Π΅Π»Π΅ΠΆΠ΅ΡΠ΅ Π΄Π΅ΠΊΠ° ΠΊΠΎΠΌΠ°Π½Π΄Π°ΡΠ° ./mvnw compile quarcus:dev ΡΓ¨ ΡΡΡΠ΅ ΡΠ°Π±ΠΎΡΠΈ ΠΈ Π½Π΅ΠΌΠ°ΠΌΠ΅ Π½Π°ΠΌΠ΅ΡΠ° Π΄Π° ΡΠ° Π·Π°ΠΏΡΠ΅ΠΌΠ΅. Π‘Π΅Π³Π° Π΄Π° ΡΠ΅ ΠΎΠ±ΠΈΠ΄Π΅ΠΌΠ΅ Π΄Π° Π³ΠΈ ΠΏΡΠΈΠΌΠ΅Π½ΠΈΠΌΠ΅ ΠΈΡΡΠΈΡΠ΅ - ΠΌΠ½ΠΎΠ³Ρ ΡΡΠΈΠ²ΠΈΡΠ°Π»Π½ΠΈ - ΠΏΡΠΎΠΌΠ΅Π½ΠΈ Π½Π° ΡΠ°ΠΌΠΈΠΎΡ ΠΊΠΎΠ΄ ΠΈ Π΄Π° Π²ΠΈΠ΄ΠΈΠΌΠ΅ ΠΊΠ°ΠΊΠΎ Quarkus Π³ΠΎ ΠΎΠ»Π΅ΡΠ½ΡΠ²Π° ΠΆΠΈΠ²ΠΎΡΠΎΡ Π½Π° ΡΠ°Π·Π²ΠΈΠ²Π°ΡΠΎΡ:
writer.println("<h1>" + helloService.createHelloMessage("Marco") + "</h1>");
ΠΠ°ΡΡΠ²Π°ΡΡΠ΅ ΡΠ° Π΄Π°ΡΠΎΡΠ΅ΠΊΠ°ΡΠ° ΠΈ ΠΏΠΎΡΠΎΠ° ΠΎΡΠ²Π΅ΠΆΠ΅ΡΠ΅ ΡΠ° Π²Π΅Π±-ΡΡΡΠ°Π½ΠΈΡΠ°ΡΠ° Π·Π° Π΄Π° Π³ΠΎ Π²ΠΈΠ΄ΠΈΡΠ΅ ΠΠ΄ΡΠ°Π²ΠΎ ΠΠ°ΡΠΊΠΎ, ΠΊΠ°ΠΊΠΎ ΡΡΠΎ Π΅ ΠΏΡΠΈΠΊΠ°ΠΆΠ°Π½ΠΎ Π½Π° Π΅ΠΊΡΠ°Π½ΠΎΡ ΠΏΠΎΠ΄ΠΎΠ»Ρ:
ΠΡΠΈΠ·. 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 ΡΠ΅ΠΊΡΠ½Π΄ΠΈ (Π΅Π²Π΅ Π³ΠΎ, ΠΎΠ½Π°Π° βΡΠ»ΡΡΠ°Π±ΡΠ·Π° ΡΡΠ±Π°ΡΠΎΠΌΡΠΊΠ° ΠΠ°Π²Π°β).
ΠΡΠ°Π΄Π΅ΡΠ΅ Π½Π° helloworld Π²ΠΎ ΠΏΠ°ΠΊΠ΅Ρ JAR
Π‘Π΅Π³Π° ΠΊΠΎΠ³Π° ΠΊΠΎΠ΄ΠΎΡ ΡΠ°Π±ΠΎΡΠΈ ΠΊΠ°ΠΊΠΎ ΡΡΠΎ ΡΡΠ΅Π±Π°, Π°ΡΠ΄Π΅ Π΄Π° Π³ΠΎ ΡΠΏΠ°ΠΊΡΠ²Π°ΠΌΠ΅ ΡΠΎ ΡΠ»Π΅Π΄Π½Π°Π²Π° ΠΊΠΎΠΌΠ°Π½Π΄Π°:
$ ./mvnw clean package
ΠΠ²Π°Π° ΠΊΠΎΠΌΠ°Π½Π΄Π° ΡΠΎΠ·Π΄Π°Π²Π° Π΄Π²Π΅ JAR-Π΄Π°ΡΠΎΡΠ΅ΠΊΠΈ Π²ΠΎ ΠΏΠ°ΠΏΠΊΠ°ΡΠ° /target: Π΄Π°ΡΠΎΡΠ΅ΠΊΠ°ΡΠ° helloworld-.jar, ΠΊΠΎΡΠ° Π΅ ΡΡΠ°Π½Π΄Π°ΡΠ΄Π΅Π½ Π°ΡΡΠ΅ΡΠ°ΠΊΡ ΡΠΎΡΡΠ°Π²Π΅Π½ ΠΎΠ΄ ΡΠΈΠΌΠΎΡ Π½Π° Maven Π·Π°Π΅Π΄Π½ΠΎ ΡΠΎ ΠΊΠ»Π°ΡΠΈΡΠ΅ ΠΈ ΡΠ΅ΡΡΡΡΠΈΡΠ΅ Π½Π° ΠΏΡΠΎΠ΅ΠΊΡΠΎΡ. Π Π΄Π°ΡΠΎΡΠ΅ΠΊΠ°ΡΠ° helloworld-runner.jar, ΠΊΠΎΡΠ° Π΅ ΠΈΠ·Π²ΡΡΠ½Π° JAR.
ΠΠ΅ ΠΌΠΎΠ»ΠΈΠΌΠ΅ ΠΈΠΌΠ°ΡΡΠ΅ ΠΏΡΠ΅Π΄Π²ΠΈΠ΄ Π΄Π΅ΠΊΠ° ΠΎΠ²Π° Π½Π΅ Π΅ uber-jar, Π±ΠΈΠ΄Π΅ΡΡΠΈ ΡΠΈΡΠ΅ Π·Π°Π²ΠΈΡΠ½ΠΎΡΡΠΈ Π΅Π΄Π½ΠΎΡΡΠ°Π²Π½ΠΎ ΡΠ΅ ΠΊΠΎΠΏΠΈΡΠ°Π°Ρ Π²ΠΎ ΠΏΠ°ΠΏΠΊΠ°ΡΠ° /target/lib (Π½Π΅ Π΅ ΡΠΏΠ°ΠΊΡΠ²Π°Π½Π° Π²ΠΎ Π΄Π°ΡΠΎΡΠ΅ΠΊΠ° JAR). ΠΠ°ΡΠΎΠ°, Π·Π° Π΄Π° Π³ΠΎ ΠΈΠ·Π²ΡΡΠΈΡΠ΅ ΠΎΠ²ΠΎΡ JAR ΠΎΠ΄ Π΄ΡΡΠ³Π° ΠΏΠ°ΠΏΠΊΠ° ΠΈΠ»ΠΈ Π½Π° Π΄ΡΡΠ³ Ρ
ΠΎΡΡ, ΡΡΠ΅Π±Π° Π΄Π° ΡΠ° ΠΊΠΎΠΏΠΈΡΠ°ΡΠ΅ ΠΈ ΡΠ°ΠΌΠ°ΡΠ° JAR-Π΄Π°ΡΠΎΡΠ΅ΠΊΠ° ΠΈ ΠΏΠ°ΠΏΠΊΠ°ΡΠ° /lib ΡΠ°ΠΌΡ, ΠΈΠΌΠ°ΡΡΠΈ ΠΏΡΠ΅Π΄Π²ΠΈΠ΄ Π΄Π΅ΠΊΠ° Π΅Π»Π΅ΠΌΠ΅Π½ΡΠΎΡ Class-Path Π²ΠΎ Π΄Π°ΡΠΎΡΠ΅ΠΊΠ°ΡΠ° MANIFEST.MF Π²ΠΎ ΠΏΠ°ΠΊΠ΅ΡΠΎΡ JAR ΡΠΎΠ΄ΡΠΆΠΈ Π΅ΠΊΡΠΏΠ»ΠΈΡΠΈΡΠ΅Π½ ΡΠΏΠΈΡΠΎΠΊ Π½Π° JAR ΠΎΠ΄ ΠΏΠ°ΠΏΠΊΠΈ lib
ΠΠ° Π΄Π° Π½Π°ΡΡΠΈΡΠ΅ ΠΊΠ°ΠΊΠΎ Π΄Π° ΠΊΡΠ΅ΠΈΡΠ°ΡΠ΅ uber-jar Π°ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΠΈ, ΠΏΠΎΠ³Π»Π΅Π΄Π½Π΅ΡΠ΅ Π³ΠΎ ΡΠΏΠ°ΡΡΡΠ²ΠΎΡΠΎ
Π‘ΡΠ°ΡΡΡΠ²Π°ΡΡΠ΅ Π³ΠΎ helloworld ΡΠΏΠ°ΠΊΡΠ²Π°Π½ Π²ΠΎ JAR
Π‘Π΅Π³Π° ΠΌΠΎΠΆΠ΅ΠΌΠ΅ Π΄Π° Π³ΠΎ ΠΈΠ·Π²ΡΡΠΈΠΌΠ΅ Π½Π°ΡΠΈΠΎΡ JAR ΠΊΠΎΡΠΈΡΡΠ΅ΡΡΠΈ ΡΠ° ΡΡΠ°Π½Π΄Π°ΡΠ΄Π½Π°ΡΠ° ΠΊΠΎΠΌΠ°Π½Π΄Π° Java:
$ 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]
ΠΡΠΊΠ°ΠΊΠΎ ΡΠ΅ ΡΠ΅ Π½Π°ΠΏΡΠ°Π²ΠΈ ΡΠ΅ΡΠΎ ΠΎΠ²Π°, ΠΎΠ΄Π΅ΡΠ΅ Π½Π° Π²Π°ΡΠΈΠΎΡ ΠΏΡΠ΅Π»ΠΈΡΡΡΠ²Π°Ρ Π½Π°
Π‘ΠΎΡΡΠ°Π²ΡΠ²Π°ΡΠ΅ Π½Π° helloworld Π²ΠΎ Π΄ΠΎΠΌΠ°ΡΠ½Π° ΠΈΠ·Π²ΡΡΠ½Π° Π΄Π°ΡΠΎΡΠ΅ΠΊΠ°
ΠΠ½Π°ΡΠΈ, Π½Π°ΡΠΈΠΎΡ helloworld ΡΠ°Π±ΠΎΡΠΈ ΠΊΠ°ΠΊΠΎ ΡΠ°ΠΌΠΎΡΡΠΎΡΠ½Π° Java Π°ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡΠ° ΠΊΠΎΡΠΈΡΡΠ΅ΡΡΠΈ Π·Π°Π²ΠΈΡΠ½ΠΎΡΡΠΈ ΠΎΠ΄ Quarkus. ΠΠΎ, ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΎΠ΄ΠΈΡΠ΅ ΠΏΠΎΠ½Π°ΡΠ°ΠΌΡ ΠΈ Π΄Π° ΡΠ° ΠΏΡΠ΅ΡΠ²ΠΎΡΠΈΡΠ΅ Π²ΠΎ ΠΎΡΠΈΠ³ΠΈΠ½Π°Π»Π½Π° ΠΈΠ·Π²ΡΡΠ½Π° Π΄Π°ΡΠΎΡΠ΅ΠΊΠ°.
ΠΠ½ΡΡΠ°Π»ΠΈΡΠ°ΡΠ΅ Π½Π° GraalVM
ΠΡΠ²ΠΎ Π½Π° ΡΠΈΡΠ΅, Π·Π° ΠΎΠ²Π° ΡΡΠ΅Π±Π° Π΄Π° Π³ΠΈ ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°ΡΠ΅ ΠΏΠΎΡΡΠ΅Π±Π½ΠΈΡΠ΅ Π°Π»Π°ΡΠΊΠΈ:
1. ΠΡΠ΅Π·Π΅ΠΌΠ΅ΡΠ΅ Π³ΠΎ GraalVM 19.2.0.1 ΠΎΠ΄
2. ΠΡΠΎΡΠΈΡΠ΅ΡΠ΅ ΡΠ° ΠΏΡΠ΅Π·Π΅ΠΌΠ΅Π½Π°ΡΠ° Π°ΡΡ ΠΈΠ²Π°:
$ tar xvzf graalvm-ce-linux-amd64-19.2.0.1.tar.gz
3. ΠΠ΄Π΅ΡΠ΅ Π²ΠΎ ΠΏΠ°ΠΏΠΊΠ°ΡΠ° untar.
4. ΠΠ·Π²ΡΡΠ΅ΡΠ΅ ΡΠ° ΠΊΠΎΠΌΠ°Π½Π΄Π°ΡΠ° ΠΏΠΎΠ΄ΠΎΠ»Ρ Π·Π° Π΄Π° ΡΠ° ΠΏΡΠ΅Π·Π΅ΠΌΠ΅ΡΠ΅ ΠΈ Π΄ΠΎΠ΄Π°Π΄Π΅ΡΠ΅ Π΄ΠΎΠΌΠ°ΡΠ½Π°ΡΠ° ΡΠ»ΠΈΠΊΠ°:
$ ./bin/gu install native-image
5. Π Π΅Π³ΠΈΡΡΡΠΈΡΠ°ΡΡΠ΅ ΡΠ° ΠΏΠ°ΠΏΠΊΠ°ΡΠ° ΠΊΡΠ΅ΠΈΡΠ°Π½Π° Π²ΠΎ ΡΠ΅ΠΊΠΎΡ 2 Π²ΠΎ ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²Π°ΡΠ° Π½Π° ΠΎΠΊΠΎΠ»ΠΈΠ½Π°ΡΠ° GRAALVM_HOME:
$ export GRAALVM_HOME={untar-folder}/graalvm-ce-19.2.0.1)
ΠΠ° ΠΏΠΎΠ²Π΅ΡΠ΅ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ ΠΈ ΠΈΠ½ΡΡΡΡΠΊΡΠΈΠΈ Π·Π° ΠΈΠ½ΡΡΠ°Π»Π°ΡΠΈΡΠ° Π½Π° Π΄ΡΡΠ³ΠΈ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠ²Π½ΠΈ ΡΠΈΡΡΠ΅ΠΌΠΈ, Π²ΠΈΠ΄Π΅ΡΠ΅ Π³ΠΎ ΠΏΡΠΈΡΠ°ΡΠ½ΠΈΠΊΠΎΡ
ΠΡΠ°Π΄Π΅ΡΠ΅ Π½Π° helloworld Π²ΠΎ Π΄ΠΎΠΌΠ°ΡΠ½Π° ΠΈΠ·Π²ΡΡΠ½Π° Π΄Π°ΡΠΎΡΠ΅ΠΊΠ°
Π§ΠΈΡΠ°ΡΠ΅ Π½Π° ΠΏΡΠΈΡΠ°ΡΠ½ΠΈΠΊΠΎΡ
ΠΠ° Π΄Π° ΠΊΡΠ΅ΠΈΡΠ°ΡΠ΅ ΠΈΠ·Π²ΠΎΡΠ½Π° ΠΈΠ·Π²ΡΡΠ½Π° Π΄Π°ΡΠΎΡΠ΅ΠΊΠ°, ΡΡΠ΅Π±Π° Π΄Π° Π³ΠΎ ΠΎΠ²ΠΎΠ·ΠΌΠΎΠΆΠΈΡΠ΅ ΠΌΠ°ΡΡΠΈΠ½ΠΈΠΎΡ ΠΏΡΠΎΡΠΈΠ» Π½Π° Maven:
$ ./mvnw package -Pnative
ΠΠ°ΡΠ°ΡΠ° ΠΈΠ·Π³ΡΠ°Π΄Π±Π° ΡΡΠ°Π΅ΡΠ΅ Π΅Π΄Π½Π° ΠΌΠΈΠ½ΡΡΠ° ΠΈ 10 ΡΠ΅ΠΊΡΠ½Π΄ΠΈ, Π° ΠΏΠΎΡΠ»Π΅Π΄Π½Π°ΡΠ° Π΄Π°ΡΠΎΡΠ΅ΠΊΠ° helloworld-runner f Π±Π΅ΡΠ΅ ΠΊΡΠ΅ΠΈΡΠ°Π½Π° Π²ΠΎ ΠΏΠ°ΠΏΠΊΠ°ΡΠ° /target.
Π‘ΡΠ°ΡΡΡΠ²Π°Ρ Π³ΠΎ ΠΌΠ°ΡΡΠΈΠ½ΠΈΠΎΡ ΠΈΠ·Π²ΡΡΠ½Π° Π΄Π°ΡΠΎΡΠ΅ΠΊΠ° helloworld
ΠΠΎ ΠΏΡΠ΅ΡΡ ΠΎΠ΄Π½ΠΈΠΎΡ ΡΠ΅ΠΊΠΎΡ, ΡΠ° Π΄ΠΎΠ±ΠΈΠ²ΠΌΠ΅ ΠΈΠ·Π²ΡΡΠ½Π°ΡΠ° Π΄Π°ΡΠΎΡΠ΅ΠΊΠ° /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]
ΠΡΠ²ΠΎΡΠ΅ΡΠ΅ Π³ΠΎ ΠΏΠΎΠ²ΡΠΎΡΠ½ΠΎ Π²ΠΎ ΠΏΡΠ΅Π»ΠΈΡΡΡΠ²Π°ΡΠΎΡ
ΠΡΠΎΠ΄ΠΎΠ»ΠΆΡΠ²Π°!
Π‘ΠΌΠ΅ΡΠ°ΠΌΠ΅ Π΄Π΅ΠΊΠ° ΠΌΠ΅ΡΠΎΠ΄ΠΎΡ Π·Π° ΠΌΠΎΠ΄Π΅ΡΠ½ΠΈΠ·Π°ΡΠΈΡΠ° Π½Π° Java Π°ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΠΈΡΠ΅ ΡΠΎ ΠΊΠΎΡΠΈΡΡΠ΅ΡΠ΅ Π½Π° ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈΡΠ΅ Π½Π° Quarkus Π·Π° ΠΊΠΎΡ ΡΠ΅ Π΄ΠΈΡΠΊΡΡΠΈΡΠ° Π²ΠΎ ΠΎΠ²ΠΎΡ ΠΏΠΎΡΡ (ΠΈΠ°ΠΊΠΎ ΠΊΠΎΡΠΈΡΡΠ΅ΡΡΠΈ Π΅Π΄Π½ΠΎΡΡΠ°Π²Π΅Π½ ΠΏΡΠΈΠΌΠ΅Ρ) ΡΡΠ΅Π±Π° Π°ΠΊΡΠΈΠ²Π½ΠΎ Π΄Π° ΡΠ΅ ΠΊΠΎΡΠΈΡΡΠΈ Π²ΠΎ ΡΠ΅Π°Π»Π½ΠΈΠΎΡ ΠΆΠΈΠ²ΠΎΡ. ΠΡΠΈΡΠΎΠ°, Π½Π°ΡΠ²Π΅ΡΠΎΡΠ°ΡΠ½ΠΎ ΡΠ΅ Π½Π°ΠΈΠ΄Π΅ΡΠ΅ Π½Π° Π³ΠΎΠ»Π΅ΠΌ Π±ΡΠΎΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΈ, ΠΊΠΎΠΈ Π΄Π΅Π»ΡΠΌΠ½ΠΎ ΡΠ΅ Π³ΠΈ ΡΠ°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ Π²ΠΎ ΡΠ»Π΅Π΄Π½ΠΈΠΎΡ ΠΏΠΎΡΡ, ΠΊΠ°Π΄Π΅ ΡΡΠΎ ΡΠ΅ Π·Π±ΠΎΡΡΠ²Π°ΠΌΠ΅ Π·Π° ΡΠΎΠ° ΠΊΠ°ΠΊΠΎ Π΄Π° ΡΠ° ΠΈΠ·ΠΌΠ΅ΡΠΈΠΌΠ΅ ΠΏΠΎΡΡΠΎΡΡΠ²Π°ΡΠΊΠ°ΡΠ° Π½Π° ΠΌΠ΅ΠΌΠΎΡΠΈΡΠ° Π·Π° Π΄Π° Π³ΠΈ ΠΎΡΠ΅Π½ΠΈΠΌΠ΅ ΠΏΠΎΠ΄ΠΎΠ±ΡΡΠ²Π°ΡΠ°ΡΠ° Π²ΠΎ ΠΏΠ΅ΡΡΠΎΡΠΌΠ°Π½ΡΠΈΡΠ΅, Π²Π°ΠΆΠ΅Π½ Π΄Π΅Π» ΠΎΠ΄ ΡΠ΅Π»ΠΈΠΎΡ ΠΏΡΠΎΡΠ΅Ρ Π½Π° ΠΌΠΎΠ΄Π΅ΡΠ½ΠΈΠ·Π°ΡΠΈΡΠ° Π½Π° Π°ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΠΈΡΠ΅.
ΠΠ·Π²ΠΎΡ: www.habr.com