Перейти к основному содержимому

Введение в Spring Native

· 6 мин. чтения

1. Обзор

Собственные образы обеспечивают различные преимущества, такие как мгновенный запуск и снижение потребления памяти . Поэтому иногда нам может понадобиться создать собственный образ нашего Java-приложения.

В этом руководстве мы рассмотрим Spring Native для компиляции и сборки собственных образов с использованием пакетов сборки и собственных инструментов сборки GraalVM.

2. Базовая установка

В качестве предварительного условия мы обязательно установим Docker, который потребуется позже для запуска нативных образов .

Затем мы создадим простой проект Spring Boot с именем foreach-spring-native и будем использовать его на протяжении всего руководства для создания собственного образа.

Затем давайте добавим ссылку на репозиторий Spring для загрузки зависимостей и плагинов, необходимых в следующих разделах:

<repositories>
<repository>
<id>spring-release</id>
<name>Spring release</name>
<url>https://repo.spring.io/release</url>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>spring-release</id>
<name>Spring release</name>
<url>https://repo.spring.io/release</url>
</pluginRepository>
</pluginRepositories>

Затем мы добавим последнюю весеннюю зависимость Maven:

<dependency>
<groupId>org.springframework.experimental</groupId>
<artifactId>spring-native</artifactId>
<version>0.10.0</version>
</dependency>

Однако для проекта Gradle Spring Native автоматически добавляется плагином Spring AOT .

Следует отметить, что каждая версия Spring Native поддерживает только определенную версию Spring Boot — например, Spring Native 0.10.0 поддерживает Spring Boot 2.5.1. Итак, мы должны обязательно использовать совместимые зависимости Spring Boot Maven в нашем pom.xml .

Далее мы добавим несколько свойств, чтобы использовать Java 8 для компиляции:

<properties>
<java.version>1.8</java.version>
<maven.compiler.target>1.8</maven.compiler.target>
<maven.compiler.source>1.8</maven.compiler.source>
</properties>

Наконец, мы создадим класс SpringNativeApp :

public class SpringNativeApp {
public static void main(String[] args) {
System.out.println("Hello, World! This is a ForEach Spring Native Application");
}
}

3. Пакеты сборки

Теперь, когда наш проект Spring Boot, foreach-spring-native , готов с базовой настройкой, давайте интегрируем пакеты сборки в наш проект Spring Boot для создания нативных образов .

3.1. Плагин Spring Boot Maven

Во- первых, нам потребуется spring-boot-maven-plugin с собственной конфигурацией образа с использованием пакетов сборки Paketo Java :

<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<image>
<builder>paketobuildpacks/builder:tiny</builder>
<env>
<BP_NATIVE_IMAGE>true</BP_NATIVE_IMAGE>
</env>
</image>
</configuration>
</plugin>
</plugins>
</build>

Здесь мы будем использовать крошечный построитель из различных доступных сборщиков, таких как базовый и полный , для создания собственного образа . Кроме того, мы включили пакет сборки, указав истинное значение переменной среды BP_NATIVE_IMAGE .

Точно так же при использовании Gradle мы можем добавить крошечный билдер вместе с переменной среды BP_NATIVE_IMAGE в файл build.gradle :

bootBuildImage {
builder = "paketobuildpacks/builder:tiny"
environment = [
"BP_NATIVE_IMAGE" : "true"
]
}

3.2. Весенний плагин AOT

Затем нам нужно добавить подключаемый модуль Spring AOT , который выполняет заблаговременные преобразования, полезные для улучшения занимаемой площади и совместимости собственного образа.

Итак, давайте добавим последнюю зависимость Maven spring-aot-maven-plugin в наш pom.xml :

<plugin>
<groupId>org.springframework.experimental</groupId>
<artifactId>spring-aot-maven-plugin</artifactId>
<version>0.10.0</version>
</plugin>

Точно так же для проекта Gradle мы можем добавить последнюю зависимость org.springframework.experimental.aot в файл build.gradle :

plugins {
id 'org.springframework.experimental.aot' version '0.10.0'
}

Кроме того, как мы отмечали ранее, это автоматически добавит зависимость Spring Native в проект Gradle.

Плагин Spring AOT предоставляет несколько параметров для определения генерации исходного кода . Например, такие параметры, как removeYamlSupport и removeJmxSupport, удаляют поддержку Spring Boot Yaml и Spring Boot JMX соответственно.

