मैं उत्पादन परिवेश में स्प्रिंग बूट एक्ज़ीक्यूटेबल जार कैसे चलाऊँ?


105

स्प्रिंग बूट की पसंदीदा परिनियोजन विधि एक निष्पादन योग्य जार फ़ाइल के माध्यम से होती है, जिसमें अंदर टॉमकैट होता है।

इसकी शुरुआत एक साधारण से की जाती है java -jar myapp.jar

अब, मैं EC2 पर अपने लिनक्स सर्वर पर उस जार को तैनात करना चाहता हूं, क्या मुझे कुछ याद आ रहा है या क्या मुझे वास्तव में एक डेमॉन के रूप में एप्लिकेशन को ठीक से शुरू करने के लिए एक init स्क्रिप्ट बनाने की आवश्यकता है?

यदि मैं बस कॉल java -jarकरता हूं तो जब मैं लॉग आउट करता हूं तो एप्लिकेशन की मृत्यु हो जाती है।

मैं इसे स्क्रीन या nohup में शुरू कर सकता हूं, लेकिन यह बहुत सुरुचिपूर्ण नहीं है और मेरे सर्वर में पुनरारंभ मुझे लॉग इन करने और मैन्युअल रूप से प्रक्रिया शुरू करने के लिए मजबूर करेगा।

तो, क्या वसंत बूट में कार्य के लिए पहले से ही कुछ है?


1
nohup / स्क्रीन (गंदी विधि), init / systemd / upstart (उचित विधि)

@RC हां, जो मैं जानता / समझती हूं, जैसे कि मैंने /etc/init.d में एक कस्टम स्क्रिप्ट के साथ / sbin / init का उल्लेख किया है, वह काम करेगा, लेकिन क्या वास्तव में यह विचार है कि हर किसी को अपनी स्क्रिप्ट का प्रबंधन करना चाहिए। डेमॉन (प्रारंभ, रोक, पुनः आरंभ, स्थिति)? लगता है कि उस समाधान पर कुछ याद आ रहा है।
क्लेबर गोंक्लेव्स

मुझे लगता है कि स्प्रिंग-बूट में कुछ गायब है (यह वास्तव में "ताज़ा" प्रोजेक्ट btw है) बस टीम प्रभारी से संपर्क करें और एक विकास प्रस्ताव बनाएं।

ठीक है, यदि आप एक युद्ध संग्रह बनाते हैं तो आप अपने वितरण के संस्करण को टॉमकैट पर उपयोग कर सकते हैं, जिसमें उपयोग करने के लिए एक init स्क्रिप्ट होगी। दूसरी ओर, यदि आप निष्पादन योग्य जार दृष्टिकोण का उपयोग करते हैं, तो आपको अपने स्वयं के कस्टम इनिट स्क्रिप्ट के साथ आना होगा। यकीन नहीं होता कि यह बूट के दायरे में है, लेकिन यह स्पष्ट रूप से गायब है, जो अजीब है, इसलिए मुझे इस मामले में पूछने पर मैं कुछ अनदेखा करता हूं। उन्हें पिंग करेंगे।
क्लेबर गोंकाल्वेस

1
मौजूदा चर्चा और विचारों के लिए यहां देखें ।
डेव सीर

जवाबों:


96

कृपया ध्यान दें कि स्प्रिंग बूट 1.3.0.M1 के बाद से, आप मावेन और ग्रैडल का उपयोग करके पूरी तरह से निष्पादन योग्य जार बनाने में सक्षम हैं।

मावेन के लिए, बस निम्नलिखित को अपने में शामिल करें pom.xml:

<plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <configuration>
        <executable>true</executable>
    </configuration>
</plugin>

ग्रेडल के लिए निम्नलिखित स्निपेट को अपने साथ जोड़ें build.gradle:

springBoot {
    executable = true
}

पूरी तरह से निष्पादन योग्य जार में फ़ाइल के सामने एक अतिरिक्त स्क्रिप्ट होती है, जो आपको अपने स्प्रिंग बूट जार को सिंपल करने init.dया systemdस्क्रिप्ट का उपयोग करने की अनुमति देती है ।

init.d उदाहरण:

$ln -s /var/yourapp/yourapp.jar /etc/init.d/yourapp

