Warum wird meine Spring Boot App immer sofort nach dem Start heruntergefahren?

163

Dies ist mein erster Spring Boot Code. Leider wird es immer heruntergefahren. Ich hatte erwartet, dass es kontinuierlich ausgeführt wird, damit mein Webclient einige Daten vom Browser abrufen kann.

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

Bitte beraten.

Vielen Dank

PS build.gradle ist der Fehler.

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

Sobald ich die obige Zeile fett abgenommen habe, funktioniert alles. Mein Anwendungskontext ist jetzt korrekt. Danke Dave

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: 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]]
Johnsam
quelle
Verwenden Sie Maven oder Gradle?
Romain Moreau
1
Dein ApplicationContextTyp ist falsch ( AnnotationConfigApplicationContext), es handelt sich also nicht um eine Webanwendung. Es sollte standardmäßig ein Wert verwendet werden, der von Ihrem Klassenpfad abhängt. Es sieht also so aus, als würde dieser Wert falsch eingestellt oder voreingestellt. Vielleicht haben Sie eine application.propertiesoder eine ENV-Variable, die Sie nicht anzeigen?
Dave Syer
Du hast recht. Mein ApplicationContext ist falsch. Ich habe keine application.properties-Datei. Wie kann ich dafür sorgen, dass der richtige ApplicationContext ausgeführt wird? Vielleicht ein Web ApplicationContext?
Johnsam
Versuchen wir, den Build zu vereinfachen. Können Sie alle Abhängigkeiten außer Spring-Boot-Starter-Web entfernen und dann --debugin der Befehlszeile ausführen und die Protokolle bitte hierher zurückschicken?
Dave Syer
Dave, ich habe meinen ursprünglichen Beitrag aktualisiert, da die Antworten zu lang waren.
Johnsam

Antworten:

344

Lösung: Die App ist keine Webanwendung, da der Klassenpfad keinen eingebetteten Container (z. B. Tomcat) enthält. Durch Hinzufügen eines wurde das Problem behoben. Wenn Sie Maven verwenden , fügen Sie dies hinzu in pom.xml:

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

Für Gradle ( build.gradle) sieht es so aus

dependencies {
    compile 'org.springframework.boot:spring-boot-starter-web'
}
Dave Syer
quelle
Wie machst du das ?
Maxime
2
Ausgezeichnet, das hat mir gefehlt!
Taobitz
5
Ich habe eine einfache Java-Anwendung. Warum müssen wir diese Abhängigkeit hinzufügen?
AMAN KUMAR
Bitte erwähnen Sie, dass diese Abhängigkeit die erste sein muss.
Cosmin Oprea
Das tut es aber nicht. Nur auf dem Klassenweg.
Dave Syer
31

So können Sie das Problem beheben:

  1. Überprüfen Sie, ob Sie in Ihrer pom.xml-Datei keine Abhängigkeit vom Spring-Boot-Starter-Web haben. Verwenden Sie diesen Link start.spring.io, um Ihre pom.xml-Datei richtig zu machen

  2. Wenn Sie über die Abhängigkeit hinausgehen, das Problem jedoch weiterhin besteht, ist es sehr wahrscheinlich, dass Ihre eingebetteten Tomcat-Gläser vorhanden sind. Um dies zu bestätigen, führen Sie maven build im Debug-Modus aus -

mvn spring-boot:run --debug

und suchen Sie nach Nachrichten wie -

[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)

Wenn solche Nachrichten vorhanden sind, löschen Sie Ihr lokales Maven-Repo und versuchen Sie es erneut -

mvn dependency:purge-local-repository

chatsap
quelle
Sobald die erforderlichen Gläser fehlen, wird das dispatcherServlet nicht gestartet. Die obige Lösung funktioniert also für mich.
user3029620
30

Ich hatte das gleiche Problem, aber als ich entfernte

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

es fing wieder an zu arbeiten.

