เหตุใดแอพ Spring Boot ของฉันจึงปิดเครื่องทันทีหลังจากเริ่มต้น?


164

นี่คือรหัส Spring Boot แรกของฉัน น่าเสียดายที่มันปิดตัวลงเสมอ ฉันคาดหวังให้มันทำงานอย่างต่อเนื่องเพื่อให้เว็บไคลเอ็นต์ของฉันสามารถรับข้อมูลบางอย่างจากเบราว์เซอร์

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) ดังนั้นจึงไม่ใช่ webapp มันควรเป็นค่าเริ่มต้นเป็นค่าที่ขึ้นอยู่กับ classpath ของคุณดังนั้นดูเหมือนว่าจะถูกตั้งค่าหรือผิดวิธี บางทีคุณอาจจะมีapplication.propertiesENV หรือ ENV ไม่แสดงบ้าง
Dave Syer

คุณพูดถูก ApplicationContext ของฉันไม่ถูกต้อง ฉันไม่มีไฟล์ application.properties ฉันจะทำให้มันรัน ApplicationContext ที่ถูกต้องได้อย่างไร อาจเป็นเว็บ ApplicationContext หรือ
johnsam

มาลองสร้างโครงสร้างให้ง่ายขึ้น คุณสามารถลบการอ้างอิงทั้งหมดยกเว้น spring-boot-starter-web แล้วเรียกใช้ด้วย--debugบรรทัดคำสั่งและโพสต์บันทึกกลับมาที่นี่ได้ไหม
Dave Syer

เดฟฉันอัปเดตโพสต์ดั้งเดิมของฉันเนื่องจากคำตอบยาวเกินไป
johnsam

คำตอบ:


346

การแก้ไข: แอปไม่ได้เป็นเว็บแอปเนื่องจากไม่มีคอนเทนเนอร์ที่ฝัง (เช่น Tomcat) ใน classpath เพิ่มหนึ่งคงที่ หากคุณใช้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

ไม่ว่า เพียงแค่ใน classpath
Dave Syer

31

นี่คือวิธีที่คุณสามารถแก้ไขได้:

  1. ตรวจสอบว่าคุณไม่มีการพึ่งพา Spring-boot-starter-web ในไฟล์ pom.xml ของคุณหรือไม่ ในการทำให้ไฟล์ pom.xml ของคุณถูกต้องให้ใช้ลิงค์นี้start.spring.io

  2. หากคุณมีปัญหาในการพึ่งพา แต่ยังคงประสบปัญหาเป็นไปได้สูงที่มีขวด Tomcat ฝังอยู่ เพื่อยืนยันสิ่งนี้ให้รัน 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)

หากมีข้อความดังกล่าวอยู่ให้ล้าง repo Maven ในพื้นที่แล้วลองใหม่

mvn dependency:purge-local-repository


เมื่อไหที่ต้องการหายไป dispatcherServlet จะไม่เริ่มทำงาน ดังนั้นวิธีการแก้ปัญหาข้างต้นใช้งานได้สำหรับฉัน
user3029620

30

ฉันมีปัญหาเดียวกัน แต่เมื่อฉันลบ

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

มันเริ่มทำงานอีกครั้ง


แอปพลิเคชันของฉันเริ่มทำงานหลังจากที่ฉันเพิ่มการอ้างอิง Tomcat นี้
georgiana_e

1
@georgiana_e แอปพลิเคชันของฉันเริ่มทำงานหลังจากฉันลบการอ้างอิง Tomcat: D เกิดอะไรขึ้น ??
ดาเรีย

: D sam as me @Daria
RockOnGom

ฉันแทนที่ที่ฝังตัวคอนเทนเนอร์เริ่มต้นด้วย 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);
      }
    }

เห็นได้ชัดว่าการลองด้วยบล็อกทรัพยากรจะปิดบริบทหลังจากเริ่มต้นแอปพลิเคชันซึ่งจะส่งผลให้แอปพลิเคชันออกจากสถานะ 0 นี่เป็นกรณีที่ข้อผิดพลาดการรั่วไหลของทรัพยากรที่รายงานโดยการวิเคราะห์แบบคงที่ snarqube


3

ด้วย gradle ฉันแทนที่บรรทัดนี้ที่ไฟล์ build.gradle.kts ภายในบล็อกการอ้างอิง

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

ด้วยสิ่งนี้

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

และทำงานได้ดี


2

ฉันคิดว่าคำตอบที่ถูกต้องคือทำไมแอพพลิเคชั่นเว็บ Spring Spring ปิดทันทีหลังจากเริ่มทำงาน เกี่ยวกับตัวเริ่มต้น Tomcat ไม่ได้ถูกตั้งค่าและถ้าตั้งค่าและทำงานผ่าน IDE ขอบเขตที่ให้ไว้ควรถูกคอมเม้นท์ ขอบเขตไม่ได้สร้างปัญหาขณะทำงานผ่านคำสั่ง ฉันสงสัยว่าทำไม.

อย่างไรก็ตามเพิ่งเพิ่มความคิดเพิ่มเติมของฉัน


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

ใช้งานได้กับ 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>

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>

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ไปที่ Starter

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

}

0

ในกรณีของฉันฉันแล้วก็พึ่งพาผู้เชี่ยวชาญที่ 'springboot เริ่มต้นเว็บและโครงการนี้จะเริ่มต้นที่ดีได้โดยไม่ต้องหยุดอัตโนมัติเมื่อฉันใช้มันเป็น app springboot จากภายในของ IDE อย่างไรก็ตามเมื่อฉันปรับใช้กับ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.