Every good Spring Boot project usually starts at start.spring.io/
Предварительное введение, когда вашему собственному проекту или проекту компании обычно требуется поддерживать множество настраиваемых модулей, они загружаются на частный сервер maven для удобства использования, но есть проблема.Каждый раз, когда вам нужен соответствующий пакет, вам нужно перейти на документацию или посмотреть бом, нельзя прямо вводится время строящегося проекта.Применительно к start.spring.io я пытаюсь собрать свой собственный сервис spring initializr, а заодно интегрировать некоторые свои собственные пакеты, предоставлять персонализированные услуги и быстро развиваться.
Цель
базовая структура
- Spring InitializrПредоставляет основной REST API, который можно интегрировать в пользовательский интерфейс или IDE (например, Intellij IDEA) для непосредственной генерации проектов.
- start.spring.ioПредоставляет веб-интерфейс, сильно зависящий от Spring Initializr, отображает данные из свойств Spring и настраивает в основном с использованием SPI, предоставляемого Spring Initializr.
- В дополнение к этому, Spring.io предоставляетSpring Boot metadata endpoint, Spring Initializr будет использовать метаданные в качестве внешнего источника данных, чтобы убедиться, что сгенерированная версия Spring Boot актуальна.
персонализировать
start.spring.io/Несмотря на то, что был предоставлен очень хороший Spring Boot Start, в некоторых сценариях все еще необходимо выполнить некоторые настройки, например:
- Из-за сетевых ограничений вам необходимо создать собственный экземпляр
- Настройте свой собственный интерфейс
- Предоставьте некоторую собственную конфигурацию или зависимости, такие как внутренний стартер компании.
Spring Initializr — это модульное приложение, созданное с помощью Spring Boot, поэтому его легко расширять.
Версия
Из-за официальногоSpring InitializrИ bom предоставляется, поэтому мы можем построить его непосредственно на основе последней версии bom.
<dependencyManagement>
<dependencies>
<dependency>
<groupId>io.spring.initializr</groupId>
<artifactId>initializr-bom</artifactId>
<version>0.8.0.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
Процесс сборки
Подготовить
два компонента
Initializr требуется, интерфейс пользовательского интерфейса необязателен.
персонализировать
пользовательский файл конфигурации
может основываться наInitializrPropertiesОпределите application.yml для создания основных зависимостей. Spring Initializr также позволяет нам определять метаданные с помощью InitializrMetadataProvider, поэтому мы можем создать класс CustomInitializrProperties для чтения элементов конфигурации из разных файлов конфигурации.
@Configuration
@EnableConfigurationProperties(CustomInitializrProperties.class)
public class CustomInitializrConfiguration {
@Bean
public DefaultInitializrMetadataProvider customInitializrMetadataProvider(InitializrProperties initializrProperties,
CustomInitializrProperties customInitializrProperties,
InitializrMetadataUpdateStrategy initializrMetadataUpdateStrategy) {
InitializrMetadata meta = InitializrMetadataBuilder.fromInitializrProperties(customInitializrProperties.getInitializr())
.withInitializrProperties(initializrProperties, true).build();
return new DefaultInitializrMetadataProvider(meta, initializrMetadataUpdateStrategy);
}
}
@Data
@ConfigurationProperties("custom")
public class CustomInitializrProperties {
@NestedConfigurationProperty
InitializrProperties initializr = new InitializrProperties();
}
конфигурация черезStartApplicationдля загрузки, но так как приложение не использует сканирование компонентов, нам нужно настроить параметры в файле конфигурации:
custom:
initializr:
dependencies:
- name: Custom Dependencies
content:
- name: Custom dependency
id: custom-dependency
groupId: your.domain
artifactId: custom-artifact
starter: false
description: My first custom dependency for the Spring Initializr
С помощью этой настраиваемой конфигурации зависимостей мы можем контролировать слияние и порядок отображения элементов конфигурации.
Расширение Initializr
Настройка зависимостей через конфигурационные файлы не всегда удовлетворяет наши потребности, иногда нам также необходимо настроить некоторые фрагменты кода, в этом случае нам нужно использовать некоторые хуки-расширения, предоставляемые Spring Initializr:
- BuildCustomizer: определение процесса сборки Maven/Gradle, например добавление подключаемого модуля сборки maven.
- ProjectContributor: Определите некоторые персонализированные каталоги или файлы проекта.
- MainSourceCodeCustomizer, MainCompilationUnitCustomizer, MainApplicationTypeCustomizer, TestSourceCodeCustomizer, TestApplicationTypeCustomizer: Генерируется или модифицируется исходный код проекта, не ограничиваясь языком проекта.
- GitIgnoreCustomizer: определить файл gitignore
- HelpDocumentCustomizer: определить файл HELP.md
- ProjectDescriptionCustomizer: часто используется для размещения описаний проектов, таких как автоматическое разрешение недопустимых комбинаций версии фреймворка и уровня языка.
Например, если нам нужно добавить плагин Maven к сгенерированному проекту, нам нужно использовать так называемую «псевдо» зависимость (pseudo dependency). Сначала нам нужно определить такую зависимость:
custom:
initializr:
dependencies:
- name: Custom Dependencies
content:
- name: Custom Maven Plugin
id: custom-maven-plugin
groupId: your.domain
artifactId: custom-maven-plugin
version: 1.0.0
starter: false
description: Configures custom Maven plugin integration for project scans
Затем мы определяем два BuildCustomizer: один для добавления плагинов зависимостей maven и один для удаления плагинов.
@ProjectGenerationConfiguration
@ConditionalOnRequestedDependency("custom-maven-plugin")
public class CustomMavenPluginConfiguration {
@Bean
public BuildCustomizer<MavenBuild> customPluginConfigurer() {
return (MavenBuild build) -> {
build.dependencies().ids().filter(it -> it.equals("custom-maven-plugin"))
.findFirst()
.map(r -> build.dependencies().get(r)).map(r -> {
build.plugins().add(r.getGroupId(), r.getArtifactId(),
(plugin) -> plugin.execution("my-execution",
(first) -> first.goal("scan").configuration((conf) -> {conf.add("failOnSeverity", "MAJOR");})
));
return build;
}).orElse(build);
};
}
@Bean
public BuildCustomizer<MavenBuild> customPluginDependencyRemoval() {
return build -> build.dependencies().remove("custom-maven-plugin");
}
}
Обратите внимание, что используя аннотации, Spring Initializr сам не использует эти автоматические настройки, а использует их при генерации проектов, но требуетspring.factories
зарегистрировать эти конфигурации
io.spring.initializr.generator.project.ProjectGenerationConfiguration=\
io.spring.start.site.extension.StartProjectGenerationConfiguration, \
io.spring.start.site.CustomMavenPluginConfiguration
Полученный помпон выглядит так:
<plugin>
<groupId>your.domain</groupId>
<artifactId>custom-maven-plugin</artifactId>
<version>1.0.0</version>
<executions>
<execution>
<id>my-execution</id>
<goals>
<goal>scan</goal>
</goals>
<configuration>
<failOnSeverity>MAJOR</failOnSeverity>
</configuration>
</execution>
</executions>
</plugin>
Эпилог
Начните обсуждение, в этой статье просто описывается некоторый пользовательский метод Spring Initializr для большего и лучшего режима расширения, который вам также необходимо обнаружить.
Эта статья состоит изЗаблудший старый фермерсоздавать, использоватьCC BY 4.0 CNсоглашение к лицензии. Ее можно свободно воспроизводить и цитировать, но с обязательной подписью автора и указанием источника статьи.