Запускать одно приложение Spring в двух режимах - типа CommandLineRunner и SpringBootServletInitializer - PullRequest
1 голос
/ 05 февраля 2020

Мне нужно запустить приложение Spring Boot в двух режимах:

  1. В качестве приложения командной строки (без Tomcat) как CommandLineRunner
  2. Как SpringBootServletInitializer Приложение REST API для автономный Tomcat.

Вопрос: Возможно ли это? Как я могу добиться этой настройки?

1 Ответ

1 голос
/ 05 февраля 2020

Я думаю, что в вопросе есть противоречие:

Если вы используете SpringBootServletInitializer, то артефакт должен быть упакован как WAR и развернут на каком-либо веб-сервере, таком как tomcat. Tomcat не встроен в этом случае.

Если вы хотите встроенный Tomcat, то вам не нужен WAR, вам следует использовать «обычный» тип jar-файла приложения с пружинной загрузкой.

Несколько фактов, которые могут помочь:

В бинах CommandLineRunner нет ничего особенного, за исключением того, что весенняя загрузка автоматически запускает метод run на всех бинах, которые реализуют этот интерфейс, когда контекст приложения становится доступным.

Тот факт, что у вас есть веб-стартер в зависимостях, обычно означает, что вы намереваетесь запустить веб-сервер (tomcat), однако это не всегда так, вы можете указать веб-среду. введите «NONE», и встроенный кот не будет запущен (см. этот поток для получения дополнительной технической информации)

Теперь, учитывая эти два факта и предполагая, что вы на самом деле не создаете WAR (в этом случае вам придется разместить его на встроенном tomcat, java не распознает WARs) - вы можете определить, например, «flavour» - профиль и определить конфигурацию для бегуна командной строки, который будет активен только для определенный профиль и свойство не запущенного кота должны соответствовать другому типу профиля.

Обновление

На основании комментария OP:

Таким образом, цель состоит в том, чтобы запустить:

java -jar myapp.war

таким образом, что будет работать только CommandLineRunner и никакой настоящий кот не будет загружен

С другой стороны, вы хотите поставить myapp.war в папку webapps некоторого tomcat, и таким образом CommandLineRunner не будет вызываться, верно?

В этом случае рассмотрите возможность реализации следующего предложения:

  1. create application-cmd.properties и указать у кота не должно быть (web env. type = NONE) - см. ссылку, которую я предоставил выше

  2. Добавьте @Profile("cmd") в CommandLineRunner реализацию, чтобы она работала только при профиле ' указан cmd '.

  3. Запустите java -jar myapp.war с флагом --spring.profiles.active=cmd, чтобы загрузить профиль cmd.

  4. Не изменять что-нибудь для развертывания Tomcat - профиль cmd не будет активирован, а CommandLineRunner не будет работать

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...