यह आपको अपना आवेदन शुरू करने, रोकने और पुनः आरंभ करने की अनुमति देता है जैसे:

$/etc/init.d/yourapp start|stop|restart

या systemdस्क्रिप्ट का उपयोग करें :

[Unit]
Description=yourapp
After=syslog.target

[Service]
ExecStart=/var/yourapp/yourapp.jar
User=yourapp
WorkingDirectory=/var/yourapp
SuccessExitStatus=143

[Install]
WantedBy=multi-user.target

निम्नलिखित लिंक पर अधिक जानकारी:


4
आपको $ chmod +x /etc/init.d/yourappशुरू करने / रोकने / फिर से शुरू करने में सक्षम होने की आवश्यकता भी हो सकती है
रोहित नंदकुमार

जार फ़ाइल को पढ़ने और निष्पादित करने के लिए आपको हमेशा अपनी सेवा उपयोगकर्ता की अनुमति देनी होगी। चीजों को काम करने के लिए आपको सर्वर और जावा पर्यावरण चर के लिए डिफ़ॉल्ट जावा को भी कॉन्फ़िगर करना होगा।
मिक्रो

यह काम नहीं करता है! मैंने इसे आज़माया है और मुझे निम्नलिखित त्रुटि मिलती है: MyApp.service शुरू करने में विफल: यूनिट MyApp.service नहीं मिली
मार्टीजन हीमस्त्र

9

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

यहां आपको आरंभ करने के लिए Dockerfileआधिकारिक स्प्रिंग बूट डॉकर गाइड से एक सरल है :

FROM frolvlad/alpine-oraclejdk8:slim
VOLUME /tmp
ADD YOUR-APP-NAME.jar app.jar
RUN sh -c 'touch /app.jar'
ENV JAVA_OPTS=""
ENTRYPOINT [ "sh", "-c", "java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -jar /app.jar" ]

कंटेनर को डेमॉन के रूप में चलाने के लिए यहाँ एक नमूना कमांड लाइन है:

docker run \
  -d --restart=always \
  -e "SPRING_PROFILES_ACTIVE=prod" \
  -p 8080:8080 \
  prefix/imagename

3

मेरे स्प्रिंग बूट एप्लिकेशन में दो इनिशियलाइज़र हैं। एक विकास के लिए और दूसरा उत्पादन के लिए। विकास के लिए, मैं इस तरह से मुख्य विधि का उपयोग करता हूं:

@SpringBootApplication
public class MyAppInitializer {

    public static void main(String[] args) {
        SpringApplication.run(MyAppInitializer .class, args);
    }

}

उत्पादन वातावरण के लिए मेरा शुरुआती स्प्रिंगब्रूटसर्वलेट इंसुलेटर का विस्तार करता है और इस तरह दिखता है:

@SpringBootApplication
public class MyAppInitializerServlet extends SpringBootServletInitializer{
    private static final Logger log = Logger
            .getLogger(SpringBootServletInitializer.class);
    @Override
    protected SpringApplicationBuilder configure(
            SpringApplicationBuilder builder) {
        log.trace("Initializing the application");
        return builder.sources(MyAppInitializerServlet .class);
    }

}

मैं ग्रेडेल का उपयोग करता हूं और मेरी build.gradle फ़ाइल ' WAR ' प्लगइन पर लागू होती है । जब मैं इसे विकास के माहौल में चलाता हूं, तो मैं बूटरन कार्य का उपयोग करता हूं । जहां जब मैं इसे उत्पादन के लिए तैनात करना चाहता हूं, तो मैं डब्ल्यूएआर तैयार करने और तैनात करने के लिए असेंबल कार्य का उपयोग करता हूं ।

मैं विकसित करते समय इनबिल्ट टोमैट द्वारा प्रदान किए गए लाभों को छूट के बिना उत्पादन में एक सामान्य वसंत आवेदन की तरह चला सकता हूं। उम्मीद है की यह मदद करेगा।


2

