Quarkus: модСрнизация ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ helloworld ΠΈΠ· JBoss EAP Quickstart

ΠŸΡ€ΠΈΠ²Π΅Ρ‚ всСм Π² этом Π±Π»ΠΎΠ³Π΅, ΠΈ с Π²Π°ΠΌΠΈ Ρ‡Π΅Ρ‚Π²Π΅Ρ€Ρ‚Ρ‹ΠΉ пост ΠΈΠ· сСрии ΠΏΡ€ΠΎ Quarkus!

Quarkus: модСрнизация ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ helloworld ΠΈΠ· JBoss EAP Quickstart

ΠŸΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΠΉ пост Π±Ρ‹Π» ΠΎ Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊ Quarkus ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½ΡΠ΅Ρ‚ MicroProfile ΠΈ Spring. Напомним, Ρ‡Ρ‚ΠΎ Quarkus позиционируСтся ΠΊΠ°ΠΊ «свСрхбыстрая субатомная JavaΒ», ΠΎΠ½ ΠΆΠ΅ Β«Kubernetes-ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ Java-стСк, Π·Π°Ρ‚ΠΎΡ‡Π΅Π½Π½Ρ‹ΠΉ ΠΏΠΎΠ΄ GraalVM ΠΈ OpenJDK HotSpot ΠΈ собранный ΠΈΠ· Π»ΡƒΡ‡ΡˆΠΈΡ… Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ ΠΈ стандартов». БСгодня ΠΌΡ‹ ΠΏΠΎΠΊΠ°ΠΆΠ΅ΠΌ, ΠΊΠ°ΠΊ ΠΌΠΎΠ΄Π΅Ρ€Π½ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΡƒΠΆΠ΅ ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΠ΅ΡΡ Java-прилоТСния, задСйствуя возмоТности Quarkus, Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ прилоТСния helloworld ΠΈΠ· рСпозитория Red Hat JBoss Enterprise Application Platform (JBoss EAP) Quickstart, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅ΠΌΡ‹Π΅ Π² Quarkus Ρ‚Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³ΠΈΠΈ CDI ΠΈ Servlet 3.

Π—Π΄Π΅ΡΡŒ Π²Π°ΠΆΠ½ΠΎ ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΈ Quarkus, ΠΈ JBoss EAP Π΄Π΅Π»Π°ΡŽΡ‚ ΡƒΠΏΠΎΡ€ Π½Π° Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ инструмСнты, максимально построСнныС Π½Π° Π±Π°Π·Π΅ стандартов. Π£ вас Π½Π΅Ρ‚ прилоТСния, Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰Π΅Π³ΠΎ Π½Π° JBoss EAP? НС ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°, Π΅Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π»Π΅Π³ΠΊΠΎ пСрСнСсти с Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ сСрвСра ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Π½Π° JBoss EAP с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Red Hat Application Migration Toolkit. ПослС Ρ‡Π΅Π³ΠΎ Ρ„ΠΈΠ½Π°Π»ΡŒΠ½Π°Ρ ΠΈ рабочая вСрсия ΠΌΠΎΠ΄Π΅Ρ€Π½ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π° Π±ΡƒΠ΄Π΅Ρ‚ доступна Π² Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΈ github.com/mrizzi/jboss-eap-quickstarts/tree/quarkus, Π² ΠΌΠΎΠ΄ΡƒΠ»Π΅ helloworld.

ΠŸΡ€ΠΈ написании этого поста использовались руководства ΠΏΠΎ Quarkus, Π² основном Creating Your First Application ΠΈ Building a Native Executable.

Обзаводимся кодом

ΠŸΠ΅Ρ€Π²Ρ‹ΠΌ Π΄Π΅Π»ΠΎΠΌ создадим Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ ΠΊΠ»ΠΎΠ½ рСпозитория 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/

Π‘ΠΌΠΎΡ‚Ρ€ΠΈΠΌ, ΠΊΠ°ΠΊ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ исходный helloworld

БобствСнно, ΡΡƒΡ‚ΡŒ этого прилоТСния понятна ΠΈΠ· названия, Π½ΠΎ ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΠΌΠΎΠ΄Π΅Ρ€Π½ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ ΠΊΠΎΠ΄ строго Π½Π°ΡƒΡ‡Π½ΠΎ. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ для Π½Π°Ρ‡Π°Π»Π° посмотрим Π½Π° это ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π² исходном Π΅Π³ΠΎ Π²ΠΈΠ΄Π΅.

