рдХреНрд╡рд╛рд░реНрдХрд╕ рд╣рд╛ рд╕реБрдкрд░рд╕реЙрдирд┐рдХ рд╕рдмрдЯреЙрдорд┐рдХ рдЬрд╛рд╡рд╛ рдЖрд╣реЗ. рдлреНрд░реЗрдорд╡рд░реНрдХрдЪреЗ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд╡рд┐рд╣рдВрдЧрд╛рд╡рд▓реЛрдХрди

рдХреНрд╡рд╛рд░реНрдХрд╕ рд╣рд╛ рд╕реБрдкрд░рд╕реЙрдирд┐рдХ рд╕рдмрдЯреЙрдорд┐рдХ рдЬрд╛рд╡рд╛ рдЖрд╣реЗ. рдлреНрд░реЗрдорд╡рд░реНрдХрдЪреЗ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд╡рд┐рд╣рдВрдЧрд╛рд╡рд▓реЛрдХрди

рдкрд░рд┐рдЪрдп

XNUMX рдорд╛рд░реНрдЪ рд░реЛрдЬреА, RedHat (рд▓рд╡рдХрд░рдЪ IBM) рд╕рд╛рджрд░ рдирд╡реАрди рдлреНрд░реЗрдорд╡рд░реНрдХ - рдХреНрд╡рд╛рд░реНрдХрд╕. рд╡рд┐рдХрд╕рдХрд╛рдВрдЪреНрдпрд╛ рдорддреЗ, рд╣реЗ рдлреНрд░реЗрдорд╡рд░реНрдХ GraalVM рдЖрдгрд┐ OpenJDK HotSpot рд╡рд░ рдЖрдзрд╛рд░рд┐рдд рдЖрд╣реЗ рдЖрдгрд┐ Kubernetes рд╕рд╛рдареА рдбрд┐рдЭрд╛рдЗрди рдХреЗрд▓реЗрд▓реЗ рдЖрд╣реЗ. рдХреНрд╡рд╛рд░реНрдХрд╕ рд╕реНрдЯреЕрдХрдордзреНрдпреЗ рд╣реЗ рд╕рдорд╛рд╡рд┐рд╖реНрдЯ рдЖрд╣реЗ: JPA/Hibernate, JAX-RS/RESTEasy, Eclipse Vert.x, Netty, Apache Camel, Kafka, Prometheus рдЖрдгрд┐ рдЗрддрд░.

Java рд▓рд╛ Kubernetes рдЙрдкрдпреЛрдЬрди рдЖрдгрд┐ рд╕рд░реНрд╡реНрд╣рд░рд▓реЗрд╕ рдНрдкреНрд▓рд┐рдХреЗрд╢рди рдбреЗрд╡реНрд╣рд▓рдкрдореЗрдВрдЯрд╕рд╛рдареА рдЕрдЧреНрд░рдЧрдгреНрдп рд╡реНрдпрд╛рд╕рдкреАрда рдмрдирд╡рдгреЗ рд╣реЗ рдЙрджреНрджрд┐рд╖реНрдЯ рдЖрд╣реЗ, рд╡рд┐рдХрд╛рд╕рдХрд╛рдВрдирд╛ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рддреНрдордХ рдЖрдгрд┐ рдЕрдирд┐рд╡рд╛рд░реНрдп рджреЛрдиреНрд╣реА рд╢реИрд▓реАрдВрдордзреНрдпреЗ рд╡рд┐рдХрд╛рд╕рд╛рд╕рд╛рдареА рдПрдХрд╕рдВрдз рджреГрд╖реНрдЯреАрдХреЛрди рдкреНрд░рджрд╛рди рдХрд░рдгреЗ.

