Как среда исполнения Java находит мой основной класс? - PullRequest
0 голосов
/ 27 июня 2019

Я учусь Spring Boot.Я сделал простой проект Spring Boot, который может выводить строку приветствия в http://localhost:8080/welcome

. Я использую Maven для создания своего проекта, который будет выводить файл jar.Чтобы запустить мое весеннее загрузочное приложение, я использую команду, как показано ниже

java -jar my-springboot-app.jar

Мой вопрос:

Как Java достаточно умен, чтобы найти мой основной класс и его основной метод (например,средство запуска приложений)?

Я проверил файл JAR и просмотрел эти файлы BOOT-INF и META-INF и не смог найти никаких подсказок.

Работает ли среда загрузочной пружины (@SpringBootApplication) или maven автоматическисделать магию для меня?

Ответы [ 2 ]

2 голосов
/ 27 июня 2019

Java-классы выполняются в более широком контексте, вы запускаете java -jar somejar.jar соответствующий класс будет выбран в манифесте файла .jar .

@ SpringBootApplication будет иметь компонентcancan, включающий автоматическую настройку (автоматическое подключение)

componentscan - для идентификации всех контроллеров, классов обслуживания и конфигурации в пакете.

1 голос
/ 27 июня 2019

В случае банки с пружинной загрузкой все немного сложнее, чем в обычной банке.Главным образом потому, что 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, чтобы указать правильный класс.

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