Как создать неисполняемую библиотеку (jar) с помощью spring boot?

#java #spring #spring-boot #cloud-foundry

#java #spring #spring-boot #cloud-foundry

Вопрос:

Я работаю над приложением и развертываю его в cloud foundry. Внутри она имеет 3 пользовательские зависимости, разработанные нашей командой.

Все 3 зависимости являются загрузочным проектом и имеют свои @Configuration .

  • Зависимость 1 заключается во взаимодействии с Couchbase. Источником этой зависимости является boot project.
  • Зависимость 2 заключается во взаимодействии с FluentD для ведения журнала. Источником этой зависимости является boot project.
  • Зависимость 3 заключается во взаимодействии с внешней службой rest. Источником этой зависимости является boot project.
  • Зависимость 4 имеет все вышеперечисленные 3 зависимости, а также несколько классов утилит и констант.

Я использую эту зависимость 4 в нескольких веб-приложениях, которые имеют реализацию WebMVC.

На моем локальном компьютере все работает нормально. Но когда я запускаю это веб-приложение в облаке, иногда библиотеки выполняются перед веб-приложением, которое периодически приводит к сбою моего приложения. Хорошая вещь, приложение восстанавливается за несколько секунд.

Я внес нижеприведенные изменения в свои библиотеки (банки / зависимости) и попробовал в облаке. После внесения этих изменений коэффициент сбоя приложения уменьшается, но, к сожалению, он все еще иногда падает, и я могу видеть, что зависимости выполняются перед приложением.

  • Добавлен bootRepackage.enabled = false bootRepackage.С jartask = jar в библиотеке build.gradle
  • Удалено из библиотеки и добавлено в мое веб-приложение SpringBoot { MainClass = «com.java .Приложение » исполняемый файл = true }
  • Вылетел @SpringBootApplication из библиотек (зависимостей / jars). Сейчас это только в моем веб-приложении.

Я не знаю, что это единственные шаги, позволяющие сделать зависимость загрузки неисполняемой, иначе мне пришлось бы сделать что-то еще. Пожалуйста, дайте мне знать, если я чего-то не хватает.

Вот пример отключенного класса приложения одной из моих зависимостей.

 import org.springframework.context.annotation.ComponentScan;

  @ComponentScan
  public class LoggingApplication {

  }

Sample of Web application main class.
  @SpringBootApplication
  @EnableWebMvc
  @Import(LoggingApplication.class) 
  public class Application {


    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
  }
  

Комментарии:

1. Что означает «иногда библиотеки выполняются до веб-приложения»? Библиотеки на самом деле не должны ничего выполнять.

2. И, честно говоря, если это внутренние зависимости, а не полноценные приложения, то какого черта вы вообще используете Spring Boot? Обычного фреймворка Spring должно быть достаточно.

Ответ №1:

Вы не предоставили stacktrace и не предоставили никаких подробностей о «сбое». Итак, глядя в мой хрустальный шар, это звучит так, как будто вы выполняете некоторую работу на этапе подключения контейнера Spring IoC. Эту «работу» следует перенести в @PostConstruct обработчики, чтобы вы были уверены, что она будет выполнена после полного создания и инициализации контекста Spring.