рдмрдШрд┐рддрд▓реЗ рддрд░ рд╣реЗ рдлреНрд░реЗрдорд╡рд░реНрдХрдЪреЗ рд╡рд░реНрдЧреАрдХрд░рдг, рддрд░ рдХреНрд╡рд╛рд░реНрдХрд╕ рдХреБрдареЗрддрд░реА "рдПрдЧреНрд░реАрдЧреЗрдЯрд░/рдХреЛрдб рдЬрдирд░реЗрдЯрд░" рдЖрдгрд┐ "рдЙрдЪреНрдЪ-рд╕реНрддрд░реАрдп рдлреБрд▓рд╕реНрдЯреЕрдХ рдлреНрд░реЗрдорд╡рд░реНрдХ" рдордзреНрдпреЗ рдЖрд╣реЗ. рд╣реЗ рдЖрдзреАрдЪ рдПрдЧреНрд░реАрдЧреЗрдЯрд░рдкреЗрдХреНрд╖рд╛ рдЬрд╛рд╕реНрдд рдЖрд╣реЗ, рдкрд░рдВрддреБ рддреЗ рдкреВрд░реНрдг-рд╕реНрдЯреЕрдХрдкрд░реНрдпрдВрдд рдкреЛрд╣реЛрдЪрдд рдирд╛рд╣реА, рдХрд╛рд░рдг... рдмреЕрдХрдПрдВрдб рд╡рд┐рдХрд╛рд╕рд╛рд╕рд╛рдареА рддрдпрд╛рд░ рдХреЗрд▓реЗрд▓реЗ.

рдЕреЕрдкреНрд▓рд┐рдХреЗрд╢рди рд▓рд╛рдБрдЪрдЪрд╛ рдЦреВрдк рд╡реЗрдЧ рдЖрдгрд┐ рдХрдореА рдореЗрдорд░реА рд╡рд╛рдкрд░рдгреНрдпрд╛рдЪреЗ рд╡рдЪрди рджрд┐рд▓реЗ рдЖрд╣реЗ. рд╡рд┐рдХрд╕рдХрд╛рдЪреНрдпрд╛ рд╡реЗрдмрд╕рд╛рдЗрдЯрд╡рд░реАрд▓ рдбреЗрдЯрд╛ рдпреЗрдереЗ рдЖрд╣реЗ:

рд╕реБрд░реБрд╡рд╛рддреАрдкрд╛рд╕реВрди рдкрд╣рд┐рд▓реНрдпрд╛ рдкреНрд░рддрд┐рд╕рд╛рджрд╛рдкрд░реНрдпрдВрдд рд╡реЗрд│:

рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди
рдЙрд░реНрд╡рд░рд┐рдд
REST+JPA

Quarkus+GraalVM
0.014
0.055

рдХреНрд╡рд╛рд░реНрдХрд╕+рдУрдкрдирдЬреЗрдбреАрдХреЗ
0.75
2.5

рдкрд╛рд░рдВрдкрд╛рд░рд┐рдХ рдХреНрд▓рд╛рдЙрдб рдиреЗрдЯрд┐рд╡реНрд╣ рд╕реНрдЯреЕрдХ*
4.3
9.5

рдореЗрдорд░реА рд╡рд╛рдкрд░ (Mb):

рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди
рдЙрд░реНрд╡рд░рд┐рдд
REST+JPA

Quarkus+GraalVM
13
35

рдХреНрд╡рд╛рд░реНрдХрд╕+рдУрдкрдирдЬреЗрдбреАрдХреЗ
74
130

рдкрд╛рд░рдВрдкрд╛рд░рд┐рдХ рдХреНрд▓рд╛рдЙрдб рдиреЗрдЯрд┐рд╡реНрд╣ рд╕реНрдЯреЕрдХ*
140
218

рдкреНрд░рднрд╛рд╡реА, рдирд╛рд╣реА рдХрд╛?

*рдорд▓рд╛ рдпрд╛ рддрдВрддреНрд░рдЬреНрдЮрд╛рдирд╛рдЪреНрдпрд╛ рд╕реНрдЯреЕрдХрдмрджреНрджрд▓ рдХреЛрдгрддреАрд╣реА рдорд╛рд╣рд┐рддреА рдЖрдврд│рд▓реА рдирд╛рд╣реА, рдЖрдореНрд╣реА рдЕрд╕реЗ рдЧреГрд╣реАрдд рдзрд░реВ рд╢рдХрддреЛ рдХреА рд╣реЗ рдЕрддрд┐рд░рд┐рдХреНрдд рдмреЙрдбреА рдХрд┐рдЯрд╕рд╣ рдХрд╛рд╣реА рдкреНрд░рдХрд╛рд░рдЪреЗ рд╕реНрдкреНрд░рд┐рдВрдЧ рдмреВрдЯ рдЖрд╣реЗ.

