Измените Spring Проект загрузки для наследования пользовательского управления зависимостями
У меня есть небольшое приложение загрузки Spring, которое я должен адаптировать для использования настраиваемого родителя. Google находит множество примеров того, как перейти на Spring Boot, но я не понимаю, как перейти от Spring Boot (что я едва знаю для начала).
Причины
Чтобы сделать что-то не так, это приложение было разработано как своего рода доказательство концепции, и разработчик выбрал самые современные технологии.
Теперь это приложение будет продолжать жить, и мы должны интегрировать его в нашу структуру. Поэтому, как проект Maven, он должен наследовать одного из наших общих родительских элементов, хотя это мое понимание Spring Проекты загрузки должны наследоваться от родительского родительского родителя Spring.
[Изменить] Я ошибался: возможно использовать Spring Boot без родительского ПОМ. Поэтому удаление Spring Boot не является обязательством, но наш родительский POM включает в себя собственное управление версиями, которое обязывает меня переопределить несколько версий, включенных в стартер.
Почему нам нужно наследовать от нашего родителя
У нас есть инфраструктура предприятия, используемая во всех наших проектах. Чтобы упростить задачу, мы управляем версиями многих фреймворков в нашей родительской POM. Некоторые примеры, когда эти версии конфликтуют с теми из spring -boot-зависимостей в нашем маленьком пакетном проекте:
- Spring framework (собственный: 3.2.4; Spring Загрузка 1.2.2: 4.1.5)
- Spring Пакет (ih: 2.2.0; sb: 3.0.3)
- Velocity (ih: 1.5; sb: 1.7)
- Junit (ih: 4.11; sb: 4.12)
- ... (мы управляем примерно 90 версиями)
Я, очевидно, не имею права обновлять эти версии. Имейте в виду, что эта структура используется во многих проектах, и любое изменение может иметь драматические и неконтролируемые последствия.
Дополнительный контекст
Цель состоит в том, чтобы получить небольшое пакетное приложение Spring. Он должен взять некоторый ввод из командной строки и вернуть код выхода 12
, если выполнение завершится с ошибкой. Ниже ядро пусковой установки, но я открыт для любого лучшего способа сделать это.
Наш класс пусковой установки
Если полностью отказаться от Spring Boot, мне нужно будет адаптировать этот класс launcher, но, будучи в основном используемым для контекстов XML Spring, мне это немного сложно.
// ...
import org.springframework.batch.core.ExitStatus;
import org.springframework.batch.core.JobExecution;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.annotation.ComponentScan;
@ComponentScan("my.config.package")
@EnableAutoConfiguration
public class Application {
public static void main(String[] args) {
// ...
SpringApplication app = new SpringApplication(Application.class);
app.setWebEnvironment(false);
final Map<String, Object> maps = new HashMap<>();
maps.put("input", "file:" + inputPath);
app.setDefaultProperties(maps);
ConfigurableApplicationContext ctx = app.run(args);
JobExecutionSavingListener listener = ctx.getBean(JobExecutionSavingListener.class);
final JobExecution jobExecution = listener.getJobExecution();
if (jobExecution.getExitStatus() != ExitStatus.COMPLETED) {
System.exit(12);
return;
}
System.exit(0);
}
}
Вопрос
Каков наилучший способ изменить мой код для адаптации моего пакетного приложения Spring, чтобы я мог использовать свой собственный родитель Maven?
Ответы
Ответ 1
Вы можете использовать Spring Boot с использованием или без использования spring-boot-starter-parent
в качестве родителя для вашего проекта. Это объясняется в в этом разделе справочного руководства по загрузке Spring.
Добавление этого в проект poms по-прежнему позволяет использовать Spring Boot и иметь собственный родитель.
<dependencyManagement>
<dependencies>
<dependency>
<!-- Import dependency management from Spring Boot -->
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>1.2.3.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
Теперь вы можете просто определить своего собственного родителя. Добавление следующей зависимости должно предоставить вам все необходимые банки для запуска Spring Batch.
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-batch</artifactId>
</dependency>
</dependencies>
Один из недостатков (невозможности) использования стартера загрузки Spring как родителя заключается в том, что если вам нужны конкретные версии библиотеки, вам нужно будет включить все зависимости. При использовании его в качестве родителя было бы проще указать свойство (т.е. spring-batch.version
) с версией.
Ответ 2
Вы можете использовать Spring Boot для использования Spring Batch, на самом деле это рекомендуемый подход.
Кроме того, Spring загрузочным проектам не нужно наследовать ни один родительский pom, им просто нужно включить зависимость от загрузочной библиотеки Spring в вашем pom.
Здесь есть очень хороший и простой пример:
Spring Пример пакета
Вы должны понимать, что единственная "специальная" вещь в Spring Boot - это то, что она была создана для запуска автономных приложений с минимальным количеством конфигурации Spring в отличие от традиционного spring -web, который был создан для запуска на сервере.
Я также забыл добавить, что вы все еще можете использовать конфигурацию XML вместо подхода к настройке Java, если вам будет комфортно с ним.