Почему плагин Maven для весенней загрузки требует основного класса для упаковки войны? - PullRequest
0 голосов
/ 14 декабря 2018

Руководства Spring Boot дают код, который создает пригодные для запуска jars , но мы можем использовать его для построения war файлов, как объяснено здесь ,По сути, это требует, чтобы мы указали упаковку как war, удалили зависимость от встроенного сервера tomcat и расширили класс SpringBootServletInitializer следующим образом:

@SpringBootApplication
public class Application extends SpringBootServletInitializer {

  @Override
  protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
      return application.sources(Application.class);
  }

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

Мой вопрос заключается в том, почему нам нужно предоставить основнуютоже метод, так как метод main требуется только в том случае, если мы хотим запустить jar.

Я попытался удалить этот метод main, и компиляция не удалась, сказав, что плагин не может найти основной класс.

1 Ответ

0 голосов
/ 14 декабря 2018

С этой же страницы (11.3.3):

https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#getting-started-first-application-main-method

Заключительная часть нашего приложения является основным методом.Это просто стандартный метод, который следует Java-соглашению для точки входа приложения.Наш основной метод делегирует класс SpringAot SpringApplication, вызывая run.SpringApplication загружает наше приложение, начиная Spring, который, в свою очередь, запускает автоматически настроенный веб-сервер Tomcat.Нам нужно передать Example.class в качестве аргумента методу run, чтобы сообщить SpringApplication, который является основным компонентом Spring.Массив args также передается для представления любых аргументов командной строки.

Дополнительная информация о public static void main и его связи с ServletContainerInitializer:

https://www.logicbig.com/tutorials/spring-framework/spring-boot/boot-serve-dynamic.html

Почему SpringBootServletInitializer должен быть разделен на подклассы?Для создания развертываемого файла войны мы должны предоставить подкласс SpringBootServletInitializer и переопределить его метод configure.

... Основной класс расширяет SpringBootServletInitializer, который, в свою очередь, расширяет WebApplicationInitializer.WebApplicationInitializer основан на концепции сервлета 3.0 ServletContainerInitializer. Назначение этого расширения: WebApplicationInitializer устанавливает контекст сервлета и дополнительно просит подкласс настроить источник (класс, аннотированный @SpringBootApplication) SpringApplication, чтобы он мог вызывать SpringApplication # run () с допустимымsource и может выполнять автоматическую настройку, проводку bean-компонента уровня приложения и т. д. Эта схема необходима только в том случае, если приложение развернуто в контейнере сервлета в виде файла war. В веб-контейнере, конечно, «основной метод» не может быть выполненкак это происходит в автономном взорванном приложении или исполняемом jar или war.

...