рд╣реЕрд▓реЛ рд╡рд░реНрд▓реНрдб!

рдХреНрд╡рд╛рд░реНрдХрд╕рдордзреНрдпреЗ рд▓рд┐рд╣рд┐рд▓реЗрд▓рд╛ рд╕рд░реНрд╡рд╛рдд рд╕реЛрдкрд╛ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдЕрд╕реЗ рджрд┐рд╕реЗрд▓:

@Path("/hello")
public class GreetingResource {

   @GET
   @Produces(MediaType.TEXT_PLAIN)
   public String hello() {
       return "hello";
   }
}

рд╣реЗ рдЕрдХреНрд╖рд░рд╢рдГ рдПрдХ рд╡рд░реНрдЧ рдЖрд╣реЗ рдЖрдгрд┐ рддреЗ рдкреБрд░реЗрд╕реЗ рдЖрд╣реЗ! рдЖрдкрдг рд╡рд┐рдХрд╛рд╕ рдореЛрдбрдордзреНрдпреЗ рдореЕрд╡реЗрди рд╡рд╛рдкрд░реВрди рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдЪрд╛рд▓рд╡реВ рд╢рдХрддрд╛:

mvn compile quarkus:dev
тАж
$ curl http://localhost:8080/hello
hello

рдирд┐рдпрдорд┐рдд рдЕрд░реНрдЬрд╛рдкреЗрдХреНрд╖рд╛ рдлрд░рдХ рдЕрд╕рд╛ рдЖрд╣реЗ рдХреА рддреЗрдереЗ рдХреЛрдгрддрд╛рд╣реА рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд╡рд░реНрдЧ рдирд╛рд╣реА! рдХреНрд╡рд╛рд░реНрдХрд╕ рд╣реЙрдЯ рд░реАрд▓реЛрдбрд▓рд╛ рд╕рдкреЛрд░реНрдЯ рдХрд░рддреЗ, рддреНрдпрд╛рдореБрд│реЗ рддреБрдореНрд╣реА рддреБрдордЪрд╛ рдЕреЕрдкреНрд▓рд┐рдХреЗрд╢рди рд░реАрд╕реНрдЯрд╛рд░реНрдЯ рди рдХрд░рддрд╛ рдмрджрд▓реВ рд╢рдХрддрд╛, рд╡рд┐рдХрд╛рд╕ рдЖрдгрдЦреА рдЬрд▓рдж рдмрдирд╡реВ рд╢рдХрддрд╛.

рдкреБрдвреЗ рдХрд╛рдп? рддреБрдореНрд╣реА рднрд╛рд╖реНрдп рд╡рд╛рдкрд░реВрди рдХрдВрдЯреНрд░реЛрд▓рд░рдордзреНрдпреЗ рд╕реЗрд╡рд╛ рдЬреЛрдбреВ рд╢рдХрддрд╛ рдЗрдВрдЬреЗрдХреНрдЯ рдХрд░рд╛. рд╕реЗрд╡рд╛ рдХреЛрдб:

@ApplicationScoped
public class GreetingService {

   public String greeting(String name) {
       return "Hello " + name + "!";
   }
}

рдирд┐рдпрдВрддреНрд░рдХ:

@Path("/hello")
public class GreetingResource {

   @Inject
   GreetingService service;

   @GET
   @Produces(MediaType.TEXT_PLAIN)
   @Path("/{name}")
   public String greeting(@PathParam("name") String name) {
       return service.greeting(name);
   }
}

$ curl http://localhost:8080/hello/developer
Hello developer!

рд▓рдХреНрд╖рд╛рдд рдШреНрдпрд╛ рдХреА рдХреНрд╡рд╛рд░реНрдХрд╕ рдкрд░рд┐рдЪрд┐рдд рдлреНрд░реЗрдорд╡рд░реНрдХ - CDI рдЖрдгрд┐ JAX-RS рдордзреАрд▓ рдорд╛рдирдХ рднрд╛рд╖реНрдпреЗ рд╡рд╛рдкрд░рддреЗ. рдЬрд░ рддреБрдореНрд╣реА рдЖрдзреА CDI рдЖрдгрд┐ JAX-RS рд╕рд╣ рдХрд╛рдо рдХреЗрд▓реЗ рдЕрд╕реЗрд▓ рддрд░ рдХрд╛рд╣реА рдирд╡реАрди рд╢рд┐рдХрдгреНрдпрд╛рдЪреА рдЧрд░рдЬ рдирд╛рд╣реА.

