← Назад к вопросам
Можно ли назвать стартером модуль, скопированный в 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-файл с модулем, это специально оформленный пакет, который:
- Содержит правильные зависимости — транзитивные зависимости, которые нужны для функциональности
- Имеет мета-информацию в
META-INF/spring/(для автоконфигурации) - Имеет
spring.factories(Java 8-16) илиspring/org.springframework.boot.autoconfigure.AutoConfiguration.imports(Java 17+) - Следует соглашениям имён —
spring-boot-starter-* - Публикуется в 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
❌ Проблемы простого копирования:
- Отсутствие разрешения зависимостей: Maven не будет знать, какие транзитивные зависимости нужны
- Отсутствие автоконфигурации: Spring Boot не найдёт AutoConfiguration класс
- Невозможность использовать в других проектах: Нет артефакта в репозитории
- Версионирование: Невозможно контролировать версии
- Обновления: Нельзя получить новые версии через зависимости
// ❌ Если просто скопировать 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. Они экономят часы конфигурации!