Pourquoi mon application Spring Boot s'arrête-t-elle toujours immédiatement après le démarrage?

164

Ceci est mon premier code Spring Boot. Malheureusement, il s'arrête toujours. Je m'attendais à ce qu'il fonctionne en continu afin que mon client Web puisse obtenir des données du navigateur.

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

S'il vous plaît donnez votre avis.

Merci

PS build.gradle est la faute.

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

Une fois que j'ai enlevé la ligne ci-dessus en gras, tout fonctionne. Mon contexte d'application est maintenant correct. Merci 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
la source
Utilisez-vous Maven ou Gradle?
Romain Moreau
1
Votre type ApplicationContextest incorrect ( AnnotationConfigApplicationContext), ce n'est donc pas une application Web. Il doit être défini par défaut sur une valeur qui dépend de votre chemin de classe, il semble donc que ce soit défini ou défini par défaut dans le mauvais sens. Peut-être avez-vous une application.propertiesou une variable ENV que vous ne montrez pas?
Dave Syer
Vous avez raison. Mon ApplicationContext est incorrect. Je n'ai pas de fichier application.properties. Comment faire exécuter le bon ApplicationContext? Peut-être un Web ApplicationContext?
johnsam
Essayons de simplifier la construction. Pouvez-vous supprimer toutes les dépendances sauf spring-boot-starter-web, puis exécuter avec --debugsur la ligne de commande et publier les journaux ici, s'il vous plaît?
Dave Syer
Dave, j'ai mis à jour mon message d'origine car les réponses étaient trop longues.
johnsam

Réponses:

346

Résolution: l'application n'est pas une webapp car elle n'a pas de conteneur intégré (par exemple Tomcat) sur le chemin de classe. L'ajout d'un l'a corrigé. Si vous utilisez Maven , ajoutez ceci dans pom.xml:

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

Pour Gradle ( build.gradle), cela ressemble à

dependencies {
    compile 'org.springframework.boot:spring-boot-starter-web'
}
Dave Syer
la source
Comment tu fais ça ?
maxime
2
Excellent c'était ce qui me manquait!
Taobitz
5
J'ai une application Java simple alors pourquoi devons-nous ajouter cette dépendance?
AMAN KUMAR
Veuillez mentionner que cette dépendance doit être la première.
Cosmin Oprea
Mais ce n'est pas le cas. Juste sur le chemin des classes.
Dave Syer
31

Voici comment vous pouvez y remédier:

  1. Vérifiez si vous n'avez pas de dépendance sur spring-boot-starter-web dans votre fichier pom.xml. Pour obtenir le bon fichier pom.xml, utilisez ce lien start.spring.io

  2. Si vous avez une dépendance ci-dessus, mais que vous êtes toujours confronté au problème, il est fort possible que vos jars tomcat intégrés soient présents. Pour confirmer cela, exécutez maven build en mode débogage -

mvn spring-boot:run --debug

et recherchez des messages comme -

[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 de tels messages sont présents, purgez votre référentiel maven local et réessayez -

mvn dependency:purge-local-repository

chatsap
la source
une fois que les fichiers jars requis sont manquants, dispatcherServlet ne démarre pas. Donc, la solution ci-dessus fonctionne pour moi.
user3029620
30

J'ai eu le même problème mais quand j'ai supprimé

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

il a recommencé à fonctionner.

N. berouain
la source
Mon application a commencé à fonctionner après avoir ajouté cette dépendance tomcat.
georgiana_e
1
@georgiana_e Mon application a commencé à fonctionner après avoir supprimé la dépendance tomcat: D Que se passe-t-il ??
Daria
: D sam comme moi @Daria.
RockOnGom
J'ai remplacé mon conteneur intégré par défaut par Jetty pour corriger l'erreur. Il semble que mes JAR Tomcat étaient cassés et qu'une purge .m2 était nécessaire.
CᴴᴀZ
7

Peut-être que cela ne correspond pas à votre code, mais j'ai découvert si vous avez un extrait de code comme celui-ci:

@SpringBootApplication
public class SpringBootApacheKafkaApplication {

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

puis supprimez simplement la méthode close (). Cela a résolu mon problème! Peut-être que je peux aider quelqu'un avec ça

Guchelkaben
la source
3

Dans mon cas, le problème a été introduit lorsque j'ai corrigé une erreur d'analyse statique indiquant que la valeur de retour d'une méthode n'était pas utilisée.

L'ancien code de travail dans mon Application.java était:

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

Le nouveau code qui a introduit le problème était:

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

Évidemment, le bloc try with resource fermera le contexte après le démarrage de l'application, ce qui entraînera la fermeture de l'application avec le statut 0. Il s'agissait d'un cas où l'erreur de fuite de ressources signalée par l'analyse statique snarqube devait être ignorée.

Farrukh Najmi
la source
3

Avec gradle, j'ai remplacé cette ligne dans le fichier build.gradle.kts à l'intérieur du bloc de dépendances

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

avec ça

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

et fonctionne très bien.

Pedro Muniz
la source
2

Juste une autre possibilité,

j'ai remplacé

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

avec

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

et ça a commencé sans aucun problème

Mohammed Rafeeq
la source
1

ce travail avec spring boot 2.0.0

remplacer

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

avec

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

Dans mon cas, j'ai résolu ce problème comme ci-dessous: -

  1. J'ai d'abord supprimé (apache) C:\Users\myuserId\.m2\repository\org\apache

  2. J'ai ajouté ci-dessous les dépendances dans mon pom.xmlfichier

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
  3. J'ai changé la socket par défaut en ajoutant des lignes ci-dessous dans le fichier de ressources ..\yourprojectfolder\src\main\resourcesand\application.properties(j'ai créé manuellement ce fichier)

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

    pour cela, j'ai ajouté le bloc ci-dessous dans ma section pom.xmlsous <build>.

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

Mon pom.xmlfichier final ressemble à

<?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
la source
0

Si vous ne voulez pas faire de votre printemps une application Web, ajoutez simplement @EnableAsyncou @EnableSchedulingà votre Starter

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

}
deFreitas
la source
0

dans mon cas, j'avais déjà la dépendance maven à 'spring-boot-starter-web' et le projet démarrerait correctement sans s'arrêter automatiquement lorsque je l'exécutais en tant qu'application springboot à partir de l'EDI . cependant, lorsque je le déploie sur K8 , l'application démarre et s'arrête automatiquement immédiatement. J'ai donc modifié ma classe d'application principale pour étendre SpringBootServletInitializer et cela semble avoir corrigé l'arrêt automatique.

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