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?
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?
Câu trả lời:
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ày và này hướng dẫn và đây là một phần của tài liệu
gs-convert-jar-to-war/complete
dự án Maven có thêm một máy chủ Tomcat nhúng, bất chấp sự spring-boot-starter-tomcat
phụ 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
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
application.properties
hoạt động hoàn toàn tốt.
spring.main.web-environment
này hiện không được dùng nữa. Vẫn hoạt động cho Boot 2.1.1
spring.main.web-application-type=none
spring.main.web-application-type=NONE
# REACTIVE, SERVLET
@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.
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);
}
}
Và
@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.
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
Đố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
Nếu bạn cần chức năng web trong ứng dụng của mình (như org.springframework.web.client.RestTemplate
cho 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>
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
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ự].
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>
Đố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.
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);
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.