为什么我的Spring Boot App在启动后会立即关闭?

时间:2014-03-13 13:27:19

标签: java spring spring-boot

这是我的第一个Spring Boot代码。不幸的是,它总是关闭。我希望它能够连续运行,以便我的Web客户端可以从浏览器中获取一些数据。

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

请指教。

由于

P.S。 build.gradle是错误。

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

一旦我以粗体取下上面的一行,一切正常。我的申请背景现在是正确的。谢谢戴夫

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: 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]]

20 个答案:

答案 0 :(得分:268)

解决方案:该应用程序不是webapp,因为它在类路径上没有嵌入式容器(例如Tomcat)。添加一个修复它。如果您使用 Maven ,请在pom.xml

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

对于 Gradle build.gradle),它看起来像

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

答案 1 :(得分:29)

以下是解决问题的方法:

  1. 检查pom.xml文件中是否没有依赖spring-boot-starter-web。要正确使用pom.xml文件,请使用此链接start.spring.io

  2. 如果您具有上述依赖性,但仍面临此问题,则很可能存在嵌入式tomcat jar。 要确认这一点,请在调试模式下运行maven build -

  3.   

    mvn spring-boot:run --debug

    并查找类似 -

    的消息
      

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

    如果存在此类消息,请清除当地的maven仓库并重试 -

      

    mvn dependency:purge-local-repository

答案 2 :(得分:21)

我有同样的问题,但当我删除

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

它又开始工作了。

答案 3 :(得分:3)

在我的情况下,当我修复静态分析错误时未引入方法的返回值时引入了问题。

我的Application.java中的旧工作代码是:

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

引入问题的新代码是:

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

显然,带有资源块的try将在启动应用程序后关闭上下文,这将导致应用程序以状态0退出。这是snarqube静态分析报告的资源泄漏错误应该被忽略的情况。

答案 4 :(得分:3)

也许它不适合你的代码,但我发现你是否有这样的代码片段:

@SpringBootApplication
public class SpringBootApacheKafkaApplication {

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

然后只需删除close()方法。这解决了我的问题!也许我可以帮助那个人

答案 5 :(得分:2)

我的应用程序是 Spring Boot 批处理,在 application.properties 中的以下行注释解决了问题

spring.main.web-application-type=none

答案 6 :(得分:1)

我认为正确答案是Why does Spring Boot web app close immediately after starting?关于未设置starter-tomcat的问题,如果设置并运行在IDE中,则应该注释掉提供的范围。在通过命令运行时,Scope不会产生问题。我想知道为什么。

无论如何只是添加了我的其他想法。

答案 7 :(得分:1)

在我的情况下,我解决了以下问题: -

  1. 首先我删除了(apache)C:\Users\myuserId\.m2\repository\org\apache

  2. 我在pom.xml文件

    中添加了以下依赖项
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    
  3. 我通过在资源文件..\yourprojectfolder\src\main\resourcesand\application.properties中添加以下行来更改默认套接字(我手动创建了此文件)

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

    为此我在pom.xml部分的<build>部分添加了下面的块。

      <build>
      .
      .
     <resources>
        <resource>
            <directory>src/main/resources</directory>
            <filtering>true</filtering>
        </resource>
    </resources>
       .
       .    
      </build>
    
  4. 我的最终pom.xml文件看起来像

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

答案 8 :(得分:1)

如果您具有循环弹簧注入的依赖项,则它会在没有警告的情况下失败,具体取决于日志记录的级别以及其他一些因素。

在这种情况下,A类注入B类,B类注入A类。

答案 9 :(得分:0)

如果您使用的是 Java 9 JPMS,将 spring-boot-starter-web 添加为依赖项是不够的,因为 tomcat-embed 库在运行时不可用,并且 spring boot 不会将该应用程序检测为 Web 应用程序。

要解决此问题,请通过以下指令添加到主应用程序

的 module-info.java 中,使 tomcat 嵌入可用
 requires org.apache.tomcat.embed.core;
 

答案 10 :(得分:0)

删除 Maven m2 文件夹(在 linux ~/.m2 上)并重建应用程序

答案 11 :(得分:0)

我遇到了这个问题,就我而言,它是由一个简单的笨拙错误引起的:我的班级有:

@SpringBootApplication
public class MyApplication implements ApplicationRunner {

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

public void run(ApplicationArguments args) throws Exception {

}

}

我删除了“implements ApplicationRunner”和 run 方法(由于复制粘贴错误而存在),然后它起作用了

答案 12 :(得分:0)

我使用Spring Boot开发工具在IntelliJIdea中初始化了一个新的SPring启动项目,但是在pom.xml中我只有依赖项

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

您还需要具有工件 spring-boot-starter-web 。只需将此依赖项添加到pom.xml

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

答案 13 :(得分:0)

我遇到了类似的问题。我只有以下入门Web软件包。

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

但这还不够。您还需要添加一个父项以获取其他必需的依赖项。

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.2.4.RELEASE</version>
    <relativePath/> <!-- lookup parent from repository -->
</parent>

答案 14 :(得分:0)

我在这里和其他地方都经过了解答,但仍然遇到问题。事实证明,(像op一样)我在kubernetes中运行,该应用程序运行良好,但是kubernetes出现了问题。

我忘记了基于我的端口环境变量启动我的应用程序。因此,kubernetes / helm告诉它可以在8443上运行并进行动态探测,但是它正在我的application.properties的其他端口(例如8123)上运行。

kubernetes事件(获取事件)显示实时探测失败,因此kubernetes每30秒左右杀死一次pod / app。

答案 15 :(得分:0)

在我的情况下,我已经对'spring-boot-starter-web'具有maven依赖性,并且当我在IDE中以springboot应用程序运行该项目时,它会自动启动而不会自动停止。但是,当我将其部署到 K8s 时,该应用程序将启动并立即自动停止。因此,我修改了我的主应用程序类以扩展SpringBootServletInitializer,这似乎已经解决了自动停止的问题。

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

答案 16 :(得分:0)

使用gradle,我在依赖关系块中的build.gradle.kts文件处替换了这一行

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

与此

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

工作正常。

答案 17 :(得分:0)

如果您不想让Spring成为Web应用程序,则只需将@EnableAsync@EnableScheduling添加到Starter中

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

}

答案 18 :(得分:0)

另一种可能性

我替换了

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

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

它开始没有任何问题

答案 19 :(得分:0)

这项工作与spring boot 2.0.0

替换

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

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