← Назад к вопросам

Можно ли назвать стартером модуль, скопированный в JAR-файл?

3.0 Senior🔥 31 комментариев
#Spring Boot и Spring Data

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Spring Boot Starters и зависимости в JAR

Нет, нельзя просто скопировать модуль в JAR-файл и назвать его стартером. Это распространённое недоразумение среди разработчиков, которые знакомы с Spring Boot Starters поверхностно.

Что такое Spring Boot Starter

Spring Boot Starter — это не просто JAR-файл с модулем, это специально оформленный пакет, который:

  1. Содержит правильные зависимости — транзитивные зависимости, которые нужны для функциональности
  2. Имеет мета-информацию в META-INF/spring/ (для автоконфигурации)
  3. Имеет spring.factories (Java 8-16) или spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports (Java 17+)
  4. Следует соглашениям имёнspring-boot-starter-*
  5. Публикуется в Maven Central (обычно)
sspring-boot-starter-web JAR-файл
├── org/springframework/boot/autoconfigure/
├── META-INF/
│   └── spring/
│       └── org.springframework.boot.autoconfigure.AutoConfiguration.imports
└── spring-boot-starter-web-*.jar (сам стартер)

Правильный способ создать свой Starter

Шаг 1: Создать два модуля

my-project/
├── my-service-spring-boot-starter/  ← Стартер (пустой JAR)
│   └── pom.xml (зависимости)
└── my-service-spring-boot-autoconfigure/  ← Автоконфигурация (код)
    ├── pom.xml
    └── src/main/java/
        └── com/example/MyServiceAutoConfiguration.java

Шаг 2: Автоконфигурация

@Configuration
@ConditionalOnClass(MyService.class)
@EnableConfigurationProperties(MyServiceProperties.class)
public class MyServiceAutoConfiguration {
    
    @Bean
    @ConditionalOnMissingBean
    public MyService myService(MyServiceProperties properties) {
        return new MyService(properties);
    }
}

Шаг 3: Файл конфигурации

src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports:

com.example.MyServiceAutoConfiguration

Шаг 4: POM стартера (только зависимости)

<project>
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.example</groupId>
    <artifactId>my-service-spring-boot-starter</artifactId>
    <version>1.0.0</version>
    <packaging>jar</packaging>
    
    <dependencies>
        <!-- Зависимость на автоконфигурацию -->
        <dependency>
            <groupId>com.example</groupId>
            <artifactId>my-service-spring-boot-autoconfigure</artifactId>
            <version>1.0.0</version>
        </dependency>
        
        <!-- Spring Boot -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
    </dependencies>
</project>

Почему нельзя просто скопировать JAR

Проблемы простого копирования:

  1. Отсутствие разрешения зависимостей: Maven не будет знать, какие транзитивные зависимости нужны
  2. Отсутствие автоконфигурации: Spring Boot не найдёт AutoConfiguration класс
  3. Невозможность использовать в других проектах: Нет артефакта в репозитории
  4. Версионирование: Невозможно контролировать версии
  5. Обновления: Нельзя получить новые версии через зависимости
// ❌ Если просто скопировать JAR в lib/ папку:
// Spring Boot не автоконфигурирует ничего!
// Придётся конфигурировать вручную:

@Configuration
public class ManualConfig {
    @Bean
    public MyService myService() {
        return new MyService();  // Вручную
    }
}

Правильный способ использовать Starter

<!-- pom.xml в клиентском проекте -->
<dependency>
    <groupId>com.example</groupId>
    <artifactId>my-service-spring-boot-starter</artifactId>
    <version>1.0.0</version>
</dependency>
# application.yml
my-service:
  api-key: "secret-key"
  timeout: 5000
// Автоматически инициализируется!
@SpringBootApplication
public class MyApp {
    public static void main(String[] args) {
        SpringApplication.run(MyApp.class, args);
    }
}

Примеры из Spring Boot

Официальные стартеры следуют этому паттерну:

spring-boot-starter-web
├── зависит на spring-boot-starter (базовое)
├── зависит на spring-boot-starter-tomcat
├── зависит на spring-webmvc
└── в autoconfigure есть WebMvcAutoConfiguration

Тестирование своего Starter

@ExtendWith(SpringExtension.class)
@SpringBootTest
class MyServiceAutoConfigurationTest {
    
    @Autowired
    private MyService myService;
    
    @Test
    void testAutoConfiguration() {
        assertNotNull(myService);
    }
}

Вывод

  • ❌ Копировать JAR в папку — это НЕ стартер
  • ✅ Стартер — это структурированный артефакт с правильными зависимостями
  • ✅ Должна быть отдельная автоконфигурация с @Configuration
  • ✅ Должен быть файл AutoConfiguration.imports
  • ✅ Публикуется в Maven репозиторий
  • ✅ Использует транзитивные зависимости для упрощения подключения

Стартеры — это суть удобства Spring Boot. Они экономят часы конфигурации!

Можно ли назвать стартером модуль, скопированный в JAR-файл? | PrepBro