वेब सर्वर के बिना स्प्रिंग बूट


104

मेरे पास एक सरल स्प्रिंग बूट एप्लिकेशन है जो जेएमएस कतार से संदेश प्राप्त करता है और लॉग फ़ाइल में कुछ डेटा बचाता है, लेकिन इसके लिए वेब सर्वर की आवश्यकता नहीं है। क्या वेब सर्वर के बिना स्प्रिंग बूट शुरू करने का कोई तरीका है?


3
यदि आपको वेब की आवश्यकता नहीं है, तो इसे शामिल न करें, जब शामिल नहीं है एम्बेडेड सर्वर शुरू नहीं होगा। आपको केवल स्टार्टर माता-पिता की आवश्यकता होगी और spring-jmsएक निर्भरता के रूप में जोड़ (मुझे लगता है)। फिर बस आवेदन शुरू करें, कोई सर्वर शुरू नहीं किया जाएगा।
एम। दीनुम


1
आप गलत हैं, मैं केवल स्प्रिंग-बूट-स्टार्टर-बैच का उपयोग करता हूं, मैं अपने pom.xml में किसी भी टॉमकैट या अन्य सर्वर कॉन्फ़िगरेशन को शामिल नहीं करता हूं, हालांकि एप्लिकेशन को निष्पादित करने से एक वेब कंटेनर लॉन्च होता है। इसे कहीं न कहीं एक पैरामीटर लेना होगा।
मेहदी

जवाबों:


25

यदि आप क्लासपैथ पर टॉमकैट निर्भरता नहीं रखते हैं, तो स्प्रिंग बूट में एम्बेडेड टॉमकैट शामिल नहीं होगा। आप इस तथ्य को स्वयं उस कक्षा में EmbeddedServletContainerAutoConfigurationदेख सकते हैं जिसका स्रोत आप यहां पा सकते हैं ।

कोड का मांस @ConditionalOnClassवर्ग पर एनोटेशन का उपयोग हैEmbeddedTomcat


इसके अलावा, अधिक जानकारी के लिए यह और यह मार्गदर्शिका और प्रलेखन का यह हिस्सा देखें


अपने वर्तमान संस्करण में, gs-convert-jar-to-war/completeमावेन परियोजना एक एम्बेडेड टॉमकैट सर्वर को जोड़ती है, भले spring-boot-starter-tomcatही गुंजाइश के साथ निर्भरता घोषित की गई हो provided। यह एक बग की तरह लगता है। इसके अलावा stackoverflow.com/q/25991789/923560
अब्दुल

137

यदि आप एक सर्वलेट कंटेनर के बिना स्प्रिंग बूट चलाना चाहते हैं, लेकिन क्लासपैथ पर एक (उदाहरण के लिए परीक्षण) के साथ, निम्नलिखित का उपयोग करें, जैसा कि स्प्रिंग बूट प्रलेखन में वर्णित है :

@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पूरी तरह से ठीक काम करता है।
बजे विम डेब्लाउवे

8
यह काम करता है लेकिन स्प्रिंग बूट 2.0 में चित्रित किया गया है। इस उत्तर को 2.0 संस्करण के लिए देखें: stackoverflow.com/a/44394305/66686
जेन्स स्काउडर

1
FYI करें: यह संपत्ति spring.main.web-environmentअब पदावनत हो गई है। फिर भी बूट 2.1.1 के लिए काम करता है
सर्गेई कारपुशिन

1
बूट 2.x - application.setWebApplicationType (WebApplicationType.NONE);
माइकल मुन्से

1
आप इन दिनों का उपयोग करने वाले हैंspring.main.web-application-type=none
damd

95

स्प्रिंग बूट 2.x

  • अनुप्रयोग गुण

    spring.main.web-application-type=NONE 
    # REACTIVE, SERVLET
    
  • या SpringApplicationBuilder

    @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 - एप्लिकेशन को सर्वलेट-आधारित वेब एप्लिकेशन के रूप में चलना चाहिए और एक एम्बेडेड सर्वलेट वेब सर्वर शुरू करना चाहिए।

53

आप कुछ इस तरह से बना सकते हैं:

@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
साइमन लॉजिक

कृपया ध्यान दें, समाधान 1 पदावनत है
ACV

9

सबसे सरल उपाय। अपने आवेदन में। फ़ाइल में प्रवेश करें। पिछले उत्तर के अनुसार निम्नलिखित संपत्ति जोड़ें:

spring.main.web पर्यावरण = false

वसंत बूट स्टार्टर के संस्करण 2.0.0 के लिए, निम्नलिखित संपत्ति का उपयोग करें:

spring.main.web आवेदन-प्रकार = कोई भी

सभी संपत्तियों पर प्रलेखन के लिए इस लिंक का उपयोग करें: https://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html


7

स्प्रिंग बूट v2.1.3 के लिए। कृपया, केवल ऐप्लिकेशन में गुण जोड़ें।

spring.main.web-application-type=none

6

इस कोड का उपयोग करें।

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

3

यदि आपको अपने एप्लिकेशन में वेब कार्यक्षमता की आवश्यकता है (जैसे org.springframework.web.client.RestTemplateकि कॉल के लिए), लेकिन आप TOMCAT सर्वर को शुरू नहीं करना चाहते हैं, तो बस इसे पोम में शामिल न करें:

<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
  • कार्यक्रम के माध्यम से:

    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

यदि आप स्प्रिंग.आईओ साइट से "गेटिंग स्टार्टेड" टेम्प्लेट में से एक का उपयोग करना चाहते हैं, लेकिन आपको "डिफॉल्ट" ("जीएस / स्प्रिंग-बूट") टेम्प्लेट के साथ आने वाले किसी भी सर्वलेट से संबंधित सामान की आवश्यकता नहीं है, इसके बजाय आप शेड्यूलिंग-टास्क टेम्प्लेट (जिसके पोम * में स्प्रिंग-बूट-स्टार्टर आदि शामिल हैं) को आज़मा सकते हैं:

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

यह आपको स्प्रिंग बूट देता है, और ऐप एक स्टैंडअलोन के रूप में चलता है (कोई सर्वलेट या स्प्रिंग-वेबमिक्स आदि पोम में शामिल नहीं हैं)। जो आप चाहते थे (हालांकि आपको कुछ जेएमएस-विशिष्ट सामान जोड़ने की आवश्यकता हो सकती है, क्योंकि कोई और पहले से ही इंगित करता है)।

[* मैं मावेन का उपयोग कर रहा हूं, लेकिन यह मान लें कि ग्रैडल बिल्ड इसी तरह काम करेगा]।


2

अपने pom फ़ाइल पर फ़ोलोइंग निर्भरता निकालें मेरे लिए काम करेगा

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

1

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

स्प्रिंग बूट में, स्प्रिंग वेब निर्भरता एक एम्बेडेड Apache Tomcat वेब सर्वर प्रदान करता है। यदि आप pom.xml में स्प्रिंग-बूट-स्टार्टर-वेब निर्भरता को हटाते हैं तो यह एक एम्बेडेड वेब सर्वर प्रदान नहीं करता है।

निम्नलिखित निर्भरता को दूर करें

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

0

ऊपर @nayun ओह उत्तर के समान है, लेकिन स्प्रिंग के पुराने संस्करणों के लिए, इस कोड का उपयोग करें:

SpringApplication application = new SpringApplication(DemoApplication.class);
application.setApplicationContextClass(AnnotationConfigApplicationContext.class);
application.run(args);
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.