N. berouain
quelle
Meine Anwendung begann zu funktionieren, nachdem ich diese Tomcat-Abhängigkeit hinzugefügt hatte.
georgiana_e
1
@georgiana_e Meine Anwendung begann zu funktionieren, nachdem ich die Tomcat-Abhängigkeit entfernt hatte: D Was ist los?
Daria
: D sam wie ich @Daria.
RockOnGom
Ich habe meinen standardmäßigen eingebetteten Container durch Jetty ersetzt , um den Fehler zu beheben. Scheint, als wären meine Tomcat-JARs defekt und eine .m2-Bereinigung war erforderlich.
CᴴᴀZ
7

Vielleicht passt es nicht zu Ihrem Code, aber ich habe herausgefunden, ob Sie ein Code-Snippet wie dieses haben:

@SpringBootApplication
public class SpringBootApacheKafkaApplication {

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

Entfernen Sie dann einfach die Methode close (). Das hat mein Problem behoben! Vielleicht kann ich jemandem dabei helfen

Guchelkaben
quelle
3

In meinem Fall wurde das Problem eingeführt, als ich einen statischen Analysefehler behoben habe, bei dem der Rückgabewert einer Methode nicht verwendet wurde.

Alter Arbeitscode in meiner Application.java war:

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

Neuer Code, der das Problem einführte, war:

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

Offensichtlich schließt der Versuch mit Ressourcenblock den Kontext nach dem Starten der Anwendung, was dazu führt, dass die Anwendung mit dem Status 0 beendet wird. In diesem Fall sollte der durch die statische Analyse von snarqube gemeldete Ressourcenleckfehler ignoriert werden.

Farrukh Najmi
quelle
3

Mit gradle habe ich diese Zeile in der Datei build.gradle.kts im Abhängigkeitsblock ersetzt

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

mit diesem

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

und funktioniert gut.

Pedro Muniz
quelle
2

Ich denke, die richtige Antwort war: Warum wird die Spring Boot-Webanwendung sofort nach dem Start geschlossen? Wenn der Starter-Tomcat nicht festgelegt ist und wenn er festgelegt ist und über die IDE ausgeführt wird, sollte der bereitgestellte Bereich kommentiert werden. Der Bereich verursacht kein Problem, während der Befehl ausgeführt wird. Ich wundere mich warum.

Sowieso fügte gerade meine zusätzlichen Gedanken hinzu.

Ajay Menon
quelle
2

Nur eine andere Möglichkeit,

ich ersetzte

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

mit

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

und es begann ohne Probleme

Mohammed Rafeeq
quelle
1

Diese Arbeit mit Spring Boot 2.0.0

ersetzen

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

mit

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

In meinem Fall habe ich dieses Problem wie folgt behoben: -

  1. Zuerst habe ich entfernt (Apache) C:\Users\myuserId\.m2\repository\org\apache

  2. Ich habe unten Abhängigkeiten in meine pom.xmlDatei eingefügt

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
  3. Ich habe den Standard-Socket geändert, indem ich die folgenden Zeilen in die Ressourcendatei eingefügt habe ..\yourprojectfolder\src\main\resourcesand\application.properties(ich habe diese Datei manuell erstellt).

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

    Dafür habe ich unten Block in meinem hinzugefügt pom.xmlunter <build>Abschnitt.

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

Meine endgültige pom.xmlDatei sieht aus wie

<?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>
Abhijit Pritam Dutta
quelle
0

Wenn Sie Ihren Frühling nicht zu einer Webanwendung machen möchten, fügen Sie einfach @EnableAsyncoder @EnableSchedulingzu Ihrem Starter hinzu

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

}
deFreitas
quelle
0

In meinem Fall hatte ich bereits die Maven-Abhängigkeit von 'Spring-Boot-Starter-Web' und das Projekt würde ohne automatisches Stoppen gut starten, wenn ich es als Springboot-App aus der IDE heraus ausführen würde . Wenn ich es jedoch auf K8s bereitstelle , wird die App sofort gestartet und automatisch gestoppt. Also habe ich meine Haupt-App-Klasse geändert, um SpringBootServletInitializer zu erweitern, und dies scheint das automatische Stoppen behoben zu haben.

@SpringBootApplication public class MyApp extends SpringBootServletInitializer {  public static void main(String[] args) {
SpringApplication.run(MyApp.class, args);  }}
abdel
quelle