Почему при запуске собранного Spring-приложения в виде JAR встроенный Tomcat не стартует?

Изучаю основы spring и написал простой код: <br/> <pre><code class="java">@SpringBootApplication
  • 13 апреля 2026 г. 23:01
Ответы на вопрос 2
Коротко — потому что в вашей сборке/конфигурации нет «встроенного» сервера или вы его отключили. Точных причин может быть несколько. Ниже чек‑лист того, что проверить и как исправить.

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

и я подскажу конкретно для вашего случая.
<code>compileOnly</code> — это "не включать в jar". IDEA при запуске сама добавляет такие зависимости в classpath, поэтому там работает. Убери эту строчку — <code>spring-boot-starter-web</code> уже тянет Tomcat. <br/> <br/> p.s. и <code>SpringApplication.run(main.class)</code> без args — не критично, но обычно передают args
Похожие вопросы