ฉันมีแอปพลิเคชัน Spring Boot ง่ายๆที่รับข้อความจากคิว JMS และบันทึกข้อมูลบางส่วนลงในไฟล์บันทึก แต่ไม่จำเป็นต้องมีเว็บเซิร์ฟเวอร์ มีวิธีใดบ้างในการเริ่ม Spring Boot โดยไม่มีเว็บเซิร์ฟเวอร์?
ฉันมีแอปพลิเคชัน Spring Boot ง่ายๆที่รับข้อความจากคิว JMS และบันทึกข้อมูลบางส่วนลงในไฟล์บันทึก แต่ไม่จำเป็นต้องมีเว็บเซิร์ฟเวอร์ มีวิธีใดบ้างในการเริ่ม Spring Boot โดยไม่มีเว็บเซิร์ฟเวอร์?
คำตอบ:
Spring boot จะไม่รวม tomcat ที่ฝังไว้หากคุณไม่มีการพึ่งพา Tomcat บน classpath คุณสามารถดูตัวเองเป็นจริงนี้ในชั้นเรียนEmbeddedServletContainerAutoConfiguration
ที่มีแหล่งที่คุณสามารถหาได้ที่นี่
เนื้อของรหัสคือการใช้@ConditionalOnClass
คำอธิบายประกอบบนชั้นเรียนEmbeddedTomcat
นอกจากนี้สำหรับการตรวจสอบข้อมูลเพิ่มเติมจากนี้และนี้คู่มือและนี้เป็นส่วนหนึ่งของเอกสาร
gs-convert-jar-to-war/complete
โครงการ Maven จะเพิ่มเซิร์ฟเวอร์ Tomcat แบบฝังแม้ว่าจะมีการspring-boot-starter-tomcat
ประกาศการอ้างอิงด้วยขอบเขตprovided
ก็ตาม รู้สึกเหมือนเป็นบั๊ก โปรดดูstackoverflow.com/q/25991789/923560
หากคุณต้องการรันสปริงบูตโดยไม่มีคอนเทนเนอร์ servlet แต่มีหนึ่งใน classpath (เช่นสำหรับการทดสอบ) ให้ใช้สิ่งต่อไปนี้ตามที่อธิบายไว้ในเอกสาร spring boot :
@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);
}
}
นอกจากนี้ฉันเพิ่งสะดุดกับคุณสมบัตินี้:
spring.main.web-environment=false
application.properties
ทำงานได้อย่างสมบูรณ์แบบ
spring.main.web-environment
นี้เลิกใช้งานแล้ว ยังคงใช้งานได้สำหรับ 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);
}
}
โดยที่WebApplicationType :
NONE
- แอปพลิเคชันไม่ควรทำงานเป็นเว็บแอปพลิเคชันและไม่ควรเริ่มต้นเว็บเซิร์ฟเวอร์ในตัวREACTIVE
- แอปพลิเคชันควรทำงานเป็นเว็บแอปพลิเคชันที่ตอบสนองและควรเริ่มต้นเว็บเซิร์ฟเวอร์ปฏิกิริยาในตัวSERVLET
- แอปพลิเคชันควรทำงานเป็นเว็บแอปพลิเคชันที่ใช้ servlet และควรเริ่มต้นเว็บเซิร์ฟเวอร์ servlet แบบฝัง
คุณสามารถสร้างสิ่งนี้:
@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
}
}
การพึ่งพายังคงมีอยู่ แต่ไม่ได้ใช้
ทางออกที่ง่ายที่สุด ในไฟล์ application.properties ของคุณ เพิ่มคุณสมบัติต่อไปนี้ตามที่กล่าวไว้ในคำตอบก่อนหน้า:
spring.main.web-environment = false
สำหรับ Spring boot starter เวอร์ชัน 2.0.0 ให้ใช้คุณสมบัติต่อไปนี้:
spring.main.web-application-type = none
สำหรับเอกสารเกี่ยวกับคุณสมบัติทั้งหมดให้ใช้ลิงก์นี้: https://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html
ใช้รหัสนี้
SpringApplication application = new SpringApplication(DemoApplication.class);
application.setWebApplicationType(WebApplicationType.NONE);
application.run(args);
สำหรับ Spring boot v2.1.3.RELEASE เพียงเพิ่มคุณสมบัติต่อไปนี้ใน application.propertes:
spring.main.web-application-type=none
หากคุณต้องการการทำงานของเว็บในแอปพลิเคชันของคุณ (เช่นorg.springframework.web.client.RestTemplate
สำหรับการโทร REST) แต่คุณไม่ต้องการเริ่มต้นเซิร์ฟเวอร์ TOMCAT เพียงแค่ไม่รวมไว้ใน 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>
ผ่านโปรแกรม:
ConfigurableApplicationContext ctx = new SpringApplicationBuilder(YourApplicationMain.class)
.web(WebApplicationType.NONE)
.run(args);
ผ่านไฟล์ application.properties:
spring.main.web-environment=false
ผ่านไฟล์ application.yml:
spring:
main:
web-environment:false
หากคุณต้องการใช้เทมเพลต "เริ่มต้นใช้งาน" จากเว็บไซต์ spring.io แต่คุณไม่ต้องการสิ่งที่เกี่ยวข้องกับ servlet ที่มาพร้อมกับเทมเพลต "default" ("gs / spring-boot") คุณสามารถลองใช้เทมเพลตการจัดตารางเวลา (ซึ่ง pom * มี spring-boot-starter เป็นต้น) แทน:
https://spring.io/guides/gs/scheduling-tasks/
ที่ช่วยให้คุณ Spring Boot และแอปทำงานเป็นแบบสแตนด์อโลน (ไม่มี servlets หรือ spring-webmvc และอื่น ๆ รวมอยู่ใน pom) ซึ่งเป็นสิ่งที่คุณต้องการ (แม้ว่าคุณอาจต้องเพิ่มบางสิ่งที่เฉพาะเจาะจง JMS ตามที่คนอื่นระบุไว้แล้ว)
[* ฉันใช้ Maven แต่สมมติว่างานสร้าง Gradle จะทำงานในลักษณะเดียวกัน]
ลบการขึ้นต่อกันของไฟล์ pom ของคุณจะใช้ได้กับฉัน
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
สำหรับ Kotling นี่คือสิ่งที่ฉันใช้เมื่อเร็ว ๆ นี้:
// 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")
}
}
และทุกอย่างปกติจะบูตลงท้ายด้วยเชลล์ที่มีคำสั่งที่กำหนดเองของฉัน
คุณสามารถใช้การพึ่งพาสปริงบูตสตาร์ทเตอร์ นี้จะไม่มีสิ่งที่เว็บ
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
ใน Spring boot การพึ่งพา Spring Web จะจัดเตรียมเว็บเซิร์ฟเวอร์ Apache Tomcat ในตัว ถ้าคุณเอาspring-boot-starter-web dependency ใน pom.xml จะไม่มีเว็บเซิร์ฟเวอร์ในตัว
ลบการพึ่งพาต่อไปนี้
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
Spring boot มีหลายตัวเริ่มต้นบางตัวมีเว็บเซิร์ฟเวอร์ในตัวบางตัวไม่มี สิ่งต่อไปนี้มีเว็บเซิร์ฟเวอร์ในตัว:
spring-boot-starter-web
spring-boot-starter-data-jpa
spring-boot-starter-jetty
spring-boot-starter-tomcat
spring-boot-starter-jdbc
spring-boot-starter-data-rest
...
เลือกสิ่งที่ตรงตามความต้องการของคุณและไม่มีการรองรับเซิร์ฟเวอร์
ฉันต้องการเพียงแค่ขอ json api อย่างสงบในแอปพลิเคชันฤดูใบไม้ผลิของฉันดังนั้นตัวเริ่มต้นที่ฉันต้องการคือ
spring-boot-starter-json
ซึ่งจัดหาRestTemplate
และjackson
ให้ฉันใช้
คล้ายกับคำตอบของ @nayun oh ด้านบน แต่สำหรับ Spring เวอร์ชันเก่าให้ใช้รหัสนี้:
SpringApplication application = new SpringApplication(DemoApplication.class);
application.setApplicationContextClass(AnnotationConfigApplicationContext.class);
application.run(args);
spring-jms
(ฉันเดา) เป็นการพึ่งพา จากนั้นเพียงแค่เริ่มแอปพลิเคชันเซิร์ฟเวอร์จะไม่เริ่มทำงาน