Чому додаток Spring Boot завжди вимикається відразу після запуску?


164

Це мій перший код Spring Boot. На жаль, вона завжди вимикається. Я очікував, що вона буде працювати постійно, щоб мій веб-клієнт міг отримати деякі дані з браузера.

package hello;
import org.springframework.boot.*;
import org.springframework.boot.autoconfigure.*;
import org.springframework.stereotype.*;
import org.springframework.web.bind.annotation.*;

@Controller
@EnableAutoConfiguration
public class SampleController {

    @RequestMapping("/")
    @ResponseBody
    String home() {
        return "Hello World!";
    }

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


[@localhost initial]$ java -jar build/libs/gs-spring-boot-0.1.0.jar

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::            (v1.0.0.RC4)

2014-03-13 09:20:24.805  INFO 14650 --- [           main] hello.SampleController                   : Starting SampleController on localhost.localdomain with PID 14650 (/home/xxx/dev/gs-spring-boot/initial/build/libs/gs-spring-boot-0.1.0.jar started by xxx)
2014-03-13 09:20:25.002  INFO 14650 --- [           main] s.c.a.AnnotationConfigApplicationContext : Refreshing org.springframework.context.annotation.AnnotationConfigApplicationContext@b9eec: startup date [Thu Mar 13 09:20:24 EDT 2014]; root of context hierarchy
2014-03-13 09:20:28.833  INFO 14650 --- [           main] o.s.b.a.e.jmx.EndpointMBeanExporter      : Registering beans for JMX exposure on startup
2014-03-13 09:20:30.148  INFO 14650 --- [           main] o.s.c.support.DefaultLifecycleProcessor  : Starting beans in phase 0
2014-03-13 09:20:30.154  INFO 14650 --- [           main] o.s.b.a.e.jmx.EndpointMBeanExporter      : Located managed bean 'requestMappingEndpoint': registering with JMX server as MBean [org.springframework.boot:type=Endpoint,name=requestMappingEndpoint]
2014-03-13 09:20:30.316  INFO 14650 --- [           main] o.s.b.a.e.jmx.EndpointMBeanExporter      : Located managed bean 'environmentEndpoint': registering with JMX server as MBean [org.springframework.boot:type=Endpoint,name=environmentEndpoint]
2014-03-13 09:20:30.335  INFO 14650 --- [           main] o.s.b.a.e.jmx.EndpointMBeanExporter      : Located managed bean 'healthEndpoint': registering with JMX server as MBean [org.springframework.boot:type=Endpoint,name=healthEndpoint]
2014-03-13 09:20:30.351  INFO 14650 --- [           main] o.s.b.a.e.jmx.EndpointMBeanExporter      : Located managed bean 'beansEndpoint': registering with JMX server as MBean [org.springframework.boot:type=Endpoint,name=beansEndpoint]
2014-03-13 09:20:30.376  INFO 14650 --- [           main] o.s.b.a.e.jmx.EndpointMBeanExporter      : Located managed bean 'infoEndpoint': registering with JMX server as MBean [org.springframework.boot:type=Endpoint,name=infoEndpoint]
2014-03-13 09:20:30.400  INFO 14650 --- [           main] o.s.b.a.e.jmx.EndpointMBeanExporter      : Located managed bean 'metricsEndpoint': registering with JMX server as MBean [org.springframework.boot:type=Endpoint,name=metricsEndpoint]
2014-03-13 09:20:30.413  INFO 14650 --- [           main] o.s.b.a.e.jmx.EndpointMBeanExporter      : Located managed bean 'traceEndpoint': registering with JMX server as MBean [org.springframework.boot:type=Endpoint,name=traceEndpoint]
2014-03-13 09:20:30.428  INFO 14650 --- [           main] o.s.b.a.e.jmx.EndpointMBeanExporter      : Located managed bean 'dumpEndpoint': registering with JMX server as MBean [org.springframework.boot:type=Endpoint,name=dumpEndpoint]
2014-03-13 09:20:30.450  INFO 14650 --- [           main] o.s.b.a.e.jmx.EndpointMBeanExporter      : Located managed bean 'autoConfigurationAuditEndpoint': registering with JMX server as MBean [org.springframework.boot:type=Endpoint,name=autoConfigurationAuditEndpoint]
2014-03-13 09:20:30.465  INFO 14650 --- [           main] o.s.b.a.e.jmx.EndpointMBeanExporter      : Located managed bean 'shutdownEndpoint': registering with JMX server as MBean [org.springframework.boot:type=Endpoint,name=shutdownEndpoint]
2014-03-13 09:20:30.548  INFO 14650 --- [           main] o.s.b.a.e.jmx.EndpointMBeanExporter      : Located managed bean 'configurationPropertiesReportEndpoint': registering with JMX server as MBean [org.springframework.boot:type=Endpoint,name=configurationPropertiesReportEndpoint]
2014-03-13 09:20:30.589  INFO 14650 --- [           main] hello.SampleController                   : Started SampleController in 7.396 seconds (JVM running for 9.569)
2014-03-13 09:20:30.608  INFO 14650 --- [       Thread-2] s.c.a.AnnotationConfigApplicationContext : Closing org.springframework.context.annotation.AnnotationConfigApplicationContext@b9eec: startup date [Thu Mar 13 09:20:24 EDT 2014]; root of context hierarchy
2014-03-13 09:20:30.610  INFO 14650 --- [       Thread-2] o.s.c.support.DefaultLifecycleProcessor  : Stopping beans in phase 0
2014-03-13 09:20:30.624  INFO 14650 --- [       Thread-2] o.s.b.a.e.jmx.EndpointMBeanExporter      : Unregistering JMX-exposed beans on shutdown

Порадьте, будь ласка.

Дякую

PS build.gradle - це помилка.

dependencies {
    // tag::jetty[]
    compile("org.springframework.boot:spring-boot-starter-web") {
        **exclude module: "spring-boot-starter-tomcat"**
    }

Після того, як я зняв верхній рядок жирним шрифтом, все працює. Мій контекст заявки зараз правильний. Дякую, Дейв

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::            (v1.0.0.RC4)

2014-03-13 13:58:08.965  INFO 7307 --- [           main] hello.Application                        : Starting
 Application on  with PID 7307 (/ladev/home/xxx/dev/gs-spring-boot/initial/build/libs/gs-spring-boo
t-0.1.0.jar started by xxx)
2014-03-13 13:58:09.021  INFO 7307 --- [           main] ationConfigEmbeddedWebApplicationContext : Refreshi
ng org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@45490eb5: startup
 date [Thu Mar 13 13:58:09 MDT 2014]; root of context hierarchy
2014-03-13 13:58:09.653  INFO 7307 --- [           main] o.s.b.f.s.DefaultListableBeanFactory     : Overridi
ng bean definition for bean 'beanNameViewResolver': replacing [Root bean: class [null]; scope=; abstract=fal
se; lazyInit=false; autowireMode=3; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanNam
e=org.springframework.boot.actuate.autoconfigure.ErrorMvcAutoConfiguration$WhitelabelErrorViewConfiguration;
 factoryMethodName=beanNameViewResolver; initMethodName=null; destroyMethodName=(inferred); defined in class
 path resource [org/springframework/boot/actuate/autoconfigure/ErrorMvcAutoConfiguration$WhitelabelErrorView
Configuration.class]] with [Root bean: class [null]; scope=; abstract=false; lazyInit=false; autowireMode=3;
 dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=org.springframework.boot.autoconf
igure.web.WebMvcAutoConfiguration$WebMvcAutoConfigurationAdapter; factoryMethodName=beanNameViewResolver; in
itMethodName=null; destroyMethodName=(inferred); defined in class path resource [org/springframework/boot/au
toconfigure/web/WebMvcAutoConfiguration$WebMvcAutoConfigurationAdapter.class]]

Ви використовуєте Maven або Gradle?
Ромен Моро

1
Ваш ApplicationContextнеправильний тип ( AnnotationConfigApplicationContext), тому це не webapp. За замовчуванням воно повинно бути значенням, яке залежить від вашого класового шляху, тому воно виглядає так, що це встановлено або не встановлено за замовчуванням неправильний шлях. Можливо, у вас є application.propertiesENV або var, який не відображається?
Дейв Сайер

Ти правий. Мій ApplicationContext невірний. У мене немає файлу application.properties. Як змусити його запустити правильний ApplicationContext? Можливо веб-ApplicationContext?
johnsam

Спробуємо і спростити збірку. Чи можете ви видалити всі залежності, крім spring-boot-starter-web, а потім запустити з --debugкомандного рядка та опублікувати журнали тут, будь ласка?
Дейв Сайер

Дейв, я оновив свій початковий пост, оскільки відповіді були занадто довгими.
johnsam

Відповіді:


345

Дозвіл: додаток не є веб-сервером, оскільки на його шляху немає вбудованого контейнера (наприклад, Tomcat). Додавання одного виправлено. Якщо ви використовуєте Maven , додайте це в pom.xml:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

Для Gradle ( build.gradle) це виглядає так

dependencies {
    compile 'org.springframework.boot:spring-boot-starter-web'
}

Як ти це робиш ?
максим

2
Чудово це було те, чого мені не вистачало!
Taobitz

5
У мене є проста програма Java, то чому ми повинні додати цю залежність?
АМАН КУМАР

Зауважте, що ця залежність повинна бути першою.
Cosmin Oprea

Незважаючи на це. Просто на уроці.
Дейв Сайер

31

Ось як це можна виправити:

  1. Перевірте, чи у вас у файлі pom.xml немає залежності від spring-boot-starter-web. Щоб правильно отримати файл pom.xml, скористайтеся цим посиланням start.spring.io

  2. Якщо ви маєте вище залежність, але все ще стикаєтеся з проблемою, цілком можливо, що у ваших вбудованих баночках із томатними котками є. Щоб підтвердити це, запустіть Maven build в режимі налагодження -

mvn spring-boot:run --debug

і шукайте такі повідомлення, як -

[WARNING] error reading /Users/sparrowmac1/.m2/repository/org/apache/tomcat/embed/tomcat-embed-core/8.5.20/tomcat-embed-core-8.5.20.jar; invalid LOC header (bad signature) [WARNING] error reading /Users/sparrowmac1/.m2/repository/com/fasterxml/jackson/core/jackson-core/2.8.10/jackson-core-2.8.10.jar; invalid LOC header (bad signature)

Якщо такі повідомлення є, очистіть місцевий ревізор Maven і спробуйте ще раз -

mvn dependency:purge-local-repository


як тільки потрібні банки відсутні, диспетчерServlet не запускається. Тож вище рішення працює для мене.
користувач3029620

30

У мене була така ж проблема, але коли я її видалили

<dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-tomcat</artifactId>
        <scope>provided</scope>
</dependency>

вона знову почала працювати.


Моя програма почала працювати після того, як я додав цю залежність від tomcat.
georgiana_e

1
@georgiana_e Моя програма почала працювати після того, як я усунув залежність від tomcat: D Що відбувається ??
Дар’я

: D sam як я @Daria.
RockOnGom

Я замінив свій вбудований контейнер за замовчуванням на Jetty, щоб виправити помилку. Здається, мої JARs Tomcat були зламані, і потрібна була чистка .m2.
CᴴᴀZ

7

Можливо, він не підходить до вашого коду, але я дізнався, чи є у вас фрагмент коду, як це:

@SpringBootApplication
public class SpringBootApacheKafkaApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringBootApacheKafkaApplication.class,args).close();
    }
}