рдбреЗрдЯрд╛рдмреЗрд╕рд╕рд╣ рдХрд╛рд░реНрдп рдХрд░рдгреЗ

рдШрдЯрдХрд╛рдВрд╕рд╛рдареА рд╣рд╛рдпрдмрд░рдиреЗрдЯ рдЖрдгрд┐ рдорд╛рдирдХ JPA рднрд╛рд╖реНрдпреЗ рд╡рд╛рдкрд░рд▓реА рдЬрд╛рддрд╛рдд. REST рдирд┐рдпрдВрддреНрд░рдХрд╛рдВрдкреНрд░рдорд╛рдгреЗ, рддреБрдореНрд╣рд╛рд▓рд╛ рдХрд┐рдорд╛рди рдХреЛрдб рд▓рд┐рд╣рд╛рд╡рд╛ рд▓рд╛рдЧреЗрд▓. рдЕрд╕реЗрдВрдмреНрд▓реА рдлрд╛рдЗрд▓рдордзреАрд▓ рдЕрд╡рд▓рдВрдмрд┐рддреНрд╡ рджрд░реНрд╢рд╡рд┐рдгреНрдпрд╛рд╕рд╛рдареА, рднрд╛рд╖реНрдпреЗ рдЬреЛрдбрдгреЗ рдкреБрд░реЗрд╕реЗ рдЖрд╣реЗ @Entity рдЖрдгрд┐ application.properties рдордзреНрдпреЗ рдбреЗрдЯрд╛рд╕реЛрд░реНрд╕ рдХреЙрдиреНрдлрд┐рдЧрд░ рдХрд░рд╛.

рд╕рд░реНрд╡. рдХреЛрдгрддреАрд╣реА sessionFactory, persistence.xml рдХрд┐рдВрд╡рд╛ рдЗрддрд░ рд╕реЗрд╡рд╛ рдлрд╛рдЗрд▓ рдирд╛рд╣реАрдд. рдЖрдореНрд╣реА рдлрдХреНрдд рдЖрд╡рд╢реНрдпрдХ рдЕрд╕рд▓реЗрд▓рд╛ рдХреЛрдб рд▓рд┐рд╣рд┐рддреЛ. рддрдерд╛рдкрд┐, рдЖрд╡рд╢реНрдпрдХ рдЕрд╕рд▓реНрдпрд╛рд╕, рддреБрдореНрд╣реА persistence.xml рдлрд╛рдЗрд▓ рддрдпрд╛рд░ рдХрд░реВ рд╢рдХрддрд╛ рдЖрдгрд┐ ORM рд▓реЗрдпрд░ рдЕрдзрд┐рдХ рдмрд╛рд░реАрдХрдкрдгреЗ рдХреЙрдиреНрдлрд┐рдЧрд░ рдХрд░реВ рд╢рдХрддрд╛.

рдХреНрд╡рд╛рд░реНрдХрд╕ рд╕рдВрд╕реНрдерд╛рдВрдЪреЗ рдХреЕрд╢рд┐рдВрдЧ, рдПрдХ-рддреЗ-рдЕрдиреЗрдХ рд╕рдВрдмрдВрдзрд╛рдВрд╕рд╛рдареА рд╕рдВрдЧреНрд░рд╣ рдЖрдгрд┐ рдХреНрд╡реЗрд░реАрд╕ рд╕рдорд░реНрдерди рджреЗрддреЗ. рдкрд╣рд┐рд▓реНрдпрд╛ рджреГрд╖реНрдЯреАрдХреНрд╖реЗрдкрд╛рдд рддреЗ рдЫрд╛рди рджрд┐рд╕рддреЗ, рдкрд░рдВрддреБ рддреЗ рдЖрд╣реЗ рд╕реНрдерд╛рдирд┐рдХ рдХреЕрд╢рд┐рдВрдЧ, рдПрдХрд╛ рдХреБрдмрд░реНрдиреЗрдЯреНрд╕ рдиреЛрдбрд╕рд╛рдареА. рддреНрдпрд╛. рд╡реЗрдЧрд╡реЗрдЧрд│реНрдпрд╛ рдиреЛрдбреНрд╕рдЪреЗ рдХреЕрд╢реЗ рдПрдХрдореЗрдХрд╛рдВрд╢реА рд╕рд┐рдВрдХреНрд░реЛрдирд╛рдЗрдЭ рдХреЗрд▓реЗрд▓реЗ рдирд╛рд╣реАрдд. рдорд▓рд╛ рдЖрд╢рд╛ рдЖрд╣реЗ рдХреА рд╣реЗ рддрд╛рддреНрдкреБрд░рддреЗ рдЖрд╣реЗ.

рдЕрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдХреЛрдбрдЪреА рдЕрдВрдорд▓рдмрдЬрд╛рд╡рдгреА

рд╡рд░ рдирдореВрдж рдХреЗрд▓реНрдпрд╛рдкреНрд░рдорд╛рдгреЗ, рдХреНрд╡рд╛рд░реНрдХрд╕ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рд╢реИрд▓реАрд▓рд╛ рджреЗрдЦреАрд▓ рд╕рдорд░реНрдерди рджреЗрддреЗ. рдорд╛рдЧреАрд▓ рдЕрд░реНрдЬрд╛рдЪрд╛ рдХреЛрдб рд╡реЗрдЧрд│реНрдпрд╛ рд╕реНрд╡рд░реВрдкрд╛рдд рд▓рд┐рд╣рд┐рд▓рд╛ рдЬрд╛рдК рд╢рдХрддреЛ.

@Path("/hello")
public class GreetingResource {

   @GET
   @Produces(MediaType.TEXT_PLAIN)
   @Path("/{name}")
   public CompletionStage<String> greeting(@PathParam("name") String name) {
       return CompletableFuture.supplyAsync(() -> {
           return "Hello " + name + "!";
       });
   }
}

рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдХреЛрдб рджреЗрдЦреАрд▓ рд╕реЗрд╡реЗрдордзреНрдпреЗ рд╣рд╕реНрддрд╛рдВрддрд░рд┐рдд рдХреЗрд▓рд╛ рдЬрд╛рдК рд╢рдХрддреЛ, рдкрд░рд┐рдгрд╛рдо рд╕рдорд╛рди рдЕрд╕реЗрд▓.

рдЪрд╛рдЪрдгреА

рдХреНрд╡рд╛рд░реНрдХрд╕ рдНрдкреНрд▓рд┐рдХреЗрд╢рдиреНрд╕рд╕рд╛рдареА рдЪрд╛рдЪрдгреНрдпрд╛ JUnit4 рдХрд┐рдВрд╡рд╛ JUnit5 рдордзреНрдпреЗ рд▓рд┐рд╣рд┐рд▓реНрдпрд╛ рдЬрд╛рдК рд╢рдХрддрд╛рдд. рдЦрд╛рд▓реА рдПрдВрдбрдкреЙрдЗрдВрдЯрд╕рд╛рдареА рдЙрджрд╛рд╣рд░рдг рдЪрд╛рдЪрдгреА рдЖрд╣реЗ, рддреА рд░реЗрд╕реНрдЯрдЕреЕрд╢реНрдпрд░реНрдб рд╡рд╛рдкрд░реВрди рд▓рд┐рд╣рд┐рд▓реА рдЖрд╣реЗ, рдкрд░рдВрддреБ рджреБрд╕рд░реЗ рдлреНрд░реЗрдорд╡рд░реНрдХ рд╡рд╛рдкрд░рд▓реЗ рдЬрд╛рдК рд╢рдХрддреЗ:

@QuarkusTest
public class GreetingResourceTest {

   @Test
   public void testGreetingEndpoint() {
       String uuid = UUID.randomUUID().toString();
       given()
         .pathParam("name", uuid)
         .when().get("/hello/{name}")
         .then()
           .statusCode(200)
           .body(is("Hello " + uuid + "!"));
   }
}

