Коротко — потому что в вашей сборке/конфигурации нет «встроенного» сервера или вы его отключили. Точных причин может быть несколько. Ниже чек‑лист того, что проверить и как исправить.
1) Проверьте зависимости
- Для Tomcat встраивается автоматически, если у вас есть зависимость spring-boot-starter-web:
- Maven: spring-boot-starter-web (в него входит spring-boot-starter-tomcat).
- Если вы исключали tomcat в pom (scope provided или <exclusions>) — встроенный Tomcat не попадёт в jar и не стартует.
- Если вы используете WebFlux (spring-boot-starter-webflux), то по умолчанию используется Netty, а не Tomcat.
2) Проверьте packaging и плагин
- Для запуска «fat jar» нужно правильно упаковать приложение. Обычно используется spring-boot-maven-plugin (или Gradle equivalent) и packaging = jar.
- Если вы собрали WAR (packaging = war) и пометили tomcat как provided (для деплоя в контейнер), то при запуске как JAR встроенного Tomcat не будет.
- Убедитесь, что запускаете именно исполняемый jar: java -jar target/app.jar. Если просто берёте классы и запускаете main через classpath, классы загрузчика Spring Boot могут быть не те.
3) Наличие main‑метода
- В главном классе должен быть public static void main(String[] args) { SpringApplication.run(App.class, args); }
- Аннотация @SpringBootApplication сама по себе не запускает приложение — нужен main.
4) Не отключён ли web‑контекст
- Проверьте, не стоит ли где-то spring.main.web-application-type=NONE (в application.properties/yml) или вы не вызываете SpringApplicationBuilder.withWebApplicationType(NONE).
- Если приложение распознано как не‑web (например, нет зависимости web), сервер не стартует.
5) Посмотрите логи запуска
- При нормальном старте Boot логгирует строки вроде "Tomcat started on port(s): 8080 (http)" или "Started X in ...".
- Если порт занят — будет ошибка и stacktrace. Если вовсе нет сообщений про Tomcat — скорее всего web starter отсутствует или web тип выключен.
6) Примеры для проверки
- Main класс:
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
@SpringBootApplication
public class Application { ... } // в одном файле или как класс с main
- POM (минимум):
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
Если после проверок Tomcat всё ещё не стартует — пришлите:
- pom.xml или build.gradle,
- код главного класса (с main),
- консольный вывод при запуске jar
и я подскажу конкретно для вашего случая.