Π Π°Π·Π²ΠΎΡ€Π°Ρ‡ΠΈΠ²Π°Π΅ΠΌ 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: модСрнизация ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ helloworld ΠΈΠ· JBoss EAP Quickstart

Рис. 1. Π”ΠΎΠΌΠ°ΡˆΠ½ΡΡ страница JBoss EAP.

4. Π‘Π»Π΅Π΄ΡƒΠ΅ΠΌ инструкциям Π² руководствС Build and Deploy the Quickstart: Ρ€Π°Π·Π²ΠΎΡ€Π°Ρ‡ΠΈΠ²Π°Π΅ΠΌ helloworld ΠΈ выполняСм (ΠΈΠ· ΠΊΠΎΡ€Π½Π΅Π²ΠΎΠΉ ΠΏΠ°ΠΏΠΊΠΈ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°) ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ:

$ mvn clean install wildfly:deploy

ПослС ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠ³ΠΎ выполнСния этой ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ Π² Π»ΠΎΠ³Π΅ ΡƒΠ²ΠΈΠ΄ΠΈΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅:

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

Π˜Ρ‚Π°ΠΊ, ΠΏΠ΅Ρ€Π²ΠΎΠ΅ Ρ€Π°Π·Π²Π΅Ρ€Ρ‚Ρ‹Π²Π°Π½ΠΈΠ΅ прилоТСния helloworld Π½Π° JBoss EAP заняло Ρ‡ΡƒΡ‚ΡŒ большС 8 сСкунд.

ВСстируСм helloworld

ДСйствуя строго ΠΏΠΎ руководству Access the Application, ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°Π΅ΠΌ Π² Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π΅ 127.0.0.1:8080/helloworld ΠΈ Π²ΠΈΠ΄ΠΈΠΌ Π²ΠΎΡ‚ Ρ‡Ρ‚ΠΎ:

Quarkus: модСрнизация ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ helloworld ΠΈΠ· JBoss EAP Quickstart

Рис. 2. Π˜ΡΡ…ΠΎΠ΄Π½Ρ‹ΠΉ Hello World ΠΈΠ· JBoss EAP.

Вносим измСнСния

МСняСм Π²Ρ…ΠΎΠ΄Π½ΠΎΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ createHelloMessage(String name) c World Π½Π° Marco:

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

ΠžΠΏΡΡ‚ΡŒ выполняСм ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ:

$ mvn clean install wildfly:deploy

Π—Π°Ρ‚Π΅ΠΌ обновляСм страницу Π² Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π΅ ΠΈ Π²ΠΈΠ΄ΠΈΠΌ, Ρ‡Ρ‚ΠΎ тСкст измСнился:

Quarkus: модСрнизация ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ helloworld ΠΈΠ· JBoss EAP Quickstart

Рис. 3. Hello Marco в JBoss EAP.

ΠžΡ‚ΠΊΠ°Ρ‚Ρ‹Π²Π°Π΅ΠΌ Ρ€Π°Π·Π²Π΅Ρ€Ρ‚Ρ‹Π²Π°Π½ΠΈΠ΅ helloworld ΠΈ Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅ΠΌ Ρ€Π°Π±ΠΎΡ‚Ρƒ JBoss EAP

Π­Ρ‚ΠΎ Π½Π΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, Π½ΠΎ Ссли Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΎΡ‚ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Ρ€Π°Π·Π²Π΅Ρ€Ρ‚Ρ‹Π²Π°Π½ΠΈΠ΅, Ρ‚ΠΎ это ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ:

$ mvn clean install wildfly:undeploy

Π§Ρ‚ΠΎΠ±Ρ‹ Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Ρƒ экзСмпляра JBoss EAP, просто Π½Π°ΠΆΠΌΠΈΡ‚Π΅ Ctrl+C Π² ΠΎΠΊΠ½Π΅ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π°.

ΠœΠΎΠ΄Π΅Ρ€Π½ΠΈΠ·ΠΈΡ€ΡƒΠ΅ΠΌ helloworld

Π’Π΅ΠΏΠ΅Ρ€ΡŒ займСмся ΠΌΠΎΠ΄Π΅Ρ€Π½ΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ исходного прилоТСния helloworld.

Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ Π½ΠΎΠ²ΡƒΡŽ Π²Π΅Ρ‚ΠΊΡƒ

Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ Π½ΠΎΠ²ΡƒΡŽ Ρ€Π°Π±ΠΎΡ‡ΡƒΡŽ Π²Π΅Ρ‚ΠΊΡƒ послС Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ закончится Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° quickstart:

$ 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 часто выходят Π½ΠΎΠ²Ρ‹Π΅ вСрсии, ΡƒΠ·Π½Π°Ρ‚ΡŒ, какая вСрсия являСтся самой послСднСй, ΠΌΠΎΠΆΠ½ΠΎ Π½Π° сайтС github.com/quarkusio/quarkus/releases/latest.

ΠŸΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Π°Ρ Π²Ρ‹ΡˆΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Π° вставит Π² pom.xml ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ элСмСнты:

  • Бвойство <quarkus.version>, Π·Π°Π΄Π°ΡŽΡ‰Π΅Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡƒΡŽ Π²Π΅Ρ€ΡΠΈΡŽ Quarkus.
  • Π‘Π»ΠΎΠΊ <dependencyManagement> для ΠΈΠΌΠΏΠΎΡ€Ρ‚Π° Quarkus BOM (bill of materials), Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π΅ Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ Π²Π΅Ρ€ΡΠΈΡŽ для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ зависимости Quarkus.
  • Плагин quarkus-maven-plugin, ΠΎΡ‚Π²Π΅Ρ‡Π°ΡŽΡ‰ΠΈΠΉ Π·Π° ΡƒΠΏΠ°ΠΊΠΎΠ²ΠΊΡƒ прилоТСния ΠΈ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΠΉ Ρ€Π΅ΠΆΠΈΠΌ development mode.
  • ΠŸΡ€ΠΎΡ„ΠΈΠ»ΡŒ native для создания исполняСмых Ρ„Π°ΠΉΠ»ΠΎΠ² прилоТСния.

ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, Π² pom.xml ΠΌΡ‹ Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ вносим ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ измСнСния:

  1. ВытаскиваСм Ρ‚Π΅Π³ <groupId> ΠΈΠ· Π±Π»ΠΎΠΊΠ° <parent> ΠΈ Ρ€Π°Π·ΠΌΠ΅Ρ‰Π°Π΅ΠΌ Π΅Π³ΠΎ Π²Ρ‹ΡˆΠ΅ Ρ‚Π΅Π³Π° <artifactId>. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π½Π° ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ шагС ΠΌΡ‹ ΡƒΠ΄Π°Π»ΠΈΠΌ Π±Π»ΠΎΠΊ <parent>, Ρ‚ΠΎ Π½Π°Π΄ΠΎ ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ <groupId>.
  2. УдаляСм Π±Π»ΠΎΠΊ <parent>, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΏΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с Quarkus этому ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡŽ большС Π½Π΅ понадобится Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ pom ΠΎΡ‚ JBoss.
  3. ДобавляСм Ρ‚Π΅Π³ <version> ΠΈ Ρ€Π°Π·ΠΌΠ΅Ρ‰Π°Π΅ΠΌ Π΅Π³ΠΎ ΠΏΠΎΠ΄ Ρ‚Π΅Π³ΠΎΠΌ <artifactId>. НомСр вСрсии ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ ΠΊΠ°ΠΊΠΎΠΉ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅.
  4. УдаляСм Ρ‚Π΅Π³ <packaging>, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ это ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ большС Π½Π΅ WAR, Π° ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΉ JAR.
  5. ΠœΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΡƒΠ΅ΠΌ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ зависимости:
    1. МСняСм Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ‚ΡŒ javax.enterprise:cdi-api Π½Π° io.quarkus:quarkus-arc, удаляя <scope>provided</scope>, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ (согласно Π΄ΠΎΠΊΠ°ΠΌ) это Quarkus-Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ обСспСчиваСт injection зависимости CDI.
    2. МСняСм Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ‚ΡŒ org.jboss.spec.javax.servlet:jboss-servlet-api_4.0_spec Π½Π° io.quarkus:quarkus-undertow, удаляя <scope>provided</scope>, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ (согласно Π΄ΠΎΠΊΠ°ΠΌ) это Quarkus-Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ обСспСчиваСт ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ servlet’ов.
    3. УдаляСм Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ‚ΡŒ org.jboss.spec.javax.annotation:jboss-annotations-api_1.3_spec, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ½ΠΈ ΠΈΠ΄Π΅Ρ‚ Π² ΠΊΠΎΠΌΠΏΠ»Π΅ΠΊΡ‚Π΅ с зависимостями, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΡ‹ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‡Ρ‚ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΠΈΠ»ΠΈ.