@QuarkusTest рднрд╛рд╖реНрдп рддреБрдореНрд╣рд╛рд▓рд╛ рдЪрд╛рдЪрдгреНрдпрд╛ рдЪрд╛рд▓рд╡рдгреНрдпрд╛рдкреВрд░реНрд╡реА рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдЪрд╛рд▓рд╡рдгреНрдпрд╛рдЪреА рд╕реВрдЪрдирд╛ рджреЗрддреЗ. рдмрд╛рдХреА рд╕рд░реНрд╡ рд╡рд┐рдХрд╕рдХрд╛рдВрдирд╛ рдкрд░рд┐рдЪрд┐рдд рдЕрд╕рд▓реЗрд▓рд╛ рдХреЛрдб рдЖрд╣реЗ.

рдкреНрд▓реЕрдЯрдлреЙрд░реНрдо-рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЕрдиреБрдкреНрд░рдпреЛрдЧ

Quarkus GraalVM рд╕рд╣ рдШрдЯреНрдЯрдкрдгреЗ рд╕рдорд╛рдХрд▓рд┐рдд рдХреЗрд▓реНрдпрд╛рдореБрд│реЗ, рдЕрд░реНрдерд╛рддрдЪ рдкреНрд▓реЕрдЯрдлреЙрд░реНрдо-рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХреЛрдб рддрдпрд╛рд░ рдХрд░рдгреЗ рд╢рдХреНрдп рдЖрд╣реЗ. рд╣реЗ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА, рддреБрдореНрд╣рд╛рд▓рд╛ GraalVM рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░рд╛рд╡реЗ рд▓рд╛рдЧреЗрд▓ рдЖрдгрд┐ GRAALVM_HOME рдкрд░реНрдпрд╛рд╡рд░рдг рд╡реНрд╣реЗрд░рд┐рдПрдмрд▓ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рд╛рд╡реЗ рд▓рд╛рдЧреЗрд▓. рдкреБрдвреАрд▓ рдЕрд╕реЗрдВрдмреНрд▓реАрд╕рд╛рдареА рдкреНрд░реЛрдлрд╛рдЗрд▓ рдиреЛрдВрджрдгреА рдХрд░рд╛ рдЖрдгрд┐ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рддрдпрд╛рд░ рдХрд░рддрд╛рдирд╛ рддреЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рд╛:

mvn package -Pnative

рд╡рд┐рд╢реЗрд╖ рдореНрд╣рдгрдЬреЗ рдЬрдирд░реЗрдЯ рдХреЗрд▓реЗрд▓реНрдпрд╛ рдЕреЕрдкреНрд▓рд┐рдХреЗрд╢рдирдЪреА рдЪрд╛рдЪрдгреА рдШреЗрддрд▓реА рдЬрд╛рдК рд╢рдХрддреЗ. рдЖрдгрд┐ рд╣реЗ рдорд╣рддреНрддреНрд╡рд╛рдЪреЗ рдЖрд╣реЗ рдХрд╛рд░рдг рдиреЗрдЯрд┐рд╡реНрд╣ рдХреЛрдбрдЪреА рдЕрдВрдорд▓рдмрдЬрд╛рд╡рдгреА JVM рд╡рд░реАрд▓ рдЕрдВрдорд▓рдмрдЬрд╛рд╡рдгреАрдкреЗрдХреНрд╖рд╛ рд╡реЗрдЧрд│реА рдЕрд╕реВ рд╢рдХрддреЗ. @SubstrateTest рднрд╛рд╖реНрдп рдкреНрд▓реЕрдЯрдлреЙрд░реНрдо-рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдХреЛрдб рдЪрд╛рд▓рд╡рддреЗ. рд╡рд┐рджреНрдпрдорд╛рди рдЪрд╛рдЪрдгреА рдХреЛрдбрдЪрд╛ рдкреБрдирд░реНрд╡рд╛рдкрд░ рд╡рд╛рд░рд╕рд╛ рд╡рд╛рдкрд░реВрди рдХреЗрд▓рд╛ рдЬрд╛рдК рд╢рдХрддреЛ; рдкрд░рд┐рдгрд╛рдореА, рдкреНрд▓реЕрдЯрдлреЙрд░реНрдорд╡рд░ рдЕрд╡рд▓рдВрдмреВрди рдЕрд╕рд▓реЗрд▓реНрдпрд╛ рдЕрдиреБрдкреНрд░рдпреЛрдЧрд╛рдЪреА рдЪрд╛рдЪрдгреА рдХрд░рдгреНрдпрд╛рдЪрд╛ рдХреЛрдб рдпрд╛рд╕рд╛рд░рдЦрд╛ рджрд┐рд╕реЗрд▓:

