Perché la mia Spring Boot App si spegne sempre immediatamente dopo l'avvio?


164

Questo è il mio primo codice Spring Boot. Sfortunatamente, si spegne sempre. Mi aspettavo che funzionasse continuamente in modo che il mio client Web potesse ottenere alcuni dati dal browser.

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

Si prega di avvisare.

Grazie

PS build.gradle è l'errore.

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

Una volta che ho tolto la linea sopra in grassetto, tutto funziona. Il mio contesto di applicazione ora è corretto. Grazie 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]]

Stai usando Maven o Gradle?
Romain Moreau,

1
Il tuo ApplicationContextè il tipo sbagliato ( AnnotationConfigApplicationContext), quindi non è una webapp. Dovrebbe essere impostato automaticamente su un valore che dipende dal tuo percorso di classe, quindi sembra che sia impostato o impostato in modo errato nel modo sbagliato. Forse hai un application.propertiesvar o ENV che non stai mostrando?
Dave Syer,

Hai ragione. Il mio ApplicationContext non è corretto. Non ho un file application.properties. Come faccio a far funzionare il giusto ApplicationContext? Forse un Web ApplicationContext?
johnsam,

Proviamo a semplificare la compilazione. Riesci a rimuovere tutte le dipendenze tranne spring-boot-starter-web, quindi eseguirlo con --debugdalla riga di comando e postare i log qui, per favore?
Dave Syer,

Dave, ho aggiornato il mio post originale poiché le risposte erano troppo lunghe.
johnsam,

Risposte:


346

Risoluzione: l'app non è una webapp perché non ha un contenitore incorporato (ad es. Tomcat) nel percorso di classe. Aggiungendone uno riparato. Se stai usando Maven , aggiungi questo in pom.xml:

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

Per Gradle ( build.gradle) sembra

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

Come si fa a farlo ?
massimo

2
Eccellente questo era quello che mi mancava!
Taobitz,

5
Ho una semplice applicazione Java allora perché dobbiamo aggiungere questa dipendenza?
AMAN KUMAR,

Si noti che questa dipendenza deve essere la prima.
Cosmin Oprea,

Non lo fa però. Solo sul sentiero di classe.
Dave Syer,

31

Ecco come risolverlo:

  1. Controlla se non hai dipendenze da spring-boot-starter-web nel tuo file pom.xml. Per ottenere il file pom.xml corretto, utilizzare questo collegamento start.spring.io

  2. Se hai una dipendenza superiore, ma stai ancora affrontando il problema, è altamente possibile che siano presenti i vasi Tomcat incorporati. Per confermare ciò, esegui maven build in modalità debug -

mvn spring-boot:run --debug

e cerca messaggi come -

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

Se tali messaggi sono presenti, eliminare il repository maven locale e riprovare -

mvn dependency:purge-local-repository


quando mancano i vasetti richiesti, dispatcherServlet non si avvia. Quindi la soluzione sopra funziona per me.
user3029620

30

Ho avuto lo stesso problema ma quando l'ho rimosso

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

ha ripreso a funzionare.


La mia applicazione ha iniziato a funzionare dopo aver aggiunto questa dipendenza Tomcat.
georgiana_e

1
@georgiana_e La mia applicazione ha iniziato a funzionare dopo aver rimosso la dipendenza Tomcat: D Cosa sta succedendo ??
Daria,

: D sam come me @Daria.
RockOnGom,

Ho sostituito il mio contenitore incorporato predefinito con Jetty per correggere l'errore. Sembra che i miei JAR Tomcat fossero rotti e che fosse necessaria una purga .m2.
CᴴᴀZ,

7

Forse non si adatta al tuo codice ma ho scoperto se hai uno snippet di codice come questo:

@SpringBootApplication
public class SpringBootApacheKafkaApplication {

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

quindi basta rimuovere il metodo close (). Questo è stato risolto il mio problema! Forse posso aiutare qualcuno con quello


3

Nel mio caso il problema è stato introdotto quando ho corretto un errore di analisi statica che non è stato utilizzato il valore restituito di un metodo.

Il vecchio codice funzionante nel mio Application.java era:

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

Il nuovo codice che ha introdotto il problema era:

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

Ovviamente, il tentativo con blocco delle risorse chiuderà il contesto dopo aver avviato l'applicazione, il che provocherà la chiusura dell'applicazione con lo stato 0. Questo è stato un caso in cui l'errore di perdita di risorse riportato dall'analisi statica snarqube dovrebbe essere ignorato.


3

Con Gradle, ho sostituito questa riga nel file build.gradle.kts all'interno del blocco delle dipendenze

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

con questo

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

e funziona bene.



2

Solo un'altra possibilità,

Ho sostituito

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

con

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

ed è iniziato senza problemi


1

questo funziona con Spring Boot 2.0.0

sostituire

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

con

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

1

Nel mio caso ho risolto questo problema come di seguito: -

  1. Prima ho rimosso (apache) C:\Users\myuserId\.m2\repository\org\apache

  2. Ho aggiunto sotto le dipendenze nel mio pom.xmlfile

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
  3. Ho modificato il socket predefinito aggiungendo le righe seguenti nel file di risorse ..\yourprojectfolder\src\main\resourcesand\application.properties(ho creato manualmente questo file)

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

    per questo ho aggiunto sotto il blocco nella mia sezione pom.xmlsotto <build>.

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

Il mio pom.xmlfile finale sembra

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

Se non vuoi rendere la tua primavera un'applicazione web, aggiungi semplicemente @EnableAsynco @EnableSchedulingal tuo Starter

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

}

0

nel mio caso avevo già la dipendenza maven a "spring-boot-starter-web" e il progetto sarebbe partito bene senza auto-stop quando lo eseguivo come app springboot dall'IDE . tuttavia, quando lo distribuisco su K8 , l'app si avviava e si arrestava automaticamente. Quindi ho modificato la mia classe di app principale per estendere SpringBootServletInitializer e questo sembra aver risolto l'arresto automatico.

@SpringBootApplication public class MyApp extends SpringBootServletInitializer {  public static void main(String[] args) {
SpringApplication.run(MyApp.class, args);  }}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.