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]]

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'
}

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


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.


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


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.


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.



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


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>

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>

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);
    }

}

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);  }}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.