Tại sao ứng dụng Spring Boot của tôi luôn tắt ngay sau khi bắt đầu?


164

Đây là mã Spring Boot đầu tiên của tôi. Thật không may, nó luôn tắt. Tôi đã mong đợi nó chạy liên tục để khách hàng web của tôi có thể lấy một số dữ liệu từ trình duyệt.

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

Xin tư vấn.

Cảm ơn

PS build.gradle là lỗi.

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

Khi tôi đã in đậm dòng trên, mọi thứ đều hoạt động. Bối cảnh ứng dụng của tôi bây giờ là chính xác. Cảm ơn 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]]

Bạn đang sử dụng Maven hay Gradle?
Romain Moreau

1
Bạn ApplicationContextlà loại sai ( AnnotationConfigApplicationContext), vì vậy nó không phải là một ứng dụng web. Nó nên mặc định là một giá trị phụ thuộc vào đường dẫn lớp của bạn, vì vậy có vẻ như nó đang được đặt hoặc mặc định sai cách. Có lẽ bạn có một application.propertieshoặc một ENV var mà bạn không hiển thị?
Dave Syer

Bạn đúng rồi. ApplicationContext của tôi không chính xác. Tôi không có tệp application.properations. Làm thế nào để tôi làm cho nó chạy ApplicationContext đúng? Có lẽ một ApplicationContext web?
johnsam

Hãy thử và đơn giản hóa việc xây dựng. Bạn có thể loại bỏ tất cả các phụ thuộc ngoại trừ spring-boot-starter-web, và sau đó chạy với --debugdòng lệnh và gửi nhật ký trở lại đây, xin vui lòng?
Dave Syer

Dave, tôi đã cập nhật bài viết gốc của mình vì các phản hồi quá dài.
johnsam

Câu trả lời:


345

Giải pháp: ứng dụng không phải là một ứng dụng web vì nó không có thùng chứa nhúng (ví dụ Tomcat) trên đường dẫn lớp. Thêm một cái cố định nó. Nếu bạn đang sử dụng Maven , thì hãy thêm nó vào pom.xml:

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

Đối với Gradle ( build.gradle) có vẻ như

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

Làm thế nào để bạn làm điều đó ?
Maxime

2
Tuyệt vời đây là những gì tôi đã thiếu!
Taobitz

5
Tôi có một ứng dụng java đơn giản thì tại sao chúng ta cần thêm phụ thuộc này?
AMAN KUMAR

Xin đề cập rằng sự phụ thuộc này cần phải là người đầu tiên.
Cosmin Oprea

Nó không mặc dù. Chỉ cần trên đường dẫn.
Dave Syer

31

Đây là cách bạn có thể sửa nó:

  1. Kiểm tra xem bạn không có sự phụ thuộc vào spring-boot-starter-web trong tệp pom.xml của bạn. Để giúp bạn có tệp pom.xml đúng, hãy sử dụng liên kết này start.spring.io

  2. Nếu bạn có sự phụ thuộc ở trên, nhưng vẫn phải đối mặt với vấn đề, rất có khả năng các lọ tomcat nhúng của bạn có mặt. Để xác nhận điều này, hãy chạy maven build trong chế độ gỡ lỗi -

mvn spring-boot:run --debug

và tìm những tin nhắn như -

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

Nếu có tin nhắn như vậy, hãy thanh lọc repo maven địa phương của bạn và thử lại -

mvn dependency:purge-local-repository


một khi lọ yêu cầu bị thiếu, distatcherServlet không bắt đầu. Vì vậy, giải pháp trên làm việc cho tôi.
dùng3029620

30

Tôi đã có cùng một vấn đề nhưng khi tôi loại bỏ

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

nó bắt đầu hoạt động trở lại.


Ứng dụng của tôi bắt đầu hoạt động sau khi tôi thêm phụ thuộc tomcat này.
georgiana_e

1
@georgiana_e Ứng dụng của tôi bắt đầu hoạt động sau khi tôi loại bỏ sự phụ thuộc tomcat: D Chuyện gì đang xảy ra ??
Daria

: D sam như tôi @Daria.
RockOnGom

Tôi đã thay thế Container nhúng mặc định của mình bằng Jetty để sửa lỗi. Có vẻ như JAR Tomcat của tôi đã bị hỏng, và cần phải có một cuộc thanh trừng .m2.
CᴴᴀZ

7

Có thể nó không phù hợp với mã của bạn nhưng tôi phát hiện ra nếu bạn có một đoạn mã như thế này:

@SpringBootApplication
public class SpringBootApacheKafkaApplication {

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

sau đó chỉ cần loại bỏ phương thức close (). Điều đó đã khắc phục vấn đề của tôi! Có lẽ tôi có thể giúp ai đó với điều đó


3

Trong trường hợp của tôi, sự cố được đưa ra khi tôi sửa lỗi phân tích tĩnh rằng giá trị trả về của phương thức không được sử dụng.

Mã làm việc cũ trong Application.java của tôi là:

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

Mã mới giới thiệu vấn đề là:

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

Rõ ràng, việc thử với khối tài nguyên sẽ đóng bối cảnh sau khi khởi động ứng dụng sẽ dẫn đến việc ứng dụng thoát khỏi trạng thái 0. Đây là trường hợp lỗi rò rỉ tài nguyên được báo cáo bởi phân tích tĩnh snarqube nên được bỏ qua.


3

Với gradle, tôi đã thay thế dòng này tại tệp build.gradle.kts bên trong khối phụ thuộc

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

Với cái này

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

và hoạt động tốt.


2

Tôi nghĩ rằng câu trả lời đúng là tại sao ứng dụng web Spring Boot đóng lại ngay sau khi bắt đầu? về việc khởi động-tomcat không được thiết lập và nếu được đặt và chạy qua IDE, phạm vi được cung cấp sẽ được nhận xét. Phạm vi không tạo ra vấn đề trong khi chạy qua lệnh. Tôi tự hỏi tại sao.

Dù sao chỉ cần thêm những suy nghĩ bổ sung của tôi.


2

Chỉ là một khả năng khác,

tôi đã thay thế

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

với

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

và nó bắt đầu mà không có vấn đề gì


1

công việc này với spring boot 2.0.0

thay thế

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

với

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

1

Trong trường hợp của tôi, tôi đã khắc phục vấn đề này như dưới đây: -

  1. Đầu tiên tôi gỡ bỏ (apache) C:\Users\myuserId\.m2\repository\org\apache

  2. Tôi đã thêm phụ thuộc bên dưới trong pom.xmltập tin của tôi

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
  3. Tôi đã thay đổi ổ cắm mặc định bằng cách thêm các dòng bên dưới vào tệp tài nguyên ..\yourprojectfolder\src\main\resourcesand\application.properties(Tôi đã tạo thủ công tệp này)

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

    cho rằng tôi đã thêm khối bên dưới trong phần pom.xmldưới của tôi <build>.

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

pom.xmlTập tin cuối cùng của tôi trông giống như

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

Nếu bạn không muốn biến mùa xuân của mình thành một ứng dụng web thì chỉ cần thêm @EnableAsynchoặc @EnableSchedulingvào Starter của bạn

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

}

0

trong trường hợp của tôi, tôi đã có sự phụ thuộc maven vào 'spring-boot-starter-web' và dự án sẽ bắt đầu tốt mà không cần tự động dừng khi tôi chạy nó dưới dạng ứng dụng springboot từ trong IDE . tuy nhiên, khi tôi triển khai nó lên K8 , ứng dụng sẽ khởi động và tự động dừng ngay lập tức. Vì vậy, tôi đã sửa đổi lớp ứng dụng chính của mình để mở rộng SpringBootServletInitializer và điều này dường như đã sửa lỗi tự động dừng.

@SpringBootApplication public class MyApp extends SpringBootServletInitializer {  public static void main(String[] args) {
SpringApplication.run(MyApp.class, args);  }}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.