3.3. Соберите и запустите образ

Вот и все! мы готовы создать собственный образ нашего проекта Spring Boot с помощью команды Maven:

$ mvn spring-boot:build-image

Команда Maven должна создать собственный образ нашего приложения Spring Boot с именем foreach-spring-native:0.0.1-SNAPSHOT .

Примечание: создание нативных образов требует много ресурсов. Таким образом, мы должны увеличить объем памяти и ЦП, выделенных для Docker, когда мы сталкиваемся с проблемами при создании нативных образов .

Наконец, мы можем запустить образ нашего приложения в Docker с помощью команды docker run :

$ docker run --rm -p 8080:8080 foreach-spring-native:0.0.1-SNAPSHOT

Таким образом, наше приложение должно запускаться практически мгновенно и выводить примерно следующее:

Hello, World! This is a ForEach Spring Native Application

4. Собственные инструменты сборки GraalVM

В качестве альтернативы пакетам сборки Paketo мы можем использовать собственные инструменты сборки GraalVM для компиляции и сборки собственных образов с помощью компилятора собственных образов GraalVM . ``

4.1. Установка собственного компилятора образов

В качестве предварительного условия мы должны установить SDKMAN, чтобы упростить процесс установки . Затем мы можем использовать SDKMAN для установки GraalVM для Java 8 :

$ sdk install java 21.0.0.2.r8

Далее мы настроим JAVA_HOME , указывающий на дистрибутив GraalVM 21.0.0.2.r8 .

Наконец, давайте установим компилятор собственного образа , предоставленный установленным дистрибутивом GraalVM 21.0.0.2.r8 :

$ gu install native-image

4.2. Весна АОТ

Наряду с нативной зависимостью spring мы добавим последнюю зависимость Maven spring-aot , необходимую для нативных инструментов сборки, в наш pom.xml :

<dependency>
<groupId>org.springframework.experimental</groupId>
<artifactId>spring-aot</artifactId>
<version>0.10.0</version>
</dependency>

4.3. Плагин Spring Boot Maven

Подобно пакетам сборки Paketo, для собственных инструментов сборки GraalVM также требуется spring-boot-maven-plugin :

<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>

4.4. Весенний плагин AOT Maven

Кроме того, мы добавим плагин spring-aot-maven-plugin в наш pom.xml с целью генерации :

<plugin>
<groupId>org.springframework.experimental</groupId>
<artifactId>spring-aot-maven-plugin</artifactId>
<version>0.10.0</version>
<executions>
<execution>
<id>generate</id>
<goals>
<goal>generate</goal>
</goals>
</execution>
</executions>
</plugin>

4.5. Родной профиль

Далее мы добавим профиль с именем native с поддержкой сборки нескольких плагинов, таких как native-maven-plugin и spring-boot-maven-plugin :

<profiles>
<profile>
<id>native</id>
<build>
<plugins>
<plugin>
<groupId>org.graalvm.buildtools</groupId>
<artifactId>native-maven-plugin</artifactId>
<version>0.9.0</version>
<executions>
<execution>
<id>build-native</id>
<goals>
<goal>build</goal>
</goals>
<phase>package</phase>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<classifier>exec</classifier>
</configuration>
</plugin>
</plugins>
</build>
</profile>
</profiles>

Этот профиль будет вызывать компилятор собственного образа из сборки на этапе упаковки.

Однако при использовании Gradle мы добавим последний плагин org.graalvm.buildtools.native в файл build.gradle :

plugins {
id 'org.graalvm.buildtools.native' version '0.9.0'
}

4.6. Построить и запустить

Вот и все! Мы готовы создать собственный образ, предоставив собственный профиль в команде пакета Maven :

$ mvn -Pnative -DskipTests package

Команда Maven создаст исполняющий файл foreach-spring-native в целевой папке . Итак, мы можем запустить наше приложение, просто обратившись к файлу-исполнителю:

$ target/foreach-spring-native
Hello World!, This is ForEach Spring Native Application

5. Вывод

В этом руководстве мы изучили Spring Native вместе с пакетами сборки и собственными инструментами сборки GraalVM.

Во-первых, мы создали простой проект Spring Boot и создали собственный образ, используя пакеты сборки Paketo. Затем мы рассмотрели собственные инструменты сборки GraalVM для создания и запуска собственных образов с использованием компилятора собственных образов GraalVM .

Как обычно, все реализации кода доступны на GitHub .