тоді просто видаліть метод close (). Це вирішило мою проблему! Можливо, я можу допомогти комусь у цьому


3

У моєму випадку проблема була введена, коли я виправляв статичну помилку аналізу, що повернене значення методу не використовувалось.

Старий робочий код у моєму Application.java:

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

Новий код, який ввів проблему:

    public static void main(String[] args) {        
      try (ConfigurableApplicationContext context = 
          SpringApplication.run(Application.class, args)) {
        LOG.trace("context: " + context);
      }
    }

Очевидно, що спробу з блоком ресурсів закриють контекст після запуску програми, що призведе до того, що додаток вийде зі статусом 0. Це був випадок, коли помилка витоку ресурсу, повідомлена статичним аналізом snarqube, повинна ігноруватися.


3

З gradle я замінив цей рядок у файлі build.gradle.kts всередині блоку залежностей

providedRuntime("org.springframework.boot:spring-boot-starter-tomcat")

з цим

compile("org.springframework.boot:spring-boot-starter-web")

і працює чудово.


2

Я думаю, що правильна відповідь була на те, чому веб-додаток Spring Boot закривається відразу після запуску? про те, що стартер-tomcat не встановлений, і якщо він встановлений та працює через IDE, надану область застосування слід коментувати. Область застосування не створює проблеми під час виконання команди. Цікаво, чому.

