{"id":352573,"date":"2024-05-20T22:11:18","date_gmt":"2024-05-20T22:11:18","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=352573"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=352573","title":{"rendered":"<span>\u041a\u0430\u043a \u0441\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c Spring Boot \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0432 native image \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e GraalVm \u0438 \u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0435\u0433\u043e \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Docker<\/span>"},"content":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<h3>\u041f\u0440\u0435\u0434\u044b\u0441\u0442\u043e\u0440\u0438\u044f<\/h3>\n<p>\u0414\u043e \u043d\u0435\u0434\u0430\u0432\u043d\u0435\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043c\u043e\u0439 \u043e\u043f\u044b\u0442 \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0431\u0435\u043a\u0435\u043d\u0434-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f\u043c\u0438 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0432\u0430\u043b\u0441\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043d\u0430 \u0431\u0430\u0437\u0435 Spring Boot \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u0432\u0435\u0440\u0441\u0438\u0439 \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0440\u0435\u043b\u044f\u0446\u0438\u043e\u043d\u043d\u044b\u0445 \u0431\u0430\u0437 \u0434\u0430\u043d\u043d\u044b\u0445, \u043b\u0438\u043a\u0432\u0438\u0431\u0435\u0439\u0437\u0430, \u0431\u0440\u043e\u043a\u0435\u0440\u043e\u0432 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u0438 \u0442.\u0434. \u041f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0432 \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0435 \u0441\u0432\u043e\u0435\u043c \u0431\u044b\u043b\u0438 \u043b\u0435\u0433\u043a\u043e\u0432\u0435\u0441\u043d\u044b\u043c\u0438, \u0431\u044b\u0441\u0442\u0440\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u043b\u0438\u0441\u044c \u0438 \u043d\u0435 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043b\u0438 \u0431\u043e\u043b\u044c\u0448\u043e\u0433\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432. \u041f\u043e\u043a\u0430 \u043d\u0430 \u0440\u0430\u0431\u043e\u0442\u0435 \u043c\u044b \u0441 \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439 \u043d\u0435 \u0441\u0442\u043e\u043b\u043a\u043d\u0443\u043b\u0438\u0441\u044c \u0441 \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u0430\u043b\u043e \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u043b\u0441\u044f \u043c\u0443\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0434\u043e\u043b\u0433\u043e, \u0442\u0430\u043a \u0435\u0449\u0451 \u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u043b \u0441 \u0431\u043e\u043b\u044c\u0448\u0438\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e\u043c \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432, \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e \u0442\u043e \u043e\u0442\u0434\u0430\u0432\u0430\u044f, \u0442\u043e \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u044f \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435. \u0412\u0441\u0451 \u044d\u0442\u043e, \u043a\u043e\u043d\u0435\u0447\u043d\u043e \u0436\u0435, \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u043b\u043e \u043a \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u0435 \u0432 \u043f\u0440\u043e\u0434\u0430\u043a\u0448\u0435\u043d\u0435, \u0447\u0430\u0441\u0442\u044b\u043c \u0437\u0430\u0432\u0438\u0441\u0430\u043d\u0438\u0435\u043c \u0438\u043b\u0438 \u0432\u043e\u043e\u0431\u0449\u0435 \u043f\u043e\u043b\u043e\u043c\u043a\u043e\u0439 \u0441\u0435\u0440\u0432\u0438\u0441\u0430.<\/p>\n<p>\u042d\u0442\u043e \u0441\u0442\u0430\u043b\u043e \u043e\u0434\u043d\u043e\u0439 \u0438\u0437 \u043f\u0440\u0438\u0447\u0438\u043d \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0430 \u043a <a href=\"https:\/\/www.graalvm.org\/\" rel=\"noopener noreferrer nofollow\">GraalVm <\/a>&#8212; \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u0435, \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u043e\u0439 \u043d\u0430 Java, \u043f\u043e\u043c\u043e\u0433\u0430\u044e\u0449\u0435\u0439 \u0434\u0435\u043b\u0430\u0442\u044c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u0431\u044b\u0441\u0442\u0440\u0435\u0435 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e JIT \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0430. \u041e\u043d \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u044f\u0437\u044b\u043a\u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438 \u0440\u0435\u0436\u0438\u043c\u044b \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f, \u0442\u0430\u043a\u0438\u0435 \u043a\u0430\u043a AOT-\u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u044f \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 Java \u0434\u043b\u044f \u0431\u044b\u0441\u0442\u0440\u043e\u0433\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0438 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u0430\u043c\u044f\u0442\u0438. GraalVm \u043f\u043e\u043c\u043e\u0433\u0430\u0435\u0442 \u0441\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c java \u043a\u043e\u0434 \u0432 \u0442\u0430\u043a \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u043c\u044b\u0439 native image. \u042d\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u043d\u044f\u0435\u043c\u044b\u0439 \u0444\u0430\u0439\u043b \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u0433\u043d\u043e\u0432\u0435\u043d\u043d\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f \u0431\u0435\u0437 \u0441\u0442\u0430\u0440\u0442\u0430 JVM.<\/p>\n<p>\u042d\u0442\u0430 \u0441\u0442\u0430\u0442\u044c\u044f &#8212; \u0442\u0443\u0442\u043e\u0440\u0438\u0430\u043b, \u043a\u0430\u043a \u043f\u043e\u0434\u0440\u0443\u0436\u0438\u0442\u044c \u043c\u0435\u0436\u0434\u0443 \u0441\u043e\u0431\u043e\u0439 Spring Boot, GraalVm, Liquibase \u0438 Docker, \u043a\u0430\u043a\u0438\u0435 \u043c\u043e\u0433\u0443\u0442 \u0432\u043e\u0437\u043d\u0438\u043a\u043d\u0443\u0442\u044c \u043f\u043e\u0434\u0432\u043e\u0434\u043d\u044b\u0435 \u043a\u0430\u043c\u043d\u0438 \u0438 \u043a\u0430\u043a \u0438\u0445 \u043c\u043e\u0436\u043d\u043e \u043e\u0431\u043e\u0439\u0442\u0438. \u041d\u0430\u0447\u043d\u0435\u043c!<\/p>\n<h3>\u041a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f<\/h3>\n<p>\u0421 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f Spring Boot \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u043a\u043e\u043d\u0435\u0447\u043d\u043e. \u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0441\u0431\u043e\u0440\u0449\u0438\u043a\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f Maven. \u0414\u043b\u044f \u0431\u044b\u0441\u0442\u0440\u043e\u0433\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043c\u043e\u0436\u043d\u043e \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f <a href=\"https:\/\/start.spring.io\/\" rel=\"noopener noreferrer nofollow\">https:\/\/start.spring.io\/<\/a>. \u0414\u043b\u044f \u0441\u0432\u043e\u0435\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0432\u0435\u0440\u0441\u0438\u0438: Spring Boot \u0432\u0435\u0440\u0441\u0438\u0438 3.0.8, GraalVm \u0432\u0435\u0440\u0441\u0438\u0438 23.0 \u0438 Java 17. \u0415\u0441\u043b\u0438 \u0432\u044b \u043d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u043b\u0438 \u0441 \u0433\u0440\u0430\u0430\u043b\u0435\u043c (\u043a\u0430\u043a \u0438 \u044f, \u0434\u043e \u043d\u0435\u0434\u0430\u0432\u043d\u0435\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438) \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u044e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0442\u0435 \u0436\u0435 \u0432\u0435\u0440\u0441\u0438\u0438, \u0447\u0442\u043e \u0438 \u044f, \u0438 \u043f\u043e\u0441\u043b\u0435 \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u0443 \u0432\u0430\u0441 \u0432\u0441\u0451 \u0437\u0430\u0432\u0435\u0434\u0435\u0442\u0441\u044f, \u044d\u043a\u0441\u043f\u0435\u0440\u0435\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441 \u0432\u0435\u0440\u0441\u0438\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u043c, \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u044f, \u0441\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043b\u0438 \u044d\u0442\u043e \u043d\u0430 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435. <\/p>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u043c\u044b \u0441\u043a\u0430\u0447\u0430\u043b\u0438 \u0430\u0440\u0445\u0438\u0432 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u0441\u0430\u043c\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u0440\u0430\u0441\u043f\u0430\u043a\u043e\u0432\u0430\u0442\u044c \u0435\u0433\u043e \u0438 \u043e\u0442\u043a\u0440\u044b\u0442\u044c. <\/p>\n<p>\u0427\u0442\u043e\u0431\u044b \u0441\u043e\u0431\u0440\u0430\u0442\u044c native image, \u0443\u0431\u0435\u0434\u0438\u0442\u0435\u0441\u044c, \u0447\u0442\u043e \u0432 \u0432\u0430\u0448\u0435\u043c pom.xml \u0444\u0430\u0439\u043b\u0435 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d spring-boot-starter-parent. \u0421\u0435\u043a\u0446\u0438\u044f parent \u0434\u043e\u043b\u0436\u043d\u0430 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:<\/p>\n<pre><code class=\"xml\">    &lt;parent> &lt;groupId>org.springframework.boot&lt;\/groupId> &lt;artifactId>spring-boot-starter-parent&lt;\/artifactId> &lt;version>3.0.8&lt;\/version> &lt;\/parent><\/code><\/pre>\n<p>\u0422\u0430\u043a \u0436\u0435 \u043d\u0430\u043c \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u044f\u0442\u0441\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438:<\/p>\n<pre><code class=\"xml\">    &lt;dependencies> &lt;dependency> &lt;groupId>org.springframework.boot&lt;\/groupId> &lt;artifactId>spring-boot-starter-web&lt;\/artifactId> &lt;\/dependency>  &lt;dependency> &lt;groupId>org.projectlombok&lt;\/groupId> &lt;artifactId>lombok&lt;\/artifactId> &lt;optional>true&lt;\/optional> &lt;\/dependency> &lt;dependency> &lt;groupId>org.springframework.boot&lt;\/groupId> &lt;artifactId>spring-boot-starter-test&lt;\/artifactId> &lt;scope>test&lt;\/scope> &lt;\/dependency>  &lt;dependency> &lt;groupId>org.springframework.boot&lt;\/groupId> &lt;artifactId>spring-boot-starter-data-jpa&lt;\/artifactId> &lt;\/dependency> &lt;dependency> &lt;groupId>org.postgresql&lt;\/groupId> &lt;artifactId>postgresql&lt;\/artifactId> &lt;\/dependency> &lt;dependency> &lt;groupId>org.liquibase&lt;\/groupId> &lt;artifactId>liquibase-core&lt;\/artifactId> &lt;\/dependency> &lt;\/dependencies><\/code><\/pre>\n<p>\u0415\u0441\u043b\u0438 \u0432\u044b \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442\u0435 \u043f\u0440\u043e\u0435\u043a\u0442 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e spring starter, \u0432\u0441\u0451 \u044d\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u0442\u0430\u043c \u043d\u0430 \u044d\u0442\u0430\u043f\u0435 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0434\u043e\u043f.\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439, \u0438 \u043e\u043d\u0438 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0441\u0433\u0435\u043d\u0435\u0440\u044f\u0442\u0441\u044f \u0443 \u0432\u0430\u0441 \u0432 pom.xml<\/p>\n<p>\u0414\u043b\u044f \u0443\u0434\u043e\u0431\u043d\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0431\u0430\u0437\u043e\u0439 \u0434\u0430\u043d\u043d\u044b\u0445 \u043d\u0430 \u0441\u0432\u043e\u0438\u0445 \u0440\u0430\u0431\u043e\u0447\u0438\u0445 \u043f\u0440\u043e\u0435\u043a\u0442\u0430\u0445 \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c liquibase, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0434\u043b\u044f \u0447\u0438\u0441\u0442\u043e\u0442\u044b \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0430 \u0440\u0435\u0448\u0435\u043d\u043e \u0431\u044b\u043b\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0435\u0433\u043e \u043a\u0430\u043a \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044c \u0432 \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0439 \u043f\u0440\u043e\u0435\u043a\u0442, \u0430 \u0442\u0430\u043a \u0436\u0435 \u0432\u0437\u044f\u0442\u044c \u0442\u0443 \u0436\u0435 \u0431\u0430\u0437\u0443, \u0447\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0438 \u0432 \u0440\u0430\u0431\u043e\u0447\u0435\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0435, \u0430 \u0438\u043c\u0435\u043d\u043d\u043e PostgreSql. \u041a\u0430\u043a\u0438\u0435 \u043d\u044e\u0430\u043d\u0441\u044b \u0437\u0434\u0435\u0441\u044c \u0441\u0442\u043e\u0438\u0442 \u0443\u0447\u0435\u0441\u0442\u044c, \u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u043d\u0438\u0436\u0435.<\/p>\n<p>\u0414\u0430\u043b\u0435\u0435 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u043f\u043b\u0430\u0433\u0438\u043d\u044b. \u0421\u043f\u0443\u0441\u0442\u044f \u043c\u043d\u043e\u0433\u043e \u0447\u0430\u0441\u043e\u0432, \u043f\u0440\u043e\u0432\u0435\u0434\u0435\u043d\u043d\u044b\u0445 \u0432 \u0438\u0437\u0443\u0447\u0435\u043d\u0438\u0438 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u0433\u0430\u0439\u0434\u043e\u0432 \u043f\u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0434\u043b\u044f native image, \u044f \u043f\u0440\u0438\u0448\u043b\u0430 \u043a \u0432\u044b\u0432\u043e\u0434\u0443, \u0447\u0442\u043e \u0432 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0445 \u043f\u0440\u043e\u0435\u043a\u0442\u0430\u0445 \u0434\u043b\u044f \u043f\u043b\u0430\u0433\u0438\u043d\u043e\u0432 \u043a\u0430\u043a\u0438\u0445-\u0442\u043e \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u0447\u043d\u044b\u0445 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a \u043d\u0435 \u043d\u0443\u0436\u043d\u043e. \u0413\u043b\u0430\u0432\u043d\u043e\u0435 \u043d\u0435 \u0437\u0430\u0431\u044b\u0442\u044c \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u0434\u043b\u044f Liquibase \u043f\u0443\u0442\u0438 \u043a \u043f\u0440\u043e\u043f\u0435\u0440\u0442\u0438-\u0444\u0430\u0439\u043b\u0443 \u0438 \u0433\u043b\u0430\u0432\u043d\u043e\u043c\u0443 changelog \u0444\u0430\u0439\u043b\u0443.<\/p>\n<p>\u0421\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e, \u0441\u0435\u043a\u0446\u0438\u044f \u0431\u0438\u043b\u0434 \u0432 \u0438\u0442\u043e\u0433\u0435 \u0443 \u043c\u0435\u043d\u044f \u0441\u0442\u0430\u043b\u0430\u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u0432\u043e\u0442 \u0442\u0430\u043a:<\/p>\n<pre><code class=\"xml\">&lt;build> &lt;plugins> &lt;plugin> &lt;groupId>org.graalvm.buildtools&lt;\/groupId> &lt;artifactId>native-maven-plugin&lt;\/artifactId> &lt;\/plugin> &lt;plugin> &lt;groupId>org.springframework.boot&lt;\/groupId> &lt;artifactId>spring-boot-maven-plugin&lt;\/artifactId> &lt;executions> &lt;execution> &lt;id>process-aot&lt;\/id> &lt;goals> &lt;goal>process-aot&lt;\/goal> &lt;\/goals> &lt;\/execution> &lt;\/executions> &lt;configuration> &lt;excludes> &lt;exclude> &lt;groupId>org.projectlombok&lt;\/groupId> &lt;artifactId>lombok&lt;\/artifactId> &lt;\/exclude> &lt;\/excludes> &lt;\/configuration> &lt;\/plugin> &lt;plugin> &lt;groupId>org.liquibase&lt;\/groupId> &lt;artifactId>liquibase-maven-plugin&lt;\/artifactId> &lt;configuration> &lt;changeLogFile>src\/main\/resources\/db\/master-changelog.xml&lt;\/changeLogFile> &lt;propertyFile>src\/main\/resources\/liquibase.properties&lt;\/propertyFile> &lt;\/configuration> &lt;\/plugin> &lt;\/plugins> &lt;\/build><\/code><\/pre>\n<p>\u0411\u043e\u043b\u044c\u0448\u0435 \u043f\u0440\u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0443 <code>native-maven-plugin<\/code> \u0438 <code>spring-boot-maven-plugin<\/code> \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c <a href=\"https:\/\/graalvm.github.io\/native-build-tools\/latest\/maven-plugin.html\" rel=\"noopener noreferrer nofollow\">\u0437\u0434\u0435\u0441\u044c <\/a>\u0438 <a href=\"https:\/\/docs.spring.io\/spring-boot\/docs\/current\/maven-plugin\/reference\/htmlsingle\/#aot\" rel=\"noopener noreferrer nofollow\">\u0437\u0434\u0435\u0441\u044c <\/a>\u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e.<\/p>\n<p>\u041f\u043e\u043b\u043d\u044b\u0439 pom.xml \u0444\u0430\u0439\u043b:<\/p>\n<details class=\"spoiler\">\n<summary>pom.xml<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"xml\">&lt;?xml version=\"1.0\" encoding=\"UTF-8\"?> &lt;project xmlns=\"http:\/\/maven.apache.org\/POM\/4.0.0\" xmlns:xsi=\"http:\/\/www.w3.org\/2001\/XMLSchema-instance\" xsi:schemaLocation=\"http:\/\/maven.apache.org\/POM\/4.0.0 https:\/\/maven.apache.org\/xsd\/maven-4.0.0.xsd\"> &lt;modelVersion>4.0.0&lt;\/modelVersion> &lt;parent> &lt;groupId>org.springframework.boot&lt;\/groupId> &lt;artifactId>spring-boot-starter-parent&lt;\/artifactId> &lt;version>3.0.8&lt;\/version> &lt;relativePath\/> &lt;!-- lookup parent from repository --> &lt;\/parent> &lt;groupId>com.test&lt;\/groupId> &lt;artifactId>graalvm-project&lt;\/artifactId> &lt;version>0.0.1-SNAPSHOT&lt;\/version> &lt;name>graalvm-project&lt;\/name> &lt;description>Test project for testing GraalVm&lt;\/description> &lt;properties> &lt;java.version>17&lt;\/java.version> &lt;\/properties> &lt;dependencies> &lt;dependency> &lt;groupId>org.springframework.boot&lt;\/groupId> &lt;artifactId>spring-boot-starter-web&lt;\/artifactId> &lt;\/dependency>  &lt;dependency> &lt;groupId>org.projectlombok&lt;\/groupId> &lt;artifactId>lombok&lt;\/artifactId> &lt;optional>true&lt;\/optional> &lt;\/dependency> &lt;dependency> &lt;groupId>org.springframework.boot&lt;\/groupId> &lt;artifactId>spring-boot-starter-test&lt;\/artifactId> &lt;scope>test&lt;\/scope> &lt;\/dependency>  &lt;dependency> &lt;groupId>org.springframework.boot&lt;\/groupId> &lt;artifactId>spring-boot-starter-data-jpa&lt;\/artifactId> &lt;\/dependency> &lt;dependency> &lt;groupId>org.postgresql&lt;\/groupId> &lt;artifactId>postgresql&lt;\/artifactId> &lt;\/dependency> &lt;dependency> &lt;groupId>org.liquibase&lt;\/groupId> &lt;artifactId>liquibase-core&lt;\/artifactId> &lt;\/dependency> &lt;\/dependencies>  &lt;build> &lt;plugins> &lt;plugin> &lt;groupId>org.graalvm.buildtools&lt;\/groupId> &lt;artifactId>native-maven-plugin&lt;\/artifactId> &lt;\/plugin> &lt;plugin> &lt;groupId>org.springframework.boot&lt;\/groupId> &lt;artifactId>spring-boot-maven-plugin&lt;\/artifactId> &lt;executions> &lt;execution> &lt;id>process-aot&lt;\/id> &lt;goals> &lt;goal>process-aot&lt;\/goal> &lt;\/goals> &lt;\/execution> &lt;\/executions> &lt;configuration> &lt;excludes> &lt;exclude> &lt;groupId>org.projectlombok&lt;\/groupId> &lt;artifactId>lombok&lt;\/artifactId> &lt;\/exclude> &lt;\/excludes> &lt;\/configuration> &lt;\/plugin> &lt;plugin> &lt;groupId>org.liquibase&lt;\/groupId> &lt;artifactId>liquibase-maven-plugin&lt;\/artifactId> &lt;configuration> &lt;changeLogFile>src\/main\/resources\/db\/master-changelog.xml&lt;\/changeLogFile> &lt;propertyFile>src\/main\/resources\/liquibase.properties&lt;\/propertyFile> &lt;\/configuration> &lt;\/plugin> &lt;\/plugins> &lt;\/build>  &lt;\/project> <\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<h3>\u041f\u0438\u0448\u0435\u043c \u043a\u043e\u0434<\/h3>\n<p>\u0417\u0434\u0435\u0441\u044c \u044f \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u043e\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u043d\u0435 \u0431\u0443\u0434\u0443, \u0442\u0430\u043a \u043a\u0430\u043a \u044d\u0442\u043e \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0438 \u0432\u0441\u0435 \u043d\u0438\u0436\u0435 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u043d\u044b\u0435 \u043a\u043b\u0430\u0441\u0441\u044b \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0442\u0440\u0438\u0432\u0438\u0430\u043b\u044c\u043d\u044b.<\/p>\n<p>\u041a\u043e\u0434 main \u043a\u043b\u0430\u0441\u0441\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f:<\/p>\n<pre><code class=\"java\">@SpringBootApplication public class GraalvmProjectApplication {  public static void main(String[] args) { SpringApplication.run(GraalvmProjectApplication.class, args); }  }<\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0439 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440, entity \u043a\u043b\u0430\u0441\u0441 \u0438 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439.<\/p>\n<details class=\"spoiler\">\n<summary>TestEntity.java<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"java\">@AllArgsConstructor @Entity @Table(name = \"test_table\") public class TestEntity {    @Id   @Column(name = \"test_id\")   private Long id;   @Column(name = \"test_column\")   private String testColumn;  }<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<details class=\"spoiler\">\n<summary>TestRepository.java<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"java\">public interface TestRepository extends JpaRepository&lt;TestEntity, Long> {  }<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<details class=\"spoiler\">\n<summary>TestController.java<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"java\">@RestController @RequestMapping(\"\/api\/tests\") @RequiredArgsConstructor public class TestController {    private final TestRepository testRepository;    @GetMapping   public List&lt;TestEntity> getAllTests(){     return testRepository.findAll();   } }<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<h3>Liquibase \u0438 reflection<\/h3>\n<p>\u0414\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0440\u0443\u043a\u0430\u043c\u0438, \u0440\u0430\u0437 \u0443\u0436 \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c Liquibase, \u0441\u043e\u0437\u0434\u0430\u0435\u043c changeset \u0441 \u043d\u0430\u0448\u0435\u0439 \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0439 \u0442\u0430\u0431\u043b\u0438\u0446\u0435\u0439, \u0430 \u0442\u0430\u043a \u0436\u0435 main changelog \u0444\u0430\u0439\u043b.<\/p>\n<pre><code class=\"xml\">&lt;?xml version=\"1.0\" encoding=\"UTF-8\"?> &lt;databaseChangeLog   xmlns=\"http:\/\/www.liquibase.org\/xml\/ns\/dbchangelog\"   xmlns:xsi=\"http:\/\/www.w3.org\/2001\/XMLSchema-instance\"   xsi:schemaLocation=\"http:\/\/www.liquibase.org\/xml\/ns\/dbchangelog         http:\/\/www.liquibase.org\/xml\/ns\/dbchangelog\/dbchangelog-latest.xsd\">    &lt;changeSet logicalFilePath=\"\/changelog\/2023-07-25--01-test-table-changeset.xml\"     id=\"1\" author=\"Liquibase\">     &lt;createTable tableName=\"test_table\">       &lt;column name=\"test_id\" type=\"int\">         &lt;constraints primaryKey=\"true\"\/>       &lt;\/column>       &lt;column name=\"test_column\" type=\"varchar\"\/>     &lt;\/createTable>   &lt;\/changeSet>  &lt;\/databaseChangeLog><\/code><\/pre>\n<p>\u041d\u043e\u0432\u044b\u0439 changeset \u043c\u044b \u043f\u043e\u043b\u043e\u0436\u0438\u043b\u0438 \u0432 \u043f\u0430\u043f\u043a\u0443 resources \u043f\u043e \u043f\u0443\u0442\u0438 \/db\/changelog, \u0438 \u0447\u0442\u043e\u0431\u044b Liquibase \u0443\u0432\u0438\u0434\u0435\u043b \u0435\u0433\u043e, \u043d\u0430\u0448 \u0433\u043b\u0430\u0432\u043d\u044b\u0439 \u0444\u0430\u0439\u043b \u0434\u043e\u043b\u0436\u0435\u043d \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u0442\u0430\u043a:<\/p>\n<pre><code class=\"xml\">&lt;?xml version=\"1.0\" encoding=\"UTF-8\"?> &lt;databaseChangeLog   xmlns=\"http:\/\/www.liquibase.org\/xml\/ns\/dbchangelog\"   xmlns:xsi=\"http:\/\/www.w3.org\/2001\/XMLSchema-instance\"   xsi:schemaLocation=\"http:\/\/www.liquibase.org\/xml\/ns\/dbchangelog         http:\/\/www.liquibase.org\/xml\/ns\/dbchangelog\/dbchangelog-latest.xsd\">    &lt;include file=\"db\/changelog\/2023-07-25--01-test-table-changeset.xml\"\/> &lt;\/databaseChangeLog><\/code><\/pre>\n<p>\u041d\u043e, \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u043f\u0440\u043e\u0441\u0442\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u0432\u0441\u0435 \u043f\u0443\u0442\u0438 \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e. <\/p>\n<p>\u041a\u0430\u043a <a href=\"https:\/\/docs.spring.io\/spring-native\/docs\/0.12.x\/reference\/htmlsingle\/#native-hints\" rel=\"noopener noreferrer nofollow\">\u043f\u0438\u0448\u0443\u0442<\/a> \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 Spring Boot, GraalVm native image \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0443 \u0447\u0435\u0440\u0435\u0437 \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0444\u0430\u0439\u043b\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u043f\u0440\u0438 \u043d\u0430\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u0438 \u0432 META-INF\/native-image. \u042d\u0442\u043e \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0444\u0430\u0439\u043b\u044b native-image.properties, Reflect-config.json, proxy-config.json \u0438\u043b\u0438 resource-config.json. Spring Native \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u0442\u0430\u043a\u0438\u0435 \u0444\u0430\u0439\u043b\u044b \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 (\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u0443\u0434\u0443\u0442 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u044c\u0441\u044f \u0440\u044f\u0434\u043e\u043c \u0441 \u043b\u044e\u0431\u044b\u043c\u0438 \u0444\u0430\u0439\u043b\u0430\u043c\u0438, \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u043c\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u043c) \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043f\u043b\u0430\u0433\u0438\u043d\u0430 \u0441\u0431\u043e\u0440\u043a\u0438 Spring AOT. \u041e\u0434\u043d\u0430\u043a\u043e \u0431\u044b\u0432\u0430\u044e\u0442 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u0438, \u043a\u043e\u0433\u0434\u0430 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u0443\u044e \u043d\u0430\u0442\u0438\u0432\u043d\u0443\u044e \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e. <\/p>\n<p>\u0422\u043e \u0435\u0441\u0442\u044c, \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u043d\u0430\u0448\u0438 \u0444\u0430\u0439\u043b\u044b \u0447\u0435\u043d\u0434\u0436\u0441\u0435\u0442\u043e\u0432 Liquibase \u0431\u044b\u043b\u0438 \u0432 \u0438\u0442\u043e\u0433\u043e\u0432\u043e\u043c executable \u0444\u0430\u0439\u043b\u0435, \u043d\u0430\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439 \u043a\u043b\u0430\u0441\u0441, HintsRegistrar, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u0438\u043c\u043f\u043b\u0435\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c RuntimeHintsRegistrar:<\/p>\n<pre><code class=\"java\">public class HintsRegistrar implements RuntimeHintsRegistrar {    @Override   public void registerHints(RuntimeHints hints, ClassLoader classLoader) {     hints.resources().registerPattern(\"db\/master-changelog.xml\");     hints.resources().registerPattern(\"db\/changelog\/*.xml\");   } }<\/code><\/pre>\n<p>\u0427\u0442\u043e\u0431\u044b \u043d\u0430\u0448\u0430 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f \u0440\u0430\u0431\u043e\u0442\u0430\u043b\u0430, \u0435\u0451 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0438 <code>@ImportRuntimeHints(HintsRegistrar.class)<\/code> .<\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0430\u0448 main \u043a\u043b\u0430\u0441\u0441 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a:<\/p>\n<pre><code class=\"java\">@SpringBootApplication @ImportRuntimeHints(HintsRegistrar.class) public class GraalvmProjectApplication {  public static void main(String[] args) { SpringApplication.run(GraalvmProjectApplication.class, args); }  }<\/code><\/pre>\n<p>\u041f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u043f\u0440\u043e \u044d\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c <a href=\"https:\/\/docs.spring.io\/spring-boot\/docs\/3.0.0\/reference\/htmlsingle\/#native-image.advanced.custom-hints\" rel=\"noopener noreferrer nofollow\">\u0437\u0434\u0435\u0441\u044c<\/a>. <\/p>\n<h3>\u0411\u0430\u0437\u0430 \u0434\u0430\u043d\u043d\u044b\u0445, Docker \u0438 docker-compose<\/h3>\n<p>\u041d\u0430\u0447\u043d\u0435\u043c \u0441 \u0441\u0435\u0440\u0432\u0438\u0441\u0430 \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445. \u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043a\u043e\u043c\u043f\u043e\u0443\u0437 \u0444\u0430\u0439\u043b \u0438 \u043f\u043e\u043b\u043e\u0436\u0438\u043c \u0435\u0433\u043e \u0432 \u043f\u0430\u043f\u043a\u0443 environments. \u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u043d\u0430\u0448\u0435\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0442\u0435\u043f\u0435\u0440\u044c \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a:<\/p>\n<pre><code>graalvm-project  |  +-environments  |  +-docker-compose.yml  +-src  |  +-main  |     +-java  |        +-com.test.graalvmproject  |           +-&lt;application classes>  |     +-resources  |        +-db  |           +-master-changelog.xml  |        +-application.yml  |        +-liquibase.properties  +-pom.xml <\/code><\/pre>\n<p>\u041f\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043c \u043d\u0430\u043f\u043e\u043b\u043d\u044f\u0442\u044c docker-compose \u0444\u0430\u0439\u043b, \u044f \u0441\u043e\u0437\u0434\u0430\u044e \u0444\u0430\u0439\u043b \u0441 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435\u043c .sql, \u0433\u0434\u0435 \u0434\u0435\u043b\u0430\u044e \u0431\u0430\u0437\u043e\u0432\u0443\u044e \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0443 \u043c\u043e\u0435\u0439 \u0431\u0443\u0434\u0443\u0449\u0435\u0439 \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445:<\/p>\n<pre><code class=\"sql\">CREATE DATABASE testdb ENCODING 'UTF8'; CREATE USER test_user WITH PASSWORD 'password'; GRANT ALL PRIVILEGES ON DATABASE testdb TO test_user;<\/code><\/pre>\n<p>\u0418 docker-compose:<\/p>\n<pre><code class=\"yaml\">version: '3'  services:   graalvm-project:     image: graalvm-project:latest     container_name: graalvm-project-container     build:       context: ..\/       dockerfile: .\/environments\/Dockerfile     ports:       - '8080:8080'     environment:       - SPRING_DATASOURCE_URL=jdbc:postgresql:\/\/db:5432\/testdb?useSSL=false       - SPRING_DATASOURCE_USERNAME=test_user       - SPRING_DATASOURCE_PASSWORD=password     depends_on:       db:         condition: service_healthy    db:     image: postgres:14.1-alpine     container_name: db     restart: on-failure     environment:       - POSTGRES_USER=test_user       - POSTGRES_PASSWORD=password     ports:       - '5432:5432'     volumes:       - db:\/var\/lib\/postgresql\/data       - .\/database.sql:\/docker-entrypoint-initdb.d\/database.sql     healthcheck:       test: pg_isready -Utest_user       interval: 1s       timeout: 1s       retries: 5  volumes:   db: { }<\/code><\/pre>\n<p>\u0414\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u043d\u0430\u0448\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0441\u043c\u043e\u0433\u043b\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c\u0441\u044f \u043a \u0431\u0430\u0437\u0435 \u0438\u0437 \u0434\u043e\u043a\u0435\u0440 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430, \u0432 SPRING_DATASOURCE_URL \u043c\u044b \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u0438\u043c\u044f \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0445\u043e\u0441\u0442\u0430. \u0418 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0432 \u0441\u0435\u0440\u0432\u0438\u0441\u0435 \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443 \u043d\u0430 \u0445\u0435\u043b\u0441\u0447\u0435\u043a &#8212; \u0447\u0442\u043e\u0431\u044b \u043d\u0430\u0448\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0434\u043e\u0436\u0438\u0434\u0430\u043b\u043e\u0441\u044c \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0441\u0430\u043c\u043e\u0439 \u0431\u0430\u0437\u044b, \u043f\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043c \u0441\u0442\u0430\u0440\u0442\u043e\u0432\u0430\u0442\u044c \u0438 \u0441\u0442\u0443\u0447\u0430\u0442\u044c\u0441\u044f \u0432 \u043d\u0435\u0451.<\/p>\n<p>\u0414\u043b\u044f \u0431\u0438\u043b\u0434\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 Dockerfile:<\/p>\n<pre><code class=\"powershell\">FROM vegardit\/graalvm-maven:latest-java17 as builder  WORKDIR \/app  COPY pom.xml \/app\/ COPY src \/app\/src\/  RUN mvn -Pnative native:compile  FROM mirekphd\/jenkins-jdk17-on-ubuntu2204:latest  COPY --from=builder \/app\/target\/graalvm-project \/app\/  CMD [\"\/app\/graalvm-project\"] <\/code><\/pre>\n<p>\u0414\u043b\u044f \u0432\u044b\u0437\u043e\u0432\u0430 \u043a\u043e\u043c\u0430\u043d\u0434\u044b <code>mvn -Pnative native:compile<\/code> \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0432 \u0441\u0435\u0431\u0435 \u0433\u0440\u0430\u0430\u043b\u044c \u0438 maven, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f <code>vegardit\/graalvm-maven:latest-java17<\/code> \u043e\u0431\u0440\u0430\u0437.<\/p>\n<p>\u041a\u043e\u043c\u0430\u043d\u0434\u0430 <code>mvn -Pnative native:compile<\/code> \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u044e native image, \u043f\u043e\u0441\u043b\u0435 \u0447\u0435\u0433\u043e native image executable \u0444\u0430\u0439\u043b \u043c\u043e\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u043d\u0430\u0439\u0442\u0438 \u0432 \u043f\u0430\u043f\u043a\u0435 target \u043d\u0430\u0448\u0435\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430. \u041a\u0430\u043a \u0432\u0438\u0434\u043d\u043e \u0438\u0437 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441\u0430 Dockerfile, \u043c\u044b \u043a\u043e\u043f\u0438\u0440\u0443\u0435\u043c executable \u0432 \u0440\u0430\u0431\u043e\u0447\u0443\u044e \u043f\u0430\u043f\u043a\u0443 \u0434\u043e\u043a\u0435\u0440\u0430 \u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u043d\u0430\u0448\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435.<\/p>\n<p>\u0422\u0430\u043a \u0436\u0435 \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f native image \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e maven \u043c\u043e\u0436\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0430\u044f \u043a\u043e\u043c\u0430\u043d\u0434\u0430: <\/p>\n<pre><code class=\"css\">mvn -Pnative spring-boot:build-image<\/code><\/pre>\n<p>\u041f\u0440\u0438 \u0442\u0430\u043a\u043e\u043c \u043f\u043e\u0434\u0445\u043e\u0434\u0435 \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u0430\u044f \u0432\u0435\u0440\u0441\u0438\u044f \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f. \u0417\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0435\u0451 \u043c\u043e\u0436\u043d\u043e, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:<\/p>\n<pre><code class=\"bash\">docker run --rm -p 8080:8080 graalvm-project:0.0.1-SNAPSHOT<\/code><\/pre>\n<h3>\u0410 \u0432\u044b\u0432\u043e\u0434\u044b?<\/h3>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0441\u0440\u0430\u0432\u043d\u0438\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0441\u00a0GraalVm \u0438 Jvm\u2011Hotspot \u0441\u00a0\u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f \u043f\u0430\u043c\u044f\u0442\u0438 \u0438 \u043f\u0440\u043e\u0438\u0437\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438. \u0414\u043b\u044f\u00a0\u044d\u0442\u043e\u0433\u043e \u0441\u0434\u0435\u043b\u0430\u0435\u043c \u0434\u043b\u044f\u00a0\u043e\u0434\u043d\u043e\u0433\u043e \u0438 \u0442\u043e\u0433\u043e\u00a0\u0436\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f native image \u0438 JAR \u0438 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0438: <\/p>\n<ol>\n<li>\n<p>\u041a\u043e\u043d\u0435\u0447\u043d\u043e, \u0432\u0440\u0435\u043c\u044f \u0441\u0431\u043e\u0440\u043a\u0438 native image \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u043d\u0430\u043c\u043d\u043e\u0433\u043e \u0431\u043e\u043b\u044c\u0448\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0438 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0445 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432. \u0423\u00a0\u043c\u0435\u043d\u044f \u0443\u0448\u043b\u043e \u043e\u043a\u043e\u043b\u043e 12\u00a0\u043c\u0438\u043d\u0443\u0442 \u043d\u0430\u00a0\u043f\u0440\u043e\u0441\u0442\u043e\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435. <\/p>\n<\/li>\n<\/ol>\n<ol start=\"2\">\n<li>\n<p>\u0412\u043e\u00a0\u0432\u0440\u0435\u043c\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0447\u0443\u0432\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u043b\u043e\u0441\u0441\u0430\u043b\u044c\u043d\u0443\u044e \u0440\u0430\u0437\u043d\u0438\u0446\u0443. <\/p>\n<p>\u041f\u0440\u0438\u00a0\u0437\u0430\u043f\u0443\u0441\u043a\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043e\u0431\u044b\u0447\u043d\u044b\u043c \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u043c \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0432\u043e\u0442 \u0442\u0430\u043a\u043e\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442:<\/p>\n<p><code>c.t.g.GraalvmProjectApplication: Started GraalvmProjectApplication in 3.508\u00a0seconds (process running for 3.874)<\/code><\/p>\n<p>\u0421 native image \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442:<\/p>\n<p><code>c.t.g.GraalvmProjectApplication: Started GraalvmProjectApplication in 0.788\u00a0seconds (process running for 0.793)<\/code><\/p>\n<p>\u041a\u043e\u043d\u0435\u0447\u043d\u043e, \u043d\u0430 \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0435 \u043e\u0441\u043e\u0431\u043e \u043d\u0435\u0442 \u0440\u0430\u0437\u043d\u0438\u0446\u044b, \u043c\u0435\u043d\u044c\u0448\u0435 \u0441\u0435\u043a\u0443\u043d\u0434\u044b \u0438\u043b\u0438 3 \u043f\u043e\u0434\u043d\u0438\u043c\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435. \u041d\u043e \u0435\u0441\u043b\u0438 \u043c\u044b \u0441\u0440\u0430\u0432\u043d\u0438\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043f\u043e\u0431\u043e\u043b\u044c\u0448\u0435, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043d\u0430\u0448\u0435 \u0440\u0430\u0431\u043e\u0447\u0435\u0435, \u0442\u0430\u043c \u0440\u0430\u0437\u043d\u0438\u0446\u0430 \u0443\u0436\u0435 \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u0438\u044f\u0442\u043d\u0430\u044f &#8212; 0.356 \u0441\u0435\u043a\u0443\u043d\u0434 native image \u043f\u0440\u043e\u0442\u0438\u0432 7.152 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 jar. \u0420\u0430\u0437\u043d\u0438\u0446\u0430 \u043f\u043e\u0447\u0442\u0438 \u0432 20\u00a0\u0440\u0430\u0437! \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043c\u0433\u043d\u043e\u0432\u0435\u043d\u043d\u044b\u0439 \u0437\u0430\u043f\u0443\u0441\u043a. <\/p>\n<\/li>\n<\/ol>\n<ol start=\"3\">\n<li>\n<p>\u0422\u0430\u043a \u043a\u0430\u043a\u00a0JAR \u0434\u043b\u044f\u00a0\u0441\u0432\u043e\u0435\u0433\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 JRE, \u0430\u00a0native image \u0443\u0436\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0432\u0441\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0435, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0441\u0440\u0430\u0432\u043d\u0438\u0442\u044c \u0440\u0430\u0437\u043c\u0435\u0440\u044b \u0444\u0430\u0439\u043b\u043e\u0432 \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0442\u0440\u0443\u0434\u043d\u043e. \u0415\u0441\u043b\u0438 \u043c\u044b \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 executable \u0444\u0430\u0439\u043b, \u043e\u043d \u0431\u0443\u0434\u0435\u0442 \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0431\u043e\u043b\u044c\u0448\u0435 jar \u0444\u0430\u0439\u043b\u0430. \u041f\u043e\u0447\u0435\u043c\u0443 \u0442\u0430\u043a? \u0420\u0430\u0437\u043d\u0438\u0446\u0430 \u0432 \u0440\u0430\u0437\u043c\u0435\u0440\u0435 \u0432\u044b\u0437\u0432\u0430\u043d\u0430 \u0442\u0435\u043c, \u0447\u0442\u043e native build \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0430\u0432\u0442\u043e\u043d\u043e\u043c\u043d\u044b\u043c \u0438\u0441\u043f\u043e\u043b\u043d\u044f\u0435\u043c\u044b\u043c \u0444\u0430\u0439\u043b\u043e\u043c. \u041e\u043d \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u043a\u0430\u043a\u0438\u0445-\u043b\u0438\u0431\u043e \u0434\u0440\u0443\u0433\u0438\u0445 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439, \u0442\u0430\u043a\u0438\u0445 \u043a\u0430\u043a JRE. \u042d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u043c\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0443\u043f\u0430\u043a\u043e\u0432\u0430\u0442\u044c \u0432\u0441\u0435, \u0447\u0442\u043e \u043d\u0430\u043c \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u044c\u0441\u044f \u043e\u0442 JRE, \u0432\u043d\u0443\u0442\u0440\u044c \u0431\u0438\u043d\u0430\u0440\u043d\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430. JAR \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c JRE, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043e\u043d \u043c\u043e\u0436\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434 \u043d\u0430\u0448\u0435\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f.<\/p>\n<\/li>\n<\/ol>\n<ol start=\"4\">\n<li>\n<p>\u0422\u0430\u043a\u00a0\u0436\u0435 \u0441\u00a0native image \u043f\u043e\u0442\u0440\u0435\u0431\u043b\u0435\u043d\u0438\u0435 RAM \u043c\u0435\u043d\u044c\u0448\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u043d\u0430 7%. <\/p>\n<\/li>\n<\/ol>\n<p>\u0422\u0430\u043a\u0436\u0435 \u0441\u0442\u043e\u0438\u0442 \u0432\u044b\u0434\u0435\u043b\u0438\u0442\u044c \u0435\u0449\u0435 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0440\u0430\u0437\u043b\u0438\u0447\u0438\u044f \u043c\u0435\u0436\u0434\u0443 GraalVm \u0438 Jvm\u2011Hotspot: <\/p>\n<ol>\n<li>\n<p>\u0412\u0430\u0436\u043d\u044b\u043c \u043c\u043e\u043c\u0435\u043d\u0442\u043e\u043c \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0442\u043e, \u0447\u0442\u043e\u00a0native image \u0438\u043c\u0435\u0435\u0442 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0435 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0435 \u0441\u00a0\u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u043e\u0439 \u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0440\u0435\u0444\u043b\u0435\u043a\u0441\u0438\u0438. \u041f\u0440\u0438\u0434\u0435\u0442\u0441\u044f \u043f\u043e\u0442\u0440\u0430\u0442\u0438\u0442\u044c \u0432\u0440\u0435\u043c\u044f, \u0447\u0442\u043e\u0431\u044b \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0442\u0430\u043a\u0438\u0435 \u0432\u0435\u0449\u0438, \u043a\u0430\u043a\u00a0\u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432 \u0438 \u0442\u0430\u043a \u0434\u0430\u043b\u0435\u0435, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e\u00a0\u043e\u043d\u0438 \u0442\u0440\u0435\u0431\u0443\u044e\u0442 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0439 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u0434\u043b\u044f\u00a0native image. <\/p>\n<\/li>\n<\/ol>\n<ol start=\"2\">\n<li>\n<p>\u041f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u043e\u043c GraalVM \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u044f\u0437\u044b\u043a\u043e\u0432 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u0438\u0441\u0430\u0442\u044c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u0434\u0430\u043d\u043d\u044b\u0445 \u043d\u0430\u00a0Python, \u0430\u00a0\u0431\u0438\u0437\u043d\u0435\u0441 \u043b\u043e\u0433\u0438\u043a\u0443 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043d\u0430\u00a0Java. <\/p>\n<\/li>\n<\/ol>\n<p>\u0418 \u0442\u0435\u043f\u0435\u0440\u044c \u043f\u0435\u0440\u0435\u0439\u0434\u0435\u043c \u043a\u00a0\u0441\u0430\u043c\u043e\u043c\u0443 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u043c\u0443, \u0433\u0434\u0435 \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c GraalVM. \u0421\u0440\u0430\u0432\u043d\u0438\u0432 Jvm\u2011Hotspot \u0438 GraalVM \u043c\u043e\u0436\u043d\u043e \u0441\u043a\u0430\u0437\u0430\u0442\u044c, \u0447\u0442\u043e\u00a0GraalVM \u043e\u0442\u043b\u0438\u0447\u043d\u043e \u043f\u043e\u0434\u043e\u0439\u0434\u0435\u0442 \u0434\u043b\u044f\u00a0\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0442\u0440\u0435\u0431\u0443\u044e\u0442\u00a0\u0431\u044b\u0441\u0442\u0440\u043e\u0433\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0438 \u0432\u00a0\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043d\u0435\u0442 \u0431\u043e\u043b\u044c\u0448\u043e\u0433\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u0441\u043b\u043e\u0436\u043d\u043e\u0439 \u0431\u0438\u0437\u043d\u0435\u0441 \u043b\u043e\u0433\u0438\u043a\u0438. <\/p>\n<p>\u0412\u00a0\u0446\u0435\u043b\u043e\u043c, \u043a\u0430\u043a\u00a0GraalVM, \u0442\u0430\u043a \u0438 JVM \u043e\u0431\u043b\u0430\u0434\u0430\u044e\u0442 \u0441\u0432\u043e\u0438\u043c\u0438 \u0441\u0438\u043b\u044c\u043d\u044b\u043c\u0438 \u0438 \u0441\u043b\u0430\u0431\u044b\u043c\u0438 \u0441\u0442\u043e\u0440\u043e\u043d\u0430\u043c\u0438, \u0438 \u0432\u044b\u0431\u043e\u0440 \u043c\u0435\u0436\u0434\u0443 \u043d\u0438\u043c\u0438 \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442\u00a0\u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0445 \u043f\u043e\u0442\u0440\u0435\u0431\u043d\u043e\u0441\u0442\u0435\u0439 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0438\u043b\u0438\u00a0\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f. <\/p>\n<p>\u0418\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434 \u0438\u0437\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u043e\u0433\u043e \u0432 \u0442\u0435\u043a\u0441\u0442\u0435 \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 <a href=\"https:\/\/github.com\/anastasiya-asenchik\/graalvm-project\" rel=\"noopener noreferrer nofollow\">\u0437\u0434\u0435\u0441\u044c<\/a>.<\/p>\n<\/p>\n<\/div>\n<\/div>\n<\/div>\n<p><!----><!----><\/div>\n<p><!----><!----><br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/755550\/\"> https:\/\/habr.com\/ru\/articles\/755550\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<h3>\u041f\u0440\u0435\u0434\u044b\u0441\u0442\u043e\u0440\u0438\u044f<\/h3>\n<p>\u0414\u043e \u043d\u0435\u0434\u0430\u0432\u043d\u0435\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043c\u043e\u0439 \u043e\u043f\u044b\u0442 \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0431\u0435\u043a\u0435\u043d\u0434-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f\u043c\u0438 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0432\u0430\u043b\u0441\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043d\u0430 \u0431\u0430\u0437\u0435 Spring Boot \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u0432\u0435\u0440\u0441\u0438\u0439 \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0440\u0435\u043b\u044f\u0446\u0438\u043e\u043d\u043d\u044b\u0445 \u0431\u0430\u0437 \u0434\u0430\u043d\u043d\u044b\u0445, \u043b\u0438\u043a\u0432\u0438\u0431\u0435\u0439\u0437\u0430, \u0431\u0440\u043e\u043a\u0435\u0440\u043e\u0432 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u0438 \u0442.\u0434. \u041f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0432 \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0435 \u0441\u0432\u043e\u0435\u043c \u0431\u044b\u043b\u0438 \u043b\u0435\u0433\u043a\u043e\u0432\u0435\u0441\u043d\u044b\u043c\u0438, \u0431\u044b\u0441\u0442\u0440\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u043b\u0438\u0441\u044c \u0438 \u043d\u0435 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043b\u0438 \u0431\u043e\u043b\u044c\u0448\u043e\u0433\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432. \u041f\u043e\u043a\u0430 \u043d\u0430 \u0440\u0430\u0431\u043e\u0442\u0435 \u043c\u044b \u0441 \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439 \u043d\u0435 \u0441\u0442\u043e\u043b\u043a\u043d\u0443\u043b\u0438\u0441\u044c \u0441 \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u0430\u043b\u043e \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u043b\u0441\u044f \u043c\u0443\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0434\u043e\u043b\u0433\u043e, \u0442\u0430\u043a \u0435\u0449\u0451 \u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u043b \u0441 \u0431\u043e\u043b\u044c\u0448\u0438\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e\u043c \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432, \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e \u0442\u043e \u043e\u0442\u0434\u0430\u0432\u0430\u044f, \u0442\u043e \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u044f \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435. \u0412\u0441\u0451 \u044d\u0442\u043e, \u043a\u043e\u043d\u0435\u0447\u043d\u043e \u0436\u0435, \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u043b\u043e \u043a \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u0435 \u0432 \u043f\u0440\u043e\u0434\u0430\u043a\u0448\u0435\u043d\u0435, \u0447\u0430\u0441\u0442\u044b\u043c \u0437\u0430\u0432\u0438\u0441\u0430\u043d\u0438\u0435\u043c \u0438\u043b\u0438 \u0432\u043e\u043e\u0431\u0449\u0435 \u043f\u043e\u043b\u043e\u043c\u043a\u043e\u0439 \u0441\u0435\u0440\u0432\u0438\u0441\u0430.<\/p>\n<p>\u042d\u0442\u043e \u0441\u0442\u0430\u043b\u043e \u043e\u0434\u043d\u043e\u0439 \u0438\u0437 \u043f\u0440\u0438\u0447\u0438\u043d \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0430 \u043a <a href=\"https:\/\/www.graalvm.org\/\" rel=\"noopener noreferrer nofollow\">GraalVm <\/a>&#8212; \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u0435, \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u043e\u0439 \u043d\u0430 Java, \u043f\u043e\u043c\u043e\u0433\u0430\u044e\u0449\u0435\u0439 \u0434\u0435\u043b\u0430\u0442\u044c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u0431\u044b\u0441\u0442\u0440\u0435\u0435 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e JIT \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0430. \u041e\u043d \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u044f\u0437\u044b\u043a\u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438 \u0440\u0435\u0436\u0438\u043c\u044b \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f, \u0442\u0430\u043a\u0438\u0435 \u043a\u0430\u043a AOT-\u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u044f \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 Java \u0434\u043b\u044f \u0431\u044b\u0441\u0442\u0440\u043e\u0433\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0438 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u0430\u043c\u044f\u0442\u0438. GraalVm \u043f\u043e\u043c\u043e\u0433\u0430\u0435\u0442 \u0441\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c java \u043a\u043e\u0434 \u0432 \u0442\u0430\u043a \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u043c\u044b\u0439 native image. \u042d\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u043d\u044f\u0435\u043c\u044b\u0439 \u0444\u0430\u0439\u043b \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u0433\u043d\u043e\u0432\u0435\u043d\u043d\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f \u0431\u0435\u0437 \u0441\u0442\u0430\u0440\u0442\u0430 JVM.<\/p>\n<p>\u042d\u0442\u0430 \u0441\u0442\u0430\u0442\u044c\u044f &#8212; \u0442\u0443\u0442\u043e\u0440\u0438\u0430\u043b, \u043a\u0430\u043a \u043f\u043e\u0434\u0440\u0443\u0436\u0438\u0442\u044c \u043c\u0435\u0436\u0434\u0443 \u0441\u043e\u0431\u043e\u0439 Spring Boot, GraalVm, Liquibase \u0438 Docker, \u043a\u0430\u043a\u0438\u0435 \u043c\u043e\u0433\u0443\u0442 \u0432\u043e\u0437\u043d\u0438\u043a\u043d\u0443\u0442\u044c \u043f\u043e\u0434\u0432\u043e\u0434\u043d\u044b\u0435 \u043a\u0430\u043c\u043d\u0438 \u0438 \u043a\u0430\u043a \u0438\u0445 \u043c\u043e\u0436\u043d\u043e \u043e\u0431\u043e\u0439\u0442\u0438. \u041d\u0430\u0447\u043d\u0435\u043c!<\/p>\n<h3>\u041a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f<\/h3>\n<p>\u0421 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f Spring Boot \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u043a\u043e\u043d\u0435\u0447\u043d\u043e. \u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0441\u0431\u043e\u0440\u0449\u0438\u043a\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f Maven. \u0414\u043b\u044f \u0431\u044b\u0441\u0442\u0440\u043e\u0433\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043c\u043e\u0436\u043d\u043e \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f <a href=\"https:\/\/start.spring.io\/\" rel=\"noopener noreferrer nofollow\">https:\/\/start.spring.io\/<\/a>. \u0414\u043b\u044f \u0441\u0432\u043e\u0435\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0432\u0435\u0440\u0441\u0438\u0438: Spring Boot \u0432\u0435\u0440\u0441\u0438\u0438 3.0.8, GraalVm \u0432\u0435\u0440\u0441\u0438\u0438 23.0 \u0438 Java 17. \u0415\u0441\u043b\u0438 \u0432\u044b \u043d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u043b\u0438 \u0441 \u0433\u0440\u0430\u0430\u043b\u0435\u043c (\u043a\u0430\u043a \u0438 \u044f, \u0434\u043e \u043d\u0435\u0434\u0430\u0432\u043d\u0435\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438) \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u044e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0442\u0435 \u0436\u0435 \u0432\u0435\u0440\u0441\u0438\u0438, \u0447\u0442\u043e \u0438 \u044f, \u0438 \u043f\u043e\u0441\u043b\u0435 \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u0443 \u0432\u0430\u0441 \u0432\u0441\u0451 \u0437\u0430\u0432\u0435\u0434\u0435\u0442\u0441\u044f, \u044d\u043a\u0441\u043f\u0435\u0440\u0435\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441 \u0432\u0435\u0440\u0441\u0438\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u043c, \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u044f, \u0441\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043b\u0438 \u044d\u0442\u043e \u043d\u0430 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435. <\/p>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u043c\u044b \u0441\u043a\u0430\u0447\u0430\u043b\u0438 \u0430\u0440\u0445\u0438\u0432 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u0441\u0430\u043c\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u0440\u0430\u0441\u043f\u0430\u043a\u043e\u0432\u0430\u0442\u044c \u0435\u0433\u043e \u0438 \u043e\u0442\u043a\u0440\u044b\u0442\u044c. <\/p>\n<p>\u0427\u0442\u043e\u0431\u044b \u0441\u043e\u0431\u0440\u0430\u0442\u044c native image, \u0443\u0431\u0435\u0434\u0438\u0442\u0435\u0441\u044c, \u0447\u0442\u043e \u0432 \u0432\u0430\u0448\u0435\u043c pom.xml \u0444\u0430\u0439\u043b\u0435 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d spring-boot-starter-parent. \u0421\u0435\u043a\u0446\u0438\u044f parent \u0434\u043e\u043b\u0436\u043d\u0430 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:<\/p>\n<pre><code class=\"xml\">    &lt;parent> &lt;groupId>org.springframework.boot&lt;\/groupId> &lt;artifactId>spring-boot-starter-parent&lt;\/artifactId> &lt;version>3.0.8&lt;\/version> &lt;\/parent><\/code><\/pre>\n<p>\u0422\u0430\u043a \u0436\u0435 \u043d\u0430\u043c \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u044f\u0442\u0441\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438:<\/p>\n<pre><code class=\"xml\">    &lt;dependencies> &lt;dependency> &lt;groupId>org.springframework.boot&lt;\/groupId> &lt;artifactId>spring-boot-starter-web&lt;\/artifactId> &lt;\/dependency>  &lt;dependency> &lt;groupId>org.projectlombok&lt;\/groupId> &lt;artifactId>lombok&lt;\/artifactId> &lt;optional>true&lt;\/optional> &lt;\/dependency> &lt;dependency> &lt;groupId>org.springframework.boot&lt;\/groupId> &lt;artifactId>spring-boot-starter-test&lt;\/artifactId> &lt;scope>test&lt;\/scope> &lt;\/dependency>  &lt;dependency> &lt;groupId>org.springframework.boot&lt;\/groupId> &lt;artifactId>spring-boot-starter-data-jpa&lt;\/artifactId> &lt;\/dependency> &lt;dependency> &lt;groupId>org.postgresql&lt;\/groupId> &lt;artifactId>postgresql&lt;\/artifactId> &lt;\/dependency> &lt;dependency> &lt;groupId>org.liquibase&lt;\/groupId> &lt;artifactId>liquibase-core&lt;\/artifactId> &lt;\/dependency> &lt;\/dependencies><\/code><\/pre>\n<p>\u0415\u0441\u043b\u0438 \u0432\u044b \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442\u0435 \u043f\u0440\u043e\u0435\u043a\u0442 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e spring starter, \u0432\u0441\u0451 \u044d\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u0442\u0430\u043c \u043d\u0430 \u044d\u0442\u0430\u043f\u0435 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0434\u043e\u043f.\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439, \u0438 \u043e\u043d\u0438 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0441\u0433\u0435\u043d\u0435\u0440\u044f\u0442\u0441\u044f \u0443 \u0432\u0430\u0441 \u0432 pom.xml<\/p>\n<p>\u0414\u043b\u044f \u0443\u0434\u043e\u0431\u043d\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0431\u0430\u0437\u043e\u0439 \u0434\u0430\u043d\u043d\u044b\u0445 \u043d\u0430 \u0441\u0432\u043e\u0438\u0445 \u0440\u0430\u0431\u043e\u0447\u0438\u0445 \u043f\u0440\u043e\u0435\u043a\u0442\u0430\u0445 \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c liquibase, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0434\u043b\u044f \u0447\u0438\u0441\u0442\u043e\u0442\u044b \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0430 \u0440\u0435\u0448\u0435\u043d\u043e \u0431\u044b\u043b\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0435\u0433\u043e \u043a\u0430\u043a \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044c \u0432 \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0439 \u043f\u0440\u043e\u0435\u043a\u0442, \u0430 \u0442\u0430\u043a \u0436\u0435 \u0432\u0437\u044f\u0442\u044c \u0442\u0443 \u0436\u0435 \u0431\u0430\u0437\u0443, \u0447\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0438 \u0432 \u0440\u0430\u0431\u043e\u0447\u0435\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0435, \u0430 \u0438\u043c\u0435\u043d\u043d\u043e PostgreSql. \u041a\u0430\u043a\u0438\u0435 \u043d\u044e\u0430\u043d\u0441\u044b \u0437\u0434\u0435\u0441\u044c \u0441\u0442\u043e\u0438\u0442 \u0443\u0447\u0435\u0441\u0442\u044c, \u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u043d\u0438\u0436\u0435.<\/p>\n<p>\u0414\u0430\u043b\u0435\u0435 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u043f\u043b\u0430\u0433\u0438\u043d\u044b. \u0421\u043f\u0443\u0441\u0442\u044f \u043c\u043d\u043e\u0433\u043e \u0447\u0430\u0441\u043e\u0432, \u043f\u0440\u043e\u0432\u0435\u0434\u0435\u043d\u043d\u044b\u0445 \u0432 \u0438\u0437\u0443\u0447\u0435\u043d\u0438\u0438 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u0433\u0430\u0439\u0434\u043e\u0432 \u043f\u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0434\u043b\u044f native image, \u044f \u043f\u0440\u0438\u0448\u043b\u0430 \u043a \u0432\u044b\u0432\u043e\u0434\u0443, \u0447\u0442\u043e \u0432 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0445 \u043f\u0440\u043e\u0435\u043a\u0442\u0430\u0445 \u0434\u043b\u044f \u043f\u043b\u0430\u0433\u0438\u043d\u043e\u0432 \u043a\u0430\u043a\u0438\u0445-\u0442\u043e \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u0447\u043d\u044b\u0445 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a \u043d\u0435 \u043d\u0443\u0436\u043d\u043e. \u0413\u043b\u0430\u0432\u043d\u043e\u0435 \u043d\u0435 \u0437\u0430\u0431\u044b\u0442\u044c \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u0434\u043b\u044f Liquibase \u043f\u0443\u0442\u0438 \u043a \u043f\u0440\u043e\u043f\u0435\u0440\u0442\u0438-\u0444\u0430\u0439\u043b\u0443 \u0438 \u0433\u043b\u0430\u0432\u043d\u043e\u043c\u0443 changelog \u0444\u0430\u0439\u043b\u0443.<\/p>\n<p>\u0421\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e, \u0441\u0435\u043a\u0446\u0438\u044f \u0431\u0438\u043b\u0434 \u0432 \u0438\u0442\u043e\u0433\u0435 \u0443 \u043c\u0435\u043d\u044f \u0441\u0442\u0430\u043b\u0430\u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u0432\u043e\u0442 \u0442\u0430\u043a:<\/p>\n<pre><code class=\"xml\">&lt;build> &lt;plugins> &lt;plugin> &lt;groupId>org.graalvm.buildtools&lt;\/groupId> &lt;artifactId>native-maven-plugin&lt;\/artifactId> &lt;\/plugin> &lt;plugin> &lt;groupId>org.springframework.boot&lt;\/groupId> &lt;artifactId>spring-boot-maven-plugin&lt;\/artifactId> &lt;executions> &lt;execution> &lt;id>process-aot&lt;\/id> &lt;goals> &lt;goal>process-aot&lt;\/goal> &lt;\/goals> &lt;\/execution> &lt;\/executions> &lt;configuration> &lt;excludes> &lt;exclude> &lt;groupId>org.projectlombok&lt;\/groupId> &lt;artifactId>lombok&lt;\/artifactId> &lt;\/exclude> &lt;\/excludes> &lt;\/configuration> &lt;\/plugin> &lt;plugin> &lt;groupId>org.liquibase&lt;\/groupId> &lt;artifactId>liquibase-maven-plugin&lt;\/artifactId> &lt;configuration> &lt;changeLogFile>src\/main\/resources\/db\/master-changelog.xml&lt;\/changeLogFile> &lt;propertyFile>src\/main\/resources\/liquibase.properties&lt;\/propertyFile> &lt;\/configuration> &lt;\/plugin> &lt;\/plugins> &lt;\/build><\/code><\/pre>\n<p>\u0411\u043e\u043b\u044c\u0448\u0435 \u043f\u0440\u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0443 <code>native-maven-plugin<\/code> \u0438 <code>spring-boot-maven-plugin<\/code> \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c <a href=\"https:\/\/graalvm.github.io\/native-build-tools\/latest\/maven-plugin.html\" rel=\"noopener noreferrer nofollow\">\u0437\u0434\u0435\u0441\u044c <\/a>\u0438 <a href=\"https:\/\/docs.spring.io\/spring-boot\/docs\/current\/maven-plugin\/reference\/htmlsingle\/#aot\" rel=\"noopener noreferrer nofollow\">\u0437\u0434\u0435\u0441\u044c <\/a>\u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e.<\/p>\n<p>\u041f\u043e\u043b\u043d\u044b\u0439 pom.xml \u0444\u0430\u0439\u043b:<\/p>\n<details class=\"spoiler\">\n<summary>pom.xml<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"xml\">&lt;?xml version=\"1.0\" encoding=\"UTF-8\"?> &lt;project xmlns=\"http:\/\/maven.apache.org\/POM\/4.0.0\" xmlns:xsi=\"http:\/\/www.w3.org\/2001\/XMLSchema-instance\" xsi:schemaLocation=\"http:\/\/maven.apache.org\/POM\/4.0.0 https:\/\/maven.apache.org\/xsd\/maven-4.0.0.xsd\"> &lt;modelVersion>4.0.0&lt;\/modelVersion> &lt;parent> &lt;groupId>org.springframework.boot&lt;\/groupId> &lt;artifactId>spring-boot-starter-parent&lt;\/artifactId> &lt;version>3.0.8&lt;\/version> &lt;relativePath\/> &lt;!-- lookup parent from repository --> &lt;\/parent> &lt;groupId>com.test&lt;\/groupId> &lt;artifactId>graalvm-project&lt;\/artifactId> &lt;version>0.0.1-SNAPSHOT&lt;\/version> &lt;name>graalvm-project&lt;\/name> &lt;description>Test project for testing GraalVm&lt;\/description> &lt;properties> &lt;java.version>17&lt;\/java.version> &lt;\/properties> &lt;dependencies> &lt;dependency> &lt;groupId>org.springframework.boot&lt;\/groupId> &lt;artifactId>spring-boot-starter-web&lt;\/artifactId> &lt;\/dependency>  &lt;dependency> &lt;groupId>org.projectlombok&lt;\/groupId> &lt;artifactId>lombok&lt;\/artifactId> &lt;optional>true&lt;\/optional> &lt;\/dependency> &lt;dependency> &lt;groupId>org.springframework.boot&lt;\/groupId> &lt;artifactId>spring-boot-starter-test&lt;\/artifactId> &lt;scope>test&lt;\/scope> &lt;\/dependency>  &lt;dependency> &lt;groupId>org.springframework.boot&lt;\/groupId> &lt;artifactId>spring-boot-starter-data-jpa&lt;\/artifactId> &lt;\/dependency> &lt;dependency> &lt;groupId>org.postgresql&lt;\/groupId> &lt;artifactId>postgresql&lt;\/artifactId> &lt;\/dependency> &lt;dependency> &lt;groupId>org.liquibase&lt;\/groupId> &lt;artifactId>liquibase-core&lt;\/artifactId> &lt;\/dependency> &lt;\/dependencies>  &lt;build> &lt;plugins> &lt;plugin> &lt;groupId>org.graalvm.buildtools&lt;\/groupId> &lt;artifactId>native-maven-plugin&lt;\/artifactId> &lt;\/plugin> &lt;plugin> &lt;groupId>org.springframework.boot&lt;\/groupId> &lt;artifactId>spring-boot-maven-plugin&lt;\/artifactId> &lt;executions> &lt;execution> &lt;id>process-aot&lt;\/id> &lt;goals> &lt;goal>process-aot&lt;\/goal> &lt;\/goals> &lt;\/execution> &lt;\/executions> &lt;configuration> &lt;excludes> &lt;exclude> &lt;groupId>org.projectlombok&lt;\/groupId> &lt;artifactId>lombok&lt;\/artifactId> &lt;\/exclude> &lt;\/excludes> &lt;\/configuration> &lt;\/plugin> &lt;plugin> &lt;groupId>org.liquibase&lt;\/groupId> &lt;artifactId>liquibase-maven-plugin&lt;\/artifactId> &lt;configuration> &lt;changeLogFile>src\/main\/resources\/db\/master-changelog.xml&lt;\/changeLogFile> &lt;propertyFile>src\/main\/resources\/liquibase.properties&lt;\/propertyFile> &lt;\/configuration> &lt;\/plugin> &lt;\/plugins> &lt;\/build>  &lt;\/project> <\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<h3>\u041f\u0438\u0448\u0435\u043c \u043a\u043e\u0434<\/h3>\n<p>\u0417\u0434\u0435\u0441\u044c \u044f \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u043e\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u043d\u0435 \u0431\u0443\u0434\u0443, \u0442\u0430\u043a \u043a\u0430\u043a \u044d\u0442\u043e \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0438 \u0432\u0441\u0435 \u043d\u0438\u0436\u0435 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u043d\u044b\u0435 \u043a\u043b\u0430\u0441\u0441\u044b \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0442\u0440\u0438\u0432\u0438\u0430\u043b\u044c\u043d\u044b.<\/p>\n<p>\u041a\u043e\u0434 main \u043a\u043b\u0430\u0441\u0441\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f:<\/p>\n<pre><code class=\"java\">@SpringBootApplication public class GraalvmProjectApplication {  public static void main(String[] args) { SpringApplication.run(GraalvmProjectApplication.class, args); }  }<\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0439 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440, entity \u043a\u043b\u0430\u0441\u0441 \u0438 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439.<\/p>\n<details class=\"spoiler\">\n<summary>TestEntity.java<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"java\">@AllArgsConstructor @Entity @Table(name = \"test_table\") public class TestEntity {    @Id   @Column(name = \"test_id\")   private Long id;   @Column(name = \"test_column\")   private String testColumn;  }<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<details class=\"spoiler\">\n<summary>TestRepository.java<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"java\">public interface TestRepository extends JpaRepository&lt;TestEntity, Long> {  }<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<details class=\"spoiler\">\n<summary>TestController.java<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"java\">@RestController @RequestMapping(\"\/api\/tests\") @RequiredArgsConstructor public class TestController {    private final TestRepository testRepository;    @GetMapping   public List&lt;TestEntity> getAllTests(){     return testRepository.findAll();   } }<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<h3>Liquibase \u0438 reflection<\/h3>\n<p>\u0414\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0440\u0443\u043a\u0430\u043c\u0438, \u0440\u0430\u0437 \u0443\u0436 \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c Liquibase, \u0441\u043e\u0437\u0434\u0430\u0435\u043c changeset \u0441 \u043d\u0430\u0448\u0435\u0439 \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0439 \u0442\u0430\u0431\u043b\u0438\u0446\u0435\u0439, \u0430 \u0442\u0430\u043a \u0436\u0435 main changelog \u0444\u0430\u0439\u043b.<\/p>\n<pre><code class=\"xml\">&lt;?xml version=\"1.0\" encoding=\"UTF-8\"?> &lt;databaseChangeLog   xmlns=\"http:\/\/www.liquibase.org\/xml\/ns\/dbchangelog\"   xmlns:xsi=\"http:\/\/www.w3.org\/2001\/XMLSchema-instance\"   xsi:schemaLocation=\"http:\/\/www.liquibase.org\/xml\/ns\/dbchangelog         http:\/\/www.liquibase.org\/xml\/ns\/dbchangelog\/dbchangelog-latest.xsd\">    &lt;changeSet logicalFilePath=\"\/changelog\/2023-07-25--01-test-table-changeset.xml\"     id=\"1\" author=\"Liquibase\">     &lt;createTable tableName=\"test_table\">       &lt;column name=\"test_id\" type=\"int\">         &lt;constraints primaryKey=\"true\"\/>       &lt;\/column>       &lt;column name=\"test_column\" type=\"varchar\"\/>     &lt;\/createTable>   &lt;\/changeSet>  &lt;\/databaseChangeLog><\/code><\/pre>\n<p>\u041d\u043e\u0432\u044b\u0439 changeset \u043c\u044b \u043f\u043e\u043b\u043e\u0436\u0438\u043b\u0438 \u0432 \u043f\u0430\u043f\u043a\u0443 resources \u043f\u043e \u043f\u0443\u0442\u0438 \/db\/changelog, \u0438 \u0447\u0442\u043e\u0431\u044b Liquibase \u0443\u0432\u0438\u0434\u0435\u043b \u0435\u0433\u043e, \u043d\u0430\u0448 \u0433\u043b\u0430\u0432\u043d\u044b\u0439 \u0444\u0430\u0439\u043b \u0434\u043e\u043b\u0436\u0435\u043d \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u0442\u0430\u043a:<\/p>\n<pre><code class=\"xml\">&lt;?xml version=\"1.0\" encoding=\"UTF-8\"?> &lt;databaseChangeLog   xmlns=\"http:\/\/www.liquibase.org\/xml\/ns\/dbchangelog\"   xmlns:xsi=\"http:\/\/www.w3.org\/2001\/XMLSchema-instance\"   xsi:schemaLocation=\"http:\/\/www.liquibase.org\/xml\/ns\/dbchangelog         http:\/\/www.liquibase.org\/xml\/ns\/dbchangelog\/dbchangelog-latest.xsd\">    &lt;include file=\"db\/changelog\/2023-07-25--01-test-table-changeset.xml\"\/> &lt;\/databaseChangeLog><\/code><\/pre>\n<p>\u041d\u043e, \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u043f\u0440\u043e\u0441\u0442\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u0432\u0441\u0435 \u043f\u0443\u0442\u0438 \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e. <\/p>\n<p>\u041a\u0430\u043a <a href=\"https:\/\/docs.spring.io\/spring-native\/docs\/0.12.x\/reference\/htmlsingle\/#native-hints\" rel=\"noopener noreferrer nofollow\">\u043f\u0438\u0448\u0443\u0442<\/a> \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 Spring Boot, GraalVm native image \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0443 \u0447\u0435\u0440\u0435\u0437 \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0444\u0430\u0439\u043b\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u043f\u0440\u0438 \u043d\u0430\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u0438 \u0432 META-INF\/native-image. \u042d\u0442\u043e \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0444\u0430\u0439\u043b\u044b native-image.properties, Reflect-config.json, proxy-config.json \u0438\u043b\u0438 resource-config.json. Spring Native \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u0442\u0430\u043a\u0438\u0435 \u0444\u0430\u0439\u043b\u044b \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438<\/p>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-352573","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/352573","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=352573"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/352573\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=352573"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=352573"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=352573"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}