¿Por qué mi aplicación Spring Boot siempre se cierra inmediatamente después de comenzar?

164

Este es mi primer código Spring Boot. Desafortunadamente, siempre se apaga. Esperaba que se ejecute continuamente para que mi cliente web pueda obtener algunos datos del navegador.

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

Por favor avise.

Gracias

PS build.gradle es la culpa.

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

Una vez que quité la línea anterior en negrita, todo funciona. El contexto de mi aplicación ahora es correcto. Gracias 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
fuente
¿Estás usando Maven o Gradle?
Romain Moreau
1
Tu ApplicationContextes del tipo incorrecto ( AnnotationConfigApplicationContext), por lo que no es una aplicación web. Debe tener un valor predeterminado que depende de su classpath, por lo que parece que se está configurando o predeterminado de la manera incorrecta. ¿Quizás tienes una application.propertieso una ENV var que no estás mostrando?
Dave Syer
Tienes razón. Mi ApplicationContext es incorrecto. No tengo un archivo application.properties. ¿Cómo hago que se ejecute el ApplicationContext correcto? Tal vez un Web ApplicationContext?
johnsam
Probemos y simplifiquemos la compilación. ¿Puede eliminar todas las dependencias, excepto spring-boot-starter-web, y luego ejecutar con --debugen la línea de comandos y publicar los registros aquí, por favor?
Dave Syer
Dave, actualicé mi publicación original ya que las respuestas fueron demasiado largas.
johnsam

Respuestas:

345

Resolución: la aplicación no es una aplicación web porque no tiene un contenedor incrustado (por ejemplo, Tomcat) en el classpath. Agregar uno lo arregló. Si está utilizando Maven , agregue esto en pom.xml:

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

Para Gradle ( build.gradle) parece que

dependencies {
    compile 'org.springframework.boot:spring-boot-starter-web'
}
Dave Syer
fuente
Cómo haces eso ?
maxime
2
Excelente esto fue lo que me faltaba!
Taobitz
55
Tengo una aplicación java simple, ¿por qué necesitamos agregar esta dependencia?
AMAN KUMAR
Mencione que esta dependencia debe ser la primera.
Cosmin Oprea
Aunque no lo hace. Solo en el classpath.
Dave Syer
31

Aquí es cómo puedes solucionarlo:

  1. Compruebe si no tiene dependencia de spring-boot-starter-web en su archivo pom.xml. Para obtener el archivo pom.xml correcto, use este enlace start.spring.io

  2. Si tiene una dependencia superior, pero aún enfrenta el problema, es muy posible que sus tarros tomcat incrustados estén presentes. Para confirmar esto, ejecute Maven Build en modo de depuración -

mvn spring-boot:run --debug

y busca mensajes como:

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

Si tales mensajes están presentes, purgue su repositorio local de Maven e intente nuevamente:

mvn dependency:purge-local-repository

chatsap
fuente
una vez que faltan los frascos necesarios, dispatcherServlet no se inicia. Entonces la solución anterior funciona para mí.
user3029620
30

Tuve el mismo problema pero cuando eliminé

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

comenzó a funcionar de nuevo.

N. berouain
fuente
Mi aplicación comenzó a funcionar después de agregar esta dependencia de tomcat.
georgiana_e
1
@georgiana_e Mi aplicación comenzó a funcionar después de eliminar la dependencia de Tomcat: D ¿Qué está pasando?
Daria
: D sam como yo @Daria.
RockOnGom
Reemplacé mi contenedor integrado predeterminado con Jetty para corregir el error. Parece que mis JAR Tomcat estaban rotos y se necesitaba una purga de .m2.
CᴴᴀZ
7

Tal vez no se ajuste a su código, pero descubrí si tiene un fragmento de código como este:

@SpringBootApplication
public class SpringBootApacheKafkaApplication {

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

luego simplemente elimine el método close (). Eso solucionó mi problema! Tal vez pueda ayudar a alguien con eso

Guchelkaben
fuente
3

En mi caso, el problema se introdujo cuando solucioné un error de análisis estático de que no se usaba el valor de retorno de un método.

El antiguo código de trabajo en mi Application.java era:

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

El nuevo código que introdujo el problema fue:

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

Obviamente, el intento con el bloque de recursos cerrará el contexto después de iniciar la aplicación, lo que hará que la aplicación salga con el estado 0. Este fue un caso en el que el error de pérdida de recursos informado por el análisis estático snarqube debe ignorarse.

Farrukh Najmi
fuente
3

Con gradle, reemplacé esta línea en el archivo build.gradle.kts dentro del bloque de dependencias

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

con este

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

y funciona bien

Pedro Muniz
fuente
2

Solo otra posibilidad,

Reemplacé

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

y comenzó sin problemas

Mohammed Rafeeq
fuente
1

este trabajo con spring boot 2.0.0

reemplazar

  <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>
RAUL
fuente
1

En mi caso solucioné este problema como a continuación:

  1. Primero quité (apache) C:\Users\myuserId\.m2\repository\org\apache

  2. Agregué las siguientes dependencias en mi pom.xmlarchivo

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
  3. He cambiado el socket predeterminado agregando las siguientes líneas en el archivo de recursos ..\yourprojectfolder\src\main\resourcesand\application.properties(creé este archivo manualmente)

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

    para eso he agregado debajo del bloque en mi sección pom.xmlinferior <build>.

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

Mi pom.xmlarchivo final parece

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

Si no desea que su Spring sea una aplicación web, simplemente agregue @EnableAsynco @EnableSchedulinga su Starter

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

}
deFreitas
fuente
0

en mi caso ya tenía la dependencia maven de 'spring-boot-starter-web' y el proyecto comenzaría bien sin detenerse automáticamente cuando lo ejecuto como aplicación springboot desde el IDE . sin embargo, cuando lo implemento en K8 , la aplicación se iniciará y se detendrá automáticamente de inmediato. Así que modifiqué mi clase de aplicación principal para extender SpringBootServletInitializer y esto parece haber solucionado la detención automática.

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