ВСрсия Ρ„Π°ΠΉΠ»Π° pom.xml со всСми измСнСниями Π»Π΅ΠΆΠΈΡ‚ ΠΏΠΎ адрСсу github.com/mrizzi/jboss-eap-quickstarts/blob/quarkus/helloworld/pom.xml.

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ привСдСнная Π²Ρ‹ΡˆΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Π° mvn io.quarkus:quarkus-maven-plugin:0.23.2:create Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ мСняСт Ρ„Π°ΠΉΠ» pom.xml, Π½ΠΎ ΠΈ добавляСт Π² ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ ряд ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ², Π° ΠΈΠΌΠ΅Π½Π½ΠΎ, ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ Ρ„Π°ΠΉΠ»Ρ‹ ΠΈ ΠΏΠ°ΠΏΠΊΠΈ:

  • Π€Π°ΠΉΠ» mvnw and mvnw.cmd ΠΈ ΠΏΠ°ΠΏΠΊΡƒ .mvn: Maven Wrapper позволяСт Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Ρ‹ Maven Π·Π°Π΄Π°Π½Π½ΠΎΠΉ вСрсии Maven Π±Π΅Π· установки этой самой вСрсии.
  • Папка docker (Π² ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅ src/main/): здСсь Π»Π΅ΠΆΠ°Ρ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ Ρ„Π°ΠΉΠ»ΠΎΠ² Dockerfile для Ρ€Π΅ΠΆΠΈΠΌΠΎΠ² native ΠΈ jvm (вмСстС с Ρ„Π°ΠΉΠ»ΠΎΠΌ .dockerignore).
  • Папка resources (Π² ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅ src/main/): здСсь Π»Π΅ΠΆΠΈΡ‚ пустой Ρ„Π°ΠΉΠ» application.properties ΠΈ ΠΎΠ±Ρ€Π°Π·Π΅Ρ† стартовой страницы Quarkus index.html (ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅ см. Run the modernized helloworld ).

ЗапускаСм helloworld
Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΎΡ‚Π΅ΡΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ quarkus:dev, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ запускаСт Quarkus Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ development mode (ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅ см. Π²ΠΎΡ‚ этот Ρ€Π°Π·Π΄Π΅Π» Π² руководствС ΠΏΠΎ Development Mode).

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅: этот шаг ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌΠΎ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Ρ‚ ΠΊ ошибкС, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΌΡ‹ внСсли Π΅Ρ‰Π΅ Π½Π΅ всС Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ измСнСния.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ запускаСм ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ, ΠΊΠ°ΠΊ это сработаСт:

$ ./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 member: org.jboss.as.quickstarts.helloworld.HelloWorldServlet#helloService). ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ° Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ HelloWorldServlet Π½ΡƒΠΆΠ΅Π½ ΠΈΠ½ΠΆΠ΅ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ экзСмпляр HelloService, Π° Π΅Π³ΠΎ Π½Π΅ получаСтся Π½Π°ΠΉΡ‚ΠΈ (хотя ΠΎΠ±Π° этих класса ΠΈ находятся Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΈ Ρ‚ΠΎΠΌ ΠΆΠ΅ ΠΏΠ°ΠΊΠ΅Ρ‚Π΅).

Π‘Π°ΠΌΠΎΠ΅ врСмя Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒΡΡ ΠΊ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ ΠΈ ΠΏΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ, ΠΊΠ°ΠΊ Π² Quarkus Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Inject, Π° ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, ΠΈ Contexts and Dependency Injection (CDI). ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°Π΅ΠΌ руководство Contexts and Dependency Injection ΠΈ Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ Bean Discovery Ρ‡ΠΈΡ‚Π°Π΅ΠΌ: Β«Bean-класс, Ρƒ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π½Π΅Ρ‚ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‰Π΅ΠΉ bean Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΠΈ, Π½Π΅ ищСтся».

Π‘ΠΌΠΎΡ‚Ρ€ΠΈΠΌ класс HelloService – Π² Π½Π΅ΠΌ Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π½Π΅Ρ‚ Ρ‚Π°ΠΊΠΎΠΉ Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΠΈ. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Π΅Π΅ Π½Π°Π΄ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Quarkus ΠΌΠΎΠ³ ΠΈΡΠΊΠ°Ρ‚ΡŒ ΠΈ Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒ bean. И ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ это stateless-ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, ΠΌΡ‹ Π²ΠΏΠΎΠ»Π½Π΅ ΠΌΠΎΠΆΠ΅ΠΌ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΡŽ @ApplicationScoped ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