Все одно просто додав мої додаткові думки.


2

Просто інша можливість,

Я замінив

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter</artifactId>
    </dependency>

з

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

і воно почалося без жодних питань


1

ця робота з весняним завантаженням 2.0.0

замінити

  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-tomcat</artifactId>
    <scope>provided</scope>
        </dependency>

з

<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-core</artifactId>
<version>9.0.6</version>
    </dependency>

1

У моєму випадку я вирішив це питання, як показано нижче: -

  1. Спочатку я видалив (apache) C:\Users\myuserId\.m2\repository\org\apache

  2. Я додав нижче залежності у своєму pom.xmlфайлі

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
  3. Я змінив сокет за замовчуванням, додавши нижче рядки у файл ресурсу ..\yourprojectfolder\src\main\resourcesand\application.properties(я створив цей файл вручну)

     server.port=8099
     spring.profiles.active=@spring.profiles.active@

    для цього я додав нижче блоку в моїй pom.xmlпід <build>секцією.

      <build>
      .
      .
     <resources>
        <resource>
            <directory>src/main/resources</directory>
            <filtering>true</filtering>
        </resource>
    </resources>
       .
       .    
      </build>

Мій фінальний pom.xmlфайл виглядає так

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.bhaiti</groupId>
    <artifactId>spring-boot-rest</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>spring-boot-rest</name>
    <description>Welcome project for Spring Boot</description>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.0.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>       

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
        <resources>
            <resource>
                <directory>src/main/resources</directory>
                <filtering>true</filtering>
            </resource>
        </resources>

    </build>


</project>

0

Якщо ви не хочете робити свою весну веб-додатком, тоді просто додайте @EnableAsyncабо @EnableSchedulingв свій «Starter»

@EnableAsync
@SpringBootApplication
public class App {
    public static void main(String[] args) {
        SpringApplication.run(App.class, args);
    }

}

0

у моєму випадку я вже мав залежність від «весняного завантаження-стартера-веб», і проект запустився б нормально без автоматичної зупинки, коли я запускаю його як додаток Springboot з IDE . однак, коли я розгортаю його до K8s , додаток запускається та автоматично зупиняється. Тому я змінив свій основний клас додатків, щоб розширити SpringBootServletInitializer, і, здається, це виправлено автоматичне зупинення.

@SpringBootApplication public class MyApp extends SpringBootServletInitializer {  public static void main(String[] args) {
SpringApplication.run(MyApp.class, args);  }}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.