스프링 부트 앱이 시작한 직후에 항상 종료되는 이유는 무엇입니까?


164

이것은 첫 번째 스프링 부트 코드입니다. 불행히도 항상 종료됩니다. 웹 클라이언트가 브라우저에서 일부 데이터를 얻을 수 있도록 계속 실행될 것으로 기대했습니다.

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

조언 부탁드립니다.

감사

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

Maven 또는 Gradle을 사용하고 있습니까?
Romain Moreau

1
귀하 ApplicationContext의 유형이 잘못 AnnotationConfigApplicationContext되었으므로 ( ) 웹앱이 아닙니다. 기본적으로 클래스 경로에 따라 달라지는 값으로 설정되어 있으므로 잘못된 방식으로 설정되거나 기본값이 설정된 것처럼 보입니다. 어쩌면 당신이 application.properties보여주지 않는 ENV var 또는 하나가 있습니까?
Dave Syer

네 말이 맞아 내 ApplicationContext가 올바르지 않습니다. application.properties 파일이 없습니다. 올바른 ApplicationContext를 실행하려면 어떻게해야합니까? 웹 응용 프로그램 컨텍스트일까요?
johnsam

빌드를 시도하고 단순화합시다. spring-boot-starter-web을 제외한 모든 종속성을 제거한 다음 --debug명령 줄에서 실행 하여 로그를 다시 게시 할 수 있습니까?
Dave Syer

Dave, 답변이 너무 길어서 원래 게시물을 업데이트했습니다.
johnsam

답변:


346

해결 : 클래스 경로에 내장 컨테이너 (예 : 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'
}

어떻게합니까?
maxime

2
이것은 내가 놓친 것입니다!
Taobitz

5
간단한 Java 응용 프로그램이 있는데이 종속성을 추가 해야하는 이유는 무엇입니까?
AMAN KUMAR

이 종속성은 첫 번째 종속성이어야합니다.
Cosmin Oprea

하지만 그렇지 않습니다. 클래스 패스에서.
Dave Syer

31

해결 방법은 다음과 같습니다.

  1. pom.xml 파일에서 spring-boot-starter-web에 의존하지 않는지 확인하십시오. pom.xml 파일을 바로 얻으려면 start.spring.io 링크를 사용하십시오.

  2. 위의 종속성이 있지만 여전히 문제가 발생하면 내장 된 Tomcat jar가 존재할 가능성이 큽니다. 이를 확인하려면 디버그 모드에서 maven build를 실행하십시오.

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


필요한 jar이 없으면 dispatcherServlet이 시작되지 않습니다. 따라서 위의 솔루션이 저에게 효과적입니다.
user3029620

30

나는 같은 문제가 있었지만 제거했을 때

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

다시 작동하기 시작했습니다.


이 바람둥이 의존성을 추가 한 후 응용 프로그램이 작동하기 시작했습니다.
georgiana_e

1
@georgiana_e 바람둥이 의존성을 제거한 후 응용 프로그램이 작동하기 시작했습니다. : D 무슨 일입니까 ??
Daria

: D sam @Daria.
RockOnGom

오류를 해결하기 위해 기본 Embedded Container를 Jetty 로 교체했습니다 . 내 Tomcat JAR이 깨져서 .m2 제거가 필요한 것 같습니다.
CᴴᴀZ

7

어쩌면 코드에 맞지 않지만 다음과 같은 코드 스 니펫이 있는지 확인했습니다.

@SpringBootApplication
public class SpringBootApacheKafkaApplication {

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

그런 다음 close () 메소드를 제거하십시오. 문제가 해결되었습니다! 어쩌면 내가 그 사람을 도울 수 있습니다


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 with resource 블록은 응용 프로그램을 시작한 후 컨텍스트를 닫아 응용 프로그램을 상태 0으로 종료합니다. 이는 snarqube 정적 분석에 의해보고 된 자원 누수 오류를 무시해야하는 경우입니다.


3

gradle을 사용하여 dependencies 블록 내의 build.gradle.kts 파일 에서이 줄을 바꿨습니다.

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

이것으로

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

잘 작동합니다.



2

또 다른 가능성,

나는 바꿨다

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

문제없이 시작되었습니다


1

이 봄 부팅 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>

1

내 경우에는 다음과 같이이 문제를 해결했습니다.

  1. 먼저 제거했습니다 (아파치) 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>

내 최종 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>

0

스프링을 웹 애플리케이션으로 만들고 싶지 않다면 스타터에 추가 @EnableAsync하거나 @EnableScheduling시작하십시오.

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

}

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);  }}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.