@ApplicationScoped
public class HelloService {

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅: здСсь срСда Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠΏΡ€ΠΎΡΠΈΡ‚ΡŒ вас Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Ρ‚Ρ€Π΅Π±ΡƒΠ΅ΠΌΡ‹ΠΉ ΠΏΠ°ΠΊΠ΅Ρ‚ (см. строку Π½ΠΈΠΆΠ΅), ΠΈ это придСтся ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ, Π²ΠΎΡ‚ Ρ‚Π°ΠΊ:

import javax.enterprise.context.ApplicationScoped;

Если ΡΠΎΠΌΠ½Π΅Π²Π°Π΅Ρ‚Π΅ΡΡŒ, ΠΊΠ°ΠΊΡƒΡŽ ΠΎΠ±Π»Π°ΡΡ‚ΡŒ scope Π½Π°Π΄ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π² Ρ‚ΠΎΠΌ случаС, ΠΊΠΎΠ³Π΄Π° для исходного bean’а ΠΎΠ½Π° Π½Π΅ Π·Π°Π΄Π°Π½Π° Π²ΠΎΠΎΠ±Ρ‰Π΅, ΠΏΡ€ΠΎΡˆΡ‚ΡƒΠ΄ΠΈΡ€ΡƒΠΉΡ‚Π΅ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡŽ JSR 365: Contexts and Dependency Injection for Java 2.0β€”Default scope.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΎΠΏΡΡ‚ΡŒ ΠΏΡ€ΠΎΠ±ΡƒΠ΅ΠΌ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ ./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]

Π’Π΅ΠΏΠ΅Ρ€ΡŒ всС ΠΏΡ€ΠΎΡ…ΠΎΠ΄ΠΈΡ‚ Π±Π΅Π· ошибок.

ЗапускаСм ΠΌΠΎΠ΄Π΅Ρ€Π½ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ helloworld
Как ΠΈ написано Π² Π»ΠΎΠ³Π΅, ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°Π΅ΠΌ Π² Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π΅ 0.0.0.0:8080 (стартовая страница Quarkus ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ) ΠΈ Π²ΠΈΠ΄ΠΈΠΌ Π²ΠΎΡ‚ Ρ‡Ρ‚ΠΎ:

Quarkus: модСрнизация ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ helloworld ΠΈΠ· JBoss EAP Quickstart

Рис. 4. Бтартовая страница Quarkus dev.

Π’ Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΠΈ WebServlet Ρƒ этого прилоТСния прописано ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ контСкста:

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

ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ ΠΈΠ΄Π΅ΠΌ Π² Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π΅ Π½Π° 0.0.0.0:8080/HelloWorld ΠΈ Π²ΠΈΠ΄ΠΈΠΌ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅:

Quarkus: модСрнизация ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ helloworld ΠΈΠ· JBoss EAP Quickstart

Рис. 5: Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° The Quarkus dev для прилоТСния Hello World.

Ну Π²ΠΎΡ‚, всё Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚.

А Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ вносим измСнСния Π² ΠΊΠΎΠ΄. ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ ΠΊΠΎΠΌΠ°Π½Π΄Π° ./mvnw compile quarkus:dev всС Π΅Ρ‰Π΅ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚, ΠΈ ΠΌΡ‹ Π½Π΅ собираСмся Π΅Π΅ ΠΎΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒ. Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΏΠΎΠΏΡ€ΠΎΠ±ΡƒΠ΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ΡŒ Ρ‚Π΅ ΠΆΠ΅ самыС – Ρ‚Ρ€ΠΈΠ²ΠΈΠ°Π»ΡŒΠ½Π΅ΠΉΡˆΠΈΠ΅ – измСнСния ΠΊ самому ΠΊΠΎΠ΄Ρƒ ΠΈ посмотрим, ΠΊΠ°ΠΊ Quarkus ΠΎΠ±Π»Π΅Π³Ρ‡Π°Π΅Ρ‚ Тизнь Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΡƒ:

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