@SubstrateTest
public class GreetingResourceIT extends GreetingResourceTest {

}

рд╡реНрдпреБрддреНрдкрдиреНрди рдХреЗрд▓реЗрд▓реА рдкреНрд░рддрд┐рдорд╛ рдбреЙрдХрд░рдордзреНрдпреЗ рдкреЕрдХ рдХреЗрд▓реА рдЬрд╛рдК рд╢рдХрддреЗ рдЖрдгрд┐ рдХреБрдмрд░реНрдиреЗрдЯреНрд╕ рдХрд┐рдВрд╡рд╛ рдУрдкрдирд╢рд┐рдлреНрдЯрдордзреНрдпреЗ рдЪрд╛рд▓рд╡рд┐рд▓реА рдЬрд╛рдК рд╢рдХрддреЗ, рдЬреНрдпрд╛рдордзреНрдпреЗ рддрдкрд╢реАрд▓рд╡рд╛рд░ рд╡рд░реНрдгрди рдХреЗрд▓реЗ рдЖрд╣реЗ рд╕реВрдЪрдирд╛.

рдЯреВрд▓рдХрд┐рдЯ

рдХреНрд╡рд╛рд░реНрдХрд╕ рдлреНрд░реЗрдорд╡рд░реНрдХ рдорд╛рд╡реЗрди рдЖрдгрд┐ рдЧреНрд░реЕрдбрд▓рд╕рд╣ рд╡рд╛рдкрд░рд▓реЗ рдЬрд╛рдК рд╢рдХрддреЗ. Maven рдкреВрд░реНрдгрдкрдгреЗ рд╕рдорд░реНрдерд┐рдд рдЖрд╣реЗ, Gradle рд╡рд┐рдкрд░реАрдд. рджреБрд░реНрджреИрд╡рд╛рдиреЗ, рдпрд╛ рдХреНрд╖рдгреА Gradle рд░рд┐рдХреНрдд рдкреНрд░рдХрд▓реНрдк рддрдпрд╛рд░ рдХрд░рдгреНрдпрд╛рд╕ рд╕рдорд░реНрдерди рджреЗрдд рдирд╛рд╣реА; рд╡реЗрдмрд╕рд╛рдЗрдЯрд╡рд░ рддрдкрд╢реАрд▓рд╡рд╛рд░ рдорд╛рд╣рд┐рддреА рдЖрд╣реЗ рдкрд╛рдареНрдпрдкреБрд╕реНрддрдХ.

рд╡рд┐рд╕реНрддрд╛рд░

рдХреНрд╡рд╛рд░реНрдХрд╕ рдПрдХ рд╡рд┐рд╕реНрддрд╛рд░рдиреАрдп рдлреНрд░реЗрдорд╡рд░реНрдХ рдЖрд╣реЗ. рд╕рдзреНрдпрд╛ рдПрдХ рдСрд░реНрдбрд░ рдЖрд╣реЗ 40 рд╡рд┐рд╕реНрддрд╛рд░, рдЬреЗ рд╡рд┐рд╡рд┐рдз рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдЬреЛрдбрддрд╛рдд - рд╕рдорд░реНрдерди рдкрд╛рд╕реВрди рд╕реНрдкреНрд░рд┐рдВрдЧ рдбреАрдЖрдп рдХрдВрдЯреЗрдирд░ ╨╕ рдЕрдкрд╛рдЪреЗ рдЙрдВрдЯ рдЪрд╛рд▓реВ рд╕реЗрд╡рд╛рдВрд╕рд╛рдареА рдореЗрдЯреНрд░рд┐рдХреНрд╕ рд▓реЙрдЧрд┐рдВрдЧ рдЖрдгрд┐ рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд░рдгреНрдпрд╛рдкреВрд░реНрд╡реА. рдЖрдгрд┐ рдЬрд╛рд╡рд╛ рд╡реНрдпрддрд┐рд░рд┐рдХреНрдд рдХреЛрдЯрд▓рд┐рдирдордзреНрдпреЗ рд▓реЗрдЦрди рдЕрдиреБрдкреНрд░рдпреЛрдЧрд╛рдВрдирд╛ рд╕рдорд░реНрдерди рджреЗрдгреНрдпрд╛рд╕рд╛рдареА рдЖрдзреАрдЪ рдПрдХ рд╡рд┐рд╕реНрддрд╛рд░ рдЖрд╣реЗ.

