Spring Boot โดยไม่มีเว็บเซิร์ฟเวอร์


113

ฉันมีแอปพลิเคชัน Spring Boot ง่ายๆที่รับข้อความจากคิว JMS และบันทึกข้อมูลบางส่วนลงในไฟล์บันทึก แต่ไม่จำเป็นต้องมีเว็บเซิร์ฟเวอร์ มีวิธีใดบ้างในการเริ่ม Spring Boot โดยไม่มีเว็บเซิร์ฟเวอร์?


3
หากคุณไม่ต้องการเว็บก็อย่ารวมไว้เมื่อไม่รวมเซิร์ฟเวอร์ฝังตัวจะไม่เริ่มทำงาน คุณจะต้องมีผู้ปกครองเริ่มต้นเท่านั้นและเพิ่มspring-jms(ฉันเดา) เป็นการพึ่งพา จากนั้นเพียงแค่เริ่มแอปพลิเคชันเซิร์ฟเวอร์จะไม่เริ่มทำงาน
M. Deinum


1
คุณคิดผิดฉันใช้เฉพาะ spring-boot-starter-batch ฉันไม่รวม tomcat หรือการกำหนดค่าเซิร์ฟเวอร์อื่น ๆ ใน pom.xml ของฉันอย่างไรก็ตามการเรียกใช้แอปพลิเคชันจะเปิดใช้งานเว็บคอนเทนเนอร์ ต้องใช้พารามิเตอร์ที่ไหนสักแห่ง
Mehdi

คำตอบ:


24

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
อับดุล

140

หากคุณต้องการรันสปริงบูตโดยไม่มีคอนเทนเนอร์ 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

12
เพียงแค่เพิ่มคุณสมบัติให้application.propertiesทำงานได้อย่างสมบูรณ์แบบ
Wim Deblauwe

8
ใช้งานได้ แต่เลิกใช้แล้วใน Spring Boot 2.0 ดูคำตอบสำหรับเวอร์ชัน 2.0: stackoverflow.com/a/44394305/66686
Jens Schauder

1
FYI: คุณสมบัติspring.main.web-environmentนี้เลิกใช้งานแล้ว ยังคงใช้งานได้สำหรับ Boot 2.1.1
Sergey Karpushin

1
Boot 2.x - application.setWebApplicationType (WebApplicationType.NONE);
Michael Munsey

3
สิ่งที่คุณควรจะใช้ในวันนี้คือspring.main.web-application-type=none
damd

105

สปริงบูต 2.x


โดยที่WebApplicationType :

  • NONE - แอปพลิเคชันไม่ควรทำงานเป็นเว็บแอปพลิเคชันและไม่ควรเริ่มต้นเว็บเซิร์ฟเวอร์ในตัว
  • REACTIVE - แอปพลิเคชันควรทำงานเป็นเว็บแอปพลิเคชันที่ตอบสนองและควรเริ่มต้นเว็บเซิร์ฟเวอร์ปฏิกิริยาในตัว
  • SERVLET - แอปพลิเคชันควรทำงานเป็นเว็บแอปพลิเคชันที่ใช้ servlet และควรเริ่มต้นเว็บเซิร์ฟเวอร์ servlet แบบฝัง

54

คุณสามารถสร้างสิ่งนี้:

@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
  }

}

การพึ่งพายังคงมีอยู่ แต่ไม่ได้ใช้


เราสามารถลบการพึ่งพาเว็บเริ่มต้นอย่างปลอดภัยได้หรือไม่? สำหรับการสร้างแอปที่ไม่ใช่เว็บและการลบการอ้างอิงนี้ทำให้เกิดข้อยกเว้น ClassNotFound: javax.servlet.ServleContext
Simon Logic

โปรดทราบว่าโซลูชัน 1 เลิกใช้งานแล้ว
ACV

11

ทางออกที่ง่ายที่สุด ในไฟล์ 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



8

สำหรับ Spring boot v2.1.3.RELEASE เพียงเพิ่มคุณสมบัติต่อไปนี้ใน application.propertes:

spring.main.web-application-type=none

4

หากคุณต้องการการทำงานของเว็บในแอปพลิเคชันของคุณ (เช่น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>

4
  • ผ่านโปรแกรม:

    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
    

2

หากคุณต้องการใช้เทมเพลต "เริ่มต้นใช้งาน" จากเว็บไซต์ 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 จะทำงานในลักษณะเดียวกัน]



2

สำหรับ 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")
    }
}

และทุกอย่างปกติจะบูตลงท้ายด้วยเชลล์ที่มีคำสั่งที่กำหนดเองของฉัน


1

คุณสามารถใช้การพึ่งพาสปริงบูตสตาร์ทเตอร์ นี้จะไม่มีสิ่งที่เว็บ

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

1

ใน 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>

หมายเหตุ: ผู้เริ่มต้นควรเป็น POM ผู้ปกครองไม่ใช่การพึ่งพา
OneCricketeer

1

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ให้ฉันใช้


0

คล้ายกับคำตอบของ @nayun oh ด้านบน แต่สำหรับ Spring เวอร์ชันเก่าให้ใช้รหัสนี้:

SpringApplication application = new SpringApplication(DemoApplication.class);
application.setApplicationContextClass(AnnotationConfigApplicationContext.class);
application.run(args);
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.