БохраняСм Ρ„Π°ΠΉΠ» ΠΈ Π·Π°Ρ‚Π΅ΠΌ обновляСм Π²Π΅Π±-страницу, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ надпись Hello Marco, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π½Π° скринС Π½ΠΈΠΆΠ΅:

Quarkus: модСрнизация ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ helloworld ΠΈΠ· JBoss EAP Quickstart

Рис. 6. Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° Hello Marco Π² 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 сСкунды (Π²ΠΎΡ‚ ΠΎΠ½Π°, Ρ‚Π° самая «свСрхбыстрая субатомная JavaΒ»).

ВыполняСм сборку helloworld Π² ΠΏΠ°ΠΊΠ΅Ρ‚ JAR
Π’Π΅ΠΏΠ΅Ρ€ΡŒ, ΠΊΠΎΠ³Π΄Π° ΠΊΠΎΠ΄ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΊΠ°ΠΊ Π½Π°Π΄ΠΎ, ΡƒΠΏΠ°ΠΊΡƒΠ΅ΠΌ Π΅Π³ΠΎ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ:

$ ./mvnw clean package

Π­Ρ‚Π° ΠΊΠΎΠΌΠ°Π½Π΄Π° создаСт Π΄Π²Π° JAR-Ρ„Π°ΠΉΠ»Π° Π² ΠΏΠ°ΠΏΠΊΠ΅ /target: Ρ„Π°ΠΉΠ» helloworld-.jar, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ прСдставляСт собой стандартный Π°Ρ€Ρ‚Π΅Ρ„Π°ΠΊΡ‚, собранный Maven-ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ вмСстС классами ΠΈ рСсурсами ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°. И Ρ„Π°ΠΉΠ» helloworld—runner.jar, ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΠΉ собой исполняСмый JAR.

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ это Π½Π΅ ΡƒΠ±Π΅Ρ€-jar, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ всС зависимости просто скопированы Π² ΠΏΠ°ΠΏΠΊΡƒ /target/lib (Π° Π½Π΅ ΡƒΠΏΠ°ΠΊΠΎΠ²Π°Π½Ρ‹ Π² Ρ„Π°ΠΉΠ» JAR). ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ это JAR ΠΈΠ· Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΏΠ°ΠΏΠΊΠΈ ΠΈΠ»ΠΈ Π½Π° Π΄Ρ€ΡƒΠ³ΠΎΠΌ хостС, Ρ‚ΡƒΠ΄Π° Π½Π°Π΄ΠΎ ΡΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠ°ΠΊ сам JAR-Ρ„Π°ΠΉΠ», Ρ‚Π°ΠΊ ΠΈ ΠΏΠ°ΠΏΠΊΡƒ /lib, учитывая Ρ‡Ρ‚ΠΎ элСмСнт Class-Path Π² Ρ„Π°ΠΉΠ»Π΅ MANIFEST.MF Π² ΠΏΠ°ΠΊΠ΅Ρ‚Π΅ JAR содСрТит явноС пСрСчислСниС JAR’ов ΠΈΠ· ΠΏΠ°ΠΏΠΊΠΈ lib.
Π§Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ·Π½Π°Ρ‚ΡŒ, ΠΊΠ°ΠΊ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ прилоТСния ΡƒΠ±Π΅Ρ€-jar, ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ΡΡŒ ΠΊ руководству Uber-Jar Creation.

ЗапускаСм 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]

ПослС Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ всС это выполнится, Π·Π°ΠΉΠ΄ΠΈΡ‚Π΅ Π² Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π΅ Π½Π° 0.0.0.0:8080 ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅, Ρ‡Ρ‚ΠΎ всС Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΊΠ°ΠΊ Π½Π°Π΄ΠΎ.

Π‘ΠΎΠ±ΠΈΡ€Π°Π΅ΠΌ helloworld Π² Π½Π°Ρ‚ΠΈΠ²Π½Ρ‹ΠΉ исполняСмый Ρ„Π°ΠΉΠ»

Π˜Ρ‚Π°ΠΊ, наш helloworld Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΊΠ°ΠΊ standalone-ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ 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. ИдСм Π² ΠΏΠ°ΠΏΠΊΡƒ untar.

4. ЗапускаСм ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΡƒΡŽ Π½ΠΈΠΆΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠΊΠ°Ρ‡Π°Ρ‚ΡŒ ΠΈ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π½Π°Ρ‚ΠΈΠ²Π½Ρ‹ΠΉ ΠΎΠ±Ρ€Π°Π·:

