Начните свой путь к персонализации Spring Initializr

Java

Every good Spring Boot project usually starts at start.spring.io/

Josh Long

202006201751FnpKSR11

Предварительное введение, когда вашему собственному проекту или проекту компании обычно требуется поддерживать множество настраиваемых модулей, они загружаются на частный сервер maven для удобства использования, но есть проблема.Каждый раз, когда вам нужен соответствующий пакет, вам нужно перейти на документацию или посмотреть бом, нельзя прямо вводится время строящегося проекта.Применительно к start.spring.io я пытаюсь собрать свой собственный сервис spring initializr, а заодно интегрировать некоторые свои собственные пакеты, предоставлять персонализированные услуги и быстро развиваться.

Цель

базовая структура

18077Y13ii51

  • 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, в некоторых сценариях все еще необходимо выполнить некоторые настройки, например:

  1. Из-за сетевых ограничений вам необходимо создать собственный экземпляр
  2. Настройте свой собственный интерфейс
  3. Предоставьте некоторую собственную конфигурацию или зависимости, такие как внутренний стартер компании.

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соглашение к лицензии. Ее можно свободно воспроизводить и цитировать, но с обязательной подписью автора и указанием источника статьи.