उत्पादन के माहौल में आप चाहते हैं कि आपका ऐप एक मशीन रीस्टार्ट आदि पर फिर से शुरू हो, एक /etc/init.d/ स्क्रिप्ट तैयार करें और इसे सही तरीके से शुरू करने और रोकने के लिए उपयुक्त रनवे से लिंक करें। स्प्रिंग बूट इसे कवर करने के लिए विस्तारित नहीं करेगा क्योंकि यह एक ऑपरेटिंग सिस्टम विशिष्ट सेटअप है और अन्य विकल्पों के टन हैं, क्या आप इसे चेरोट जेल में चलाना चाहते हैं, क्या इसे किसी अन्य सॉफ़्टवेयर आदि से पहले रोकने / शुरू करने की आवश्यकता है।


2

आप सुपरवाइज़र नामक एप्लिकेशन का उपयोग कर सकते हैं । पर्यवेक्षक कॉन्फिगरेशन में आप एक ही निष्पादित करने के लिए कई सेवाओं और तरीकों को परिभाषित कर सकते हैं।

जावा और स्प्रिंग बूट एप्लिकेशन के लिए कमांड होगी java -jar springbootapp.jar

एप्लिकेशन को हमेशा चालू रखने के लिए विकल्प प्रदान किए जा सकते हैं। यदि EC2 फिर से शुरू होता है, तो पर्यवेक्षक आपके आवेदन को फिर से शुरू करेगा

मुझे /etc/init.d/ में स्टार्टअप स्क्रिप्ट डालने की तुलना में पर्यवेक्षक का उपयोग करना आसान लगा। स्टार्टअप स्क्रिप्ट त्रुटियों के मामले में लटका या प्रतीक्षा की स्थिति में जाएगी।


2

यदि आप ग्रेडेल का उपयोग कर रहे हैं तो आप इसे केवल अपने build.gradle में जोड़ सकते हैं

springBoot {
    executable = true
}

फिर आप अपना आवेदन टाइप करके चला सकते हैं ।/your-app.jar

इसके अलावा, आप अपने ऐप को एक सेवा के रूप में स्थापित करने के लिए यहां एक पूर्ण मार्गदर्शिका पा सकते हैं

56.1.1 एक init.d सेवा के रूप में स्थापना (सिस्टम V)

http://docs.spring.io/spring-boot/docs/current/reference/html/deployment-install.html

चियर्स


वास्तव में यह पता चला है होना चाहिए कि bootRepackage { executable = true }देखें docs.spring.io/spring-boot/docs/current/reference/html/...
फिलिप

2

बिना सेवा के विंडोज ओएस पर।

start.bat

@ECHO OFF
call run.bat start

stop.bat:

@ECHO OFF
call run.bat stop

run.bat

@ECHO OFF
IF "%1"=="start" (
    ECHO start myapp
    start "myapp" java -jar -Dspring.profiles.active=staging myapp.jar
) ELSE IF "%1"=="stop" (
    ECHO stop myapp
    TASKKILL /FI "WINDOWTITLE eq myapp"
) ELSE (
    ECHO please, use "run.bat start" or "run.bat stop"
)
pause

1

मैं उन अनुप्रयोगों को शुरू करता हूं जिन्हें मैं स्क्रीन -DMS NAME / पथ / से / स्क्रिप्ट के माध्यम से लगातार या कम से कम अर्ध-स्थायी रूप से चलाना चाहता हूं। जहां तक ​​मुझे सूचित किया गया है यह सबसे सुंदर समाधान है।


0

यह एक सरल है, आप अपने कोड को समाप्त करने के लिए स्प्रिंग बूट मावेन प्लगइन का उपयोग कर सकते हैं।

प्लगइन विन्यास की तरह:

<plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <jvmArguments>-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=${debug.port}
                    </jvmArguments>
                    <profiles>
                        <profile>test</profile>
                    </profiles>
                    <executable>true</executable>
                </configuration>
            </plugin>

और, jvmArtumentsआपके लिए jvm जोड़ दिया गया है। profilesअपना ऐप शुरू करने के लिए एक प्रोफ़ाइल का चयन करेगा। executableअपना ऐप तुरंत चला सकते हैं।

और यदि आप mvnwअपनी परियोजना में जोड़ते हैं , या आपके पास एक मावेन श्रद्धा है। आप सिर्फ ./mvnw spring-boot:runmvanw या mvn spring-boot:runmaven के लिए कॉल कर सकते हैं ।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.