В чем разница mvn spring-boot:run и Application.main()

#spring-boot

#spring-boot

Вопрос:

Я просто хочу знать, есть ли какая-либо разница между запуском приложения spring boot с :

 mvn spring-boot:run
  

и

 java -jar target/the-packaged-file.war (Or in IDE, right click and run java application)
  

Ответ №1:

Отличный вопрос.

Мы предполагаем, что нет никакой разницы между mvn spring-boot:run и запуском вашего приложения из вашей IDE. Оба запускают основной класс, используя classpath проекта. Последнее настоятельно рекомендуется при работе над вашим приложением: если вы запустите свое приложение из своей IDE, вы получите все приятные функции, такие как debugging и devtools. Первый используется, когда вам нужен стандартный способ запуска приложения в командной строке. Плагин maven также может запускать ваше приложение до этапа тестирования интеграции (см. start Цель плагина Maven / Gradle). Если вы используете сборку для фильтрации некоторых ресурсов, ваша среда разработки должна знать об этом, иначе некоторые данные могут не быть отфильтрованы при запуске приложения из среды разработки.

java -jar yourapp.jar выполняется на конечном артефакте. Spring Boot заботится о создании пути к классу приложения. Отфильтрованные ресурсы хранятся в jar. Но, в конце концов, это предназначено для того, чтобы делать то же самое.

Теперь в вашем вопросе есть war . Вы не можете ожидать, что обычный war обратный вызов будет применяться к чему-то, что выполняется как основной класс. Сказав это, Spring Boot делает все возможное, чтобы предоставить вам все инструменты для обеспечения согласованности. war , который запускается из контейнера запущенного сервлета, будет инициализирован не методом main, а инициализатором сервлета. Однако у вас есть способ поделиться кодом инициализации, чтобы он был согласованным. Цель запуска плагина добавит src/main/webapp , чтобы эти файлы также обслуживались.

TL; DR если вы ищете согласованную историю во всех средах, не используйте war packaging.

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

1. Я получил ошибку шаблона: Вызванную: org.thymeleaf.exceptions. Исключение TemplateInputException: шаблон для устранения ошибок «/ error», шаблон может не существовать или может быть недоступен ни для одного из настроенных преобразователей шаблонов, когда я запускаю приложение с java -jar target/myApp.jar и пытаюсь получить доступ к недопустимому URL, но когда я запускаю с mvn spring-boot:run моим шаблоном error.html работает нормально. Кто-нибудь знает почему? Резервуары

2. Пожалуйста, задайте свой собственный вопрос, комментарии не предназначены для этого.

3. У меня есть приложение, которое ведет себя по-разному, когда я запускаю его на STS, используя «Run As — Spring Boot App», по сравнению с запуском его в командной строке с помощью «bootRun» или с помощью «java -jar». В чем может быть разница? В частности, когда я запускаю с помощью bootRun, он не использует Spring Session. Он использует управление сеансами Tomcat. При запуске на STS он использует весеннюю сессию.

4. Вы набрали все это из своей головы?

5. Я сравнил цель для запуска с maven (mvn spring-boot:run) и файл jar для запуска с jar ( java -jar *.jar). Оба включают путь к классу, библиотеку, конфигурацию и то же самое. Я не видел никакой разницы.