Por que meu aplicativo Spring Boot sempre é desligado imediatamente após o início?

164

Este é o meu primeiro código de inicialização da primavera. Infelizmente, sempre é desligado. Eu esperava que funcionasse continuamente, para que meu cliente da Web pudesse obter alguns dados do 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 informar.

obrigado

PS build.gradle é a falha.

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

Uma vez que tirei a linha acima em negrito, tudo funciona. O contexto do meu aplicativo agora está correto. Graças 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
fonte
Você está usando Maven ou Gradle?
Romain Moreau
1
Você ApplicationContexté do tipo errado ( AnnotationConfigApplicationContext), portanto não é um aplicativo da web. Ele deve ter como padrão um valor que depende do seu caminho de classe; portanto, parece que ele está sendo definido ou padronizado da maneira errada. Talvez você tenha uma application.propertiesvar ou ENV que não está mostrando?
Dave Syer
Você está certo. Meu ApplicationContext está incorreto. Não tenho um arquivo application.properties. Como faço para executar o ApplicationContext correto? Talvez um ApplicationContext da web?
johnsam
Vamos tentar simplificar a compilação. Você pode remover todas as dependências, exceto spring-boot-starter-web, e depois executar --debugna linha de comando e postar os logs aqui, por favor?
Dave Syer
Dave, atualizei meu post original, pois as respostas eram muito longas.
johnsam

Respostas:

345

Resolução: o aplicativo não é um aplicativo da Web porque não possui um contêiner incorporado (por exemplo, Tomcat) no caminho de classe. Adicionando um corrigido. Se você estiver usando o Maven , adicione-o em pom.xml:

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

Para Gradle ( build.gradle), parece

dependencies {
    compile 'org.springframework.boot:spring-boot-starter-web'
}
Dave Syer
fonte
Como você faz isso ?
precisa saber é
2
Excelente, era isso que eu estava perdendo!
Taobitz 3/02
5
Eu tenho um aplicativo java simples, então por que precisamos adicionar essa dependência?
AMAN KUMAR
Por favor, mencione que essa dependência precisa ser a primeira.
Cosmin Oprea 29/03
Isso não acontece. Apenas no caminho da classe.
Dave Syer 29/03
31

Aqui está como você pode corrigi-lo:

  1. Verifique se você não tem dependência do spring-boot-starter-web no seu arquivo pom.xml. Para corrigir o arquivo pom.xml, use este link start.spring.io

  2. Se você tem dependência acima, mas ainda enfrenta o problema, é altamente possível que seus jars tomcat incorporados estejam presentes. Para confirmar isso, execute o maven build no modo de depuração -

mvn spring-boot:run --debug

e procure mensagens 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)

Se essas mensagens estiverem presentes, limpe seu repositório de inventário local e tente novamente -

mvn dependency:purge-local-repository

chatsap
fonte
depois que os jars necessários estiverem ausentes, o dispatcherServlet não será iniciado. Portanto, a solução acima funciona para mim.
user3029620
30

Eu tive o mesmo problema, mas quando removi

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

começou a funcionar novamente.

N. berouain
fonte
Meu aplicativo começou a funcionar depois de adicionar essa dependência do tomcat.
georgiana_e
1
@georgiana_e Meu aplicativo começou a funcionar depois que eu removi a dependência do tomcat: D O que está acontecendo?
Daria
: D sam como eu @Daria.
RockOnGom 2/11
Substituí meu Embedded Container padrão pelo Jetty para corrigir o erro. Parece que meus JARs do Tomcat foram quebrados e foi necessária uma limpeza de .m2.
CᴴᴀZ
7

Talvez não se ajuste ao seu código, mas descobri se você tem um trecho de código como este:

@SpringBootApplication
public class SpringBootApacheKafkaApplication {

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

em seguida, remova o método close (). Corrigido o meu problema! Talvez eu possa ajudar alguém com isso

Guchelkaben
fonte
3

No meu caso, o problema foi introduzido quando corrigi um erro de análise estática de que o valor de retorno de um método não era usado.

O código de trabalho antigo no meu Application.java era:

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

O novo código que introduziu o problema foi:

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

Obviamente, a tentativa com o bloco de recursos fechará o contexto após iniciar o aplicativo, o que resultará na saída do aplicativo com o status 0. Este foi um caso em que o erro de vazamento de recurso relatado pela análise estática do snarqube deve ser ignorado.

Farrukh Najmi
fonte
3

Com gradle, substituí esta linha no arquivo build.gradle.kts dentro do bloco de dependências

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

com isso

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

e funciona bem.

Pedro Muniz
fonte
2

Acho que a resposta certa foi: Por que o aplicativo Web Spring Boot fecha imediatamente após o início? sobre o fato de o starter-tomcat não estar definido e, se configurado e executando através do IDE, o escopo fornecido deve ser comentado. O escopo não cria um problema ao executar o comando. Eu quero saber porque.

Enfim, apenas adicionei meus pensamentos adicionais.

Ajay Menon
fonte
2

Apenas outra possibilidade,

Eu troquei

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

com

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

e começou sem problemas

Mohammed Rafeeq
fonte
1

este trabalho com boot de primavera 2.0.0

substituir

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

com

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

No meu caso, eu corrigi esse problema como abaixo: -

  1. Primeiro eu removi (apache) C:\Users\myuserId\.m2\repository\org\apache

  2. Eu adicionei abaixo dependências no meu pom.xmlarquivo

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
  3. Alterei o soquete padrão adicionando linhas abaixo no arquivo de recursos ..\yourprojectfolder\src\main\resourcesand\application.properties(eu criei este arquivo manualmente)

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

    por isso adicionei abaixo o bloco na minha seção pom.xmlinferior <build>.

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

Meu pom.xmlarquivo 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
fonte
0

Se você não quiser tornar sua primavera um aplicativo da web, basta adicionar @EnableAsyncou @EnableSchedulingao seu Starter

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

}
deFreitas
fonte
0

no meu caso, eu já tinha a dependência maven de 'spring-boot-starter-web' e o projeto começaria bem sem parar automaticamente quando eu o executava como aplicativo springboot no IDE . no entanto, quando eu o implanto no K8s , o aplicativo inicia e pára automaticamente imediatamente. Então, modifiquei minha classe principal do aplicativo para estender o SpringBootServletInitializer e isso parece ter corrigido a parada automática.

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