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 .