рдирд┐рд╖реНрдХрд░реНрд╖

рдорд╛рдЭреНрдпрд╛ рдорддреЗ, рдХреНрд╡рд╛рд░реНрдХрд╕ рддреНрдпрд╛ рдХрд╛рд│рд╛рддреАрд▓ рдЯреНрд░реЗрдВрдбрд╢реА рдЕрдЧрджреА рд╕реБрд╕рдВрдЧрдд рдЖрд╣реЗ. рдмреЕрдХрдПрдВрдб рдХреЛрдб рдбреЗрд╡реНрд╣рд▓рдкрдореЗрдВрдЯ рд╕реЛрдкреА рдЖрдгрд┐ рд╕реЛрдкреА рд╣реЛрдд рдЖрд╣реЗ рдЖрдгрд┐ рд╣реЗ рдлреНрд░реЗрдорд╡рд░реНрдХ рдбреЙрдХрд░ рдЖрдгрд┐ рдХреБрдмрд░реНрдиреЗрдЯреНрд╕рд╕рд╛рдареА рдиреЗрдЯрд┐рд╡реНрд╣ рд╕рдкреЛрд░реНрдЯ рдЬреЛрдбреВрди рд╕реЗрд╡рд╛ рдбреЗрд╡реНрд╣рд▓рдкрдореЗрдВрдЯрд▓рд╛ рдЖрдгрдЦреА рд╕реБрд▓рдн рдХрд░рддреЗ рдЖрдгрд┐ рд╡реЗрдЧрд╡рд╛рди рдХрд░рддреЗ. GraalVM рдЖрдгрд┐ рдкреНрд▓реЕрдЯрдлреЙрд░реНрдо-рдЖрд╢реНрд░рд┐рдд рдкреНрд░рддрд┐рдорд╛рдВрдЪреНрдпрд╛ рдирд┐рд░реНрдорд┐рддреАрд╕рд╛рдареА рдЕрдВрдЧрднреВрдд рд╕рдорд░реНрдерди рд╣реЗ рдПрдХ рдореЛрдареЗ рдкреНрд▓рд╕ рдЖрд╣реЗ, рдЬреЗ рд╕реЗрд╡рд╛ рдЦрд░реЛрдЦрд░ рдЬрд▓рдж рд╕реБрд░реВ рдХрд░рдгреНрдпрд╛рд╕ рдЖрдгрд┐ рдХрдореА рдореЗрдорд░реА рдЬрд╛рдЧрд╛ рдШреЗрдгреНрдпрд╛рд╕ рдЕрдиреБрдорддреА рджреЗрддреЗ. рдЖрдгрд┐ рдорд╛рдпрдХреНрд░реЛрд╕рд░реНрд╡реНрд╣рд┐рд╕реЗрд╕ рдЖрдгрд┐ рд╕рд░реНрд╡реНрд╣рд░рд▓реЗрд╕ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░рд╕рд╛рдареА рдЖрдордЪреНрдпрд╛ рдореЛрдареНрдпрд╛ рдЙрддреНрдХрдЯрддреЗрдЪреНрдпрд╛ рдХрд╛рд│рд╛рдд рд╣реЗ рдЦреВрдк рдорд╣рддреНрд╡рд╛рдЪреЗ рдЖрд╣реЗ.

рдЕрдзрд┐рдХреГрдд рд╕рд╛рдЗрдЯ - quarkus.io. рдЬрд▓рдж рд╕реБрд░реБрд╡рд╛рдд рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдкреНрд░рдХрд▓реНрдкрд╛рдВрдЪреА рдЙрджрд╛рд╣рд░рдгреЗ рдЖрдзреАрдЪ рдЙрдкрд▓рдмреНрдз рдЖрд╣реЗрдд GitHub.

рд╕реНрддреНрд░реЛрдд: www.habr.com

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╛