В случае банки с пружинной загрузкой все немного сложнее, чем в обычной банке.Главным образом потому, что jar приложения весенней загрузки на самом деле не является JAR (под jar я имею в виду нечто, что имеет манифестированные и скомпилированные классы).Обычные JAR-файлы могут быть «распознаны» и обработаны jvm, однако в Spring Boot есть также упакованные зависимости (взгляните на BOOT-INF/lib
), поэтому его jar-файлы находятся внутри JAR-файлов.Как это прочитать?
Получается, что у весенней загрузки всегда есть свой собственный главный класс, который действительно упоминается в MANIFEST.MF, и это реальная точка входа в упакованное приложение.
Файл манифеста содержит следующие строки:
Main-Class: org.springframework.boot.loader.JarLauncher
Start-Class: com.example.demo.DemoApplication
Main-Class
- точка входа в JVM.Этот класс, написанный весенними разработчиками, в основном делает две вещи: - Создает специальный загрузчик классов, чтобы иметь дело с природой весеннего загрузочного приложения.Благодаря этому специальному загрузчику классов приложение весенней загрузки, которое содержит «jars» в BOOT-INF/lib
, может обрабатываться, например, обычные загрузчики классов java, очевидно, не могут этого сделать.- Вызывает основной метод значения Start-Class
.Start-Class
является чем-то уникальным для приложений весенней загрузки, и он обозначает класс, который содержит «основной» метод - класс, который вы пишете, и класс, который вы считаете точкой входа :) Но с точки зрения весенней загрузкиинфраструктура - это просто класс, который имеет «обычный» метод main - метод, который можно вызывать с помощью отражения.
Теперь по вопросу «кто создает манифест»:
This MANIFEST.MFобычно создается автоматически с помощью плагинов, предлагаемых Spring Developers для систем сборки, таких как Maven или Gradle.
Например, плагин выглядит так:
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
Во время своей работы этот плагин идентифицирует вашосновной класс (com.example.demo.DemoApplication
в моем примере).Этот класс помечен аннотацией @SpringBootApplication
и имеет метод public static void main
.Однако, если вы поместите много таких классов, плагин, вероятно, не распознает правильный класс, поэтому вам нужно настроить свойства плагина в POM.xml, чтобы указать правильный класс.