$ ./bin/gu install native-image

5. ΠŸΡ€ΠΎΠΏΠΈΡΡ‹Π²Π°Π΅ΠΌ ΠΏΠ°ΠΏΠΊΡƒ, ΡΠΎΠ·Π΄Π°Π½Π½ΡƒΡŽ Π½Π° шагС 2, Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ срСды GRAALVM_HOME:

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

Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ свСдСния ΠΈ инструкции ΠΏΠΎ установкС Π½Π° Π΄Ρ€ΡƒΠ³ΠΈΡ… ОБ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡ‚ΠΈ Π² руководствС Building a Native Executableβ€”Prerequisites.

ВыполняСм сборку helloworld Π² Π½Π°Ρ‚ΠΈΠ²Π½Ρ‹ΠΉ исполняСмый Ρ„Π°ΠΉΠ»
Π§ΠΈΡ‚Π°Π΅ΠΌ руководство Building a Native Executableβ€”Producing a native executable: «А Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ создадим Π½Π°Ρ‚ΠΈΠ²Π½Ρ‹ΠΉ исполняСмый Ρ„Π°ΠΉΠ» для нашСго прилоТСния, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠΎΠΊΡ€Π°Ρ‚ΠΈΡ‚ΡŒ врСмя Π΅Π³ΠΎ запуска ΠΈ Ρ€Π°Π·ΠΌΠ΅Ρ€ Π½Π° дискС. Π˜ΡΠΏΠΎΠ»Π½ΡΠ΅ΠΌΡ‹ΠΉ Ρ„Π°ΠΉΠ» Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ всС Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΠ΅ для запуска прилоТСния, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ JVM-ΠΌΠ°ΡˆΠΈΠ½Ρƒ (Π²Π΅Ρ€Π½Π΅Π΅, Π΅Π΅ ΡƒΡΠ΅Ρ‡Π΅Π½Π½ΡƒΡŽ Π²Π΅Ρ€ΡΠΈΡŽ, ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‰ΡƒΡŽ лишь Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ трСбуСтся для выполнСния прилоТСния) ΠΈ само нашС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅Β».

Π§Ρ‚ΠΎΠ±Ρ‹ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π½Π°Ρ‚ΠΈΠ²Π½Ρ‹ΠΉ исполняСмый Ρ„Π°ΠΉΠ», Π½Π°Π΄ΠΎ Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ native-ΠΏΡ€ΠΎΡ„ΠΈΠ»ΡŒ 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]

ΠžΠΏΡΡ‚ΡŒ ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°Π΅ΠΌ Π² Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π΅ 0.0.0.0:8080 ΠΈ провСряСм, Ρ‡Ρ‚ΠΎ всС Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΊΠ°ΠΊ Π½Π°Π΄ΠΎ.

ΠŸΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ΅Π½ΠΈΠ΅ слСдуСт!

ΠœΡ‹ считаСм, Ρ‡Ρ‚ΠΎ рассмотрСнный Π² этом постС (ΠΏΡƒΡΡ‚ΡŒ ΠΈ Π½Π° ΠΏΡ€ΠΎΡΡ‚Π΅ΠΉΡˆΠ΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅) ΠΌΠ΅Ρ‚ΠΎΠ΄ ΠΌΠΎΠ΄Π΅Ρ€Π½ΠΈΠ·Π°Ρ†ΠΈΠΈ Java-ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ с использованиСм возмоТностСй Quarkus стоит Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ Π² Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠΌ ΠΆΠΈΠ·Π½ΠΈ. ΠŸΡ€ΠΈ этом Π²Ρ‹, скорСС всСго, ΡΡ‚ΠΎΠ»ΠΊΠ½Π΅Ρ‚Π΅ΡΡŒ с рядом ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ, Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΌΡ‹ частично рассмотрим Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ постС, Π³Π΄Π΅ Ρ€Π΅Ρ‡ΡŒ ΠΏΠΎΠΉΠ΄Π΅Ρ‚ ΠΎ Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊ Π·Π°ΠΌΠ΅Ρ€ΡΡ‚ΡŒ расход памяти для ΠΎΡ†Π΅Π½ΠΊΠΈ ΡƒΠ»ΡƒΡ‡ΡˆΠ΅Π½ΠΈΡ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ, Π²Π°ΠΆΠ½ΠΎΠΉ части всСго процСсс ΠΌΠΎΠ΄Π΅Ρ€Π½ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: habr.com

Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