Spring Boot không có máy chủ web


103

Tôi có một ứng dụng Spring Boot đơn giản nhận thông báo từ hàng đợi JMS và lưu một số dữ liệu vào tệp nhật ký, nhưng không cần máy chủ web. Có cách nào để khởi động Spring Boot mà không cần máy chủ web không?


3
Nếu bạn không cần web thì không bao gồm nó, khi không bao gồm máy chủ nhúng sẽ không khởi động. Bạn sẽ chỉ cần cha mẹ bắt đầu và thêm spring-jms(tôi đoán) làm phụ thuộc. Sau đó chỉ cần khởi động ứng dụng, sẽ không có máy chủ nào được khởi động.
M. Deinum


1
Bạn đã nhầm, tôi chỉ sử dụng spring-boot-starter-batch, tôi không bao gồm bất kỳ tomcat hoặc cấu hình máy chủ nào khác trong pom.xml của mình, tuy nhiên việc thực thi ứng dụng sẽ khởi chạy một vùng chứa web. Nó phải có một tham số ở đâu đó.
Mehdi

Câu trả lời:


25

Khởi động mùa xuân sẽ không bao gồm tomcat được nhúng nếu bạn không có phụ thuộc Tomcat vào đường dẫn classpath. Bạn có thể tự mình xem thực tế này tại lớp họcEmbeddedServletContainerAutoConfiguration mà bạn có thể tìm thấy nguồn tại đây .

Thịt của mã là công dụng của @ConditionalOnClass chú thích trên lớpEmbeddedTomcat


Ngoài ra, để biết thêm thông tin kiểm tra ra nàynày hướng dẫn và đây là một phần của tài liệu


Trong phiên bản hiện tại của nó, gs-convert-jar-to-war/completedự án Maven thêm một máy chủ Tomcat nhúng, bất chấp sự spring-boot-starter-tomcatphụ thuộc được khai báo với phạm vi provided. Điều này cảm thấy giống như một lỗi. Cũng xem stackoverflow.com/q/25991789/923560
Abdull

136

nếu bạn muốn chạy khởi động mùa xuân mà không có vùng chứa servlet, nhưng với một vùng chứa trên đường dẫn classpath (ví dụ: đối với các thử nghiệm), hãy sử dụng cách sau, như được mô tả trong tài liệu khởi động mùa xuân :

@Configuration
@EnableAutoConfiguration
public class MyClass{
    public static void main(String[] args) throws JAXBException {
                 SpringApplication app = new SpringApplication(MyClass.class);
         app.setWebEnvironment(false); //<<<<<<<<<
         ConfigurableApplicationContext ctx = app.run(args);
    }
}

ngoài ra, tôi vừa tình cờ tìm thấy tài sản này:

spring.main.web-environment=false

12
Chỉ cần thêm thuộc tính để application.propertieshoạt động hoàn toàn tốt.
Wim Deblauwe

8
Điều này hoạt động nhưng không được chấp nhận trong Spring Boot 2.0. Xem câu trả lời này cho phiên bản 2.0: stackoverflow.com/a/44394305/66686
Jens Schauder

1
FYI: Thuộc tính spring.main.web-environmentnày hiện không được dùng nữa. Vẫn hoạt động cho Boot 2.1.1
Sergey Karpushin

1
Khởi động 2.x - application.setWebApplicationType (WebApplicationType.NONE);
Michael Munsey

1
Những gì bạn phải sử dụng những ngày này làspring.main.web-application-type=none
chết tiệt

94

Khởi động mùa xuân 2.x

  • Thuộc tính ứng dụng

    spring.main.web-application-type=NONE 
    # REACTIVE, SERVLET
  • hoặc SpringApplicationBuilder

    @SpringBootApplication
    public class MyApplication {
    
        public static void main(String[] args) {
            new SpringApplicationBuilder(MyApplication.class)
                .web(WebApplicationType.NONE) // .REACTIVE, .SERVLET
                .run(args);
       }
    }

Nơi WebApplicationType :

  • NONE - Ứng dụng không được chạy dưới dạng ứng dụng web và không được khởi động máy chủ web nhúng.
  • REACTIVE - Ứng dụng phải chạy dưới dạng ứng dụng web phản ứng và phải khởi động một máy chủ web phản ứng được nhúng.
  • SERVLET - Ứng dụng phải chạy như một ứng dụng web dựa trên servlet và phải khởi động một máy chủ web servlet nhúng.

53

Bạn có thể tạo một cái gì đó như thế này:

@SpringBootApplication
public class Application {
  public static void main(String[] args) {
    new SpringApplicationBuilder(Application.class).web(false).run(args);
  }
}

@Component
public class CommandLiner implements CommandLineRunner {

  @Override
  public void run(String... args) throws Exception {
    // Put your logic here
  }

}

Sự phụ thuộc vẫn còn đó mặc dù nhưng không được sử dụng.


Chúng ta có thể loại bỏ sự phụ thuộc sprign-boot-starter-web một cách an toàn không? Còn bây giờ làm cho ứng dụng phi web và loại bỏ sự phụ thuộc này gây ra ngoại lệ ClassNotFound: javax.servlet.ServleContext
Simon logic

Xin lưu ý, giải pháp 1 không được dùng nữa
ACV

9

Giải pháp đơn giản nhất. trong tệp application.properties của bạn. thêm thuộc tính sau như được đề cập trong câu trả lời trước:

spring.main.web-environment = false

Đối với phiên bản 2.0.0 của Spring boot starter, hãy sử dụng thuộc tính sau:

spring.main.web-application-type = none

Đối với tài liệu về tất cả các thuộc tính, hãy sử dụng liên kết này: https://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html


7

Đối với Spring boot v2.1.3.RELEASE, chỉ cần thêm các thuộc tính sau vào application.propertes:

spring.main.web-application-type=none

6

Sử dụng mã này.

SpringApplication application = new SpringApplication(DemoApplication.class);
application.setWebApplicationType(WebApplicationType.NONE);
application.run(args);

3

Nếu bạn cần chức năng web trong ứng dụng của mình (như org.springframework.web.client.RestTemplatecho các cuộc gọi REST) ​​nhưng bạn không muốn khởi động máy chủ TOMCAT, chỉ cần loại trừ nó trong POM:

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

3
  • Thông qua chương trình:

    ConfigurableApplicationContext ctx =  new  SpringApplicationBuilder(YourApplicationMain.class)
    .web(WebApplicationType.NONE)
    .run(args);
  • Thông qua tệp application.properties:

    spring.main.web-environment=false 
  • Thông qua tệp application.yml:

    spring:
     main:
      web-environment:false

2

Nếu bạn muốn sử dụng một trong các mẫu "Bắt đầu" từ trang web spring.io, nhưng bạn không cần bất kỳ nội dung nào liên quan đến servlet đi kèm với mẫu "mặc định" ("gs / spring-boot"), thay vào đó bạn có thể thử mẫu lập lịch-nhiệm vụ (có pom * chứa spring-boot-starter, v.v.):

https://spring.io/guides/gs/scheduling-tasks/

Điều đó cung cấp cho bạn Spring Boot và ứng dụng chạy như một ứng dụng độc lập (không có servlet hoặc spring-webmvc, v.v. được bao gồm trong pom). Đó là những gì bạn muốn (mặc dù bạn có thể cần thêm một số nội dung dành riêng cho JMS, như người khác đã chỉ ra).

[* Tôi đang sử dụng Maven, nhưng giả sử rằng bản dựng Gradle sẽ hoạt động tương tự].


2

Loại bỏ sự phụ thuộc sau này vào tệp pom của bạn sẽ phù hợp với tôi

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

1

Đối với Kotling, đây là những gì tôi đã sử dụng gần đây:


// src/main/com.blabla/ShellApplication.kt

/**
 * Main entry point for the shell application.
 */
@SpringBootApplication
public class ShellApplication : CommandLineRunner {
    companion object {
        @JvmStatic
        fun main(args: Array<String>) {
            val application = SpringApplication(ShellApplication::class.java)
            application.webApplicationType = WebApplicationType.NONE
            application.run(*args);
        }
    }

    override fun run(vararg args: String?) {}
}

// src/main/com.blabla/command/CustomCommand.kt

@ShellComponent
public class CustomCommand {
    private val logger = KotlinLogging.logger {}

    @ShellMethod("Import, create and update data from CSV")
    public fun importCsv(@ShellOption() file: String) {
        logger.info("Hi")
    }
}

Và mọi thứ khởi động bình thường kết thúc bằng một trình bao có sẵn lệnh tùy chỉnh của tôi.


1

Bạn có thể sử dụng phụ thuộc spring-boot-starter. Điều này sẽ không có nội dung web.

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

0

Tương tự như câu trả lời @nayun oh ở trên, nhưng đối với các phiên bản cũ hơn của Spring, hãy sử dụng mã này:

SpringApplication application = new SpringApplication(DemoApplication.class);
application.setApplicationContextClass(AnnotationConfigApplicationContext.class);
application.run(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.