2015-06-26 8 views
13

मैं अपने स्प्रिंग-बूट एप्लिकेशन में एक वैकल्पिक प्रविष्टि बिंदु जोड़ना चाहता हूं। मैं इसे एक वसा जार के रूप में रखना पसंद करूंगा। क्या यह संभव है?वसंत बूट - वैकल्पिक स्टार्ट-क्लास निर्दिष्ट कैसे करें? (एकाधिक प्रविष्टि अंक)

उनके documentation के अनुसार, संपत्ति loader.main लॉन्च करने के लिए मुख्य श्रेणी का नाम निर्दिष्ट करती है।

मैंने java -jar MyJar.jar --loader.main=com.mycompany.AlternateMain की कोशिश की लेकिन मेरे pom.xml में निर्दिष्ट स्टार्ट-क्लास अभी भी चल रहा था (और यदि मैं इसे pom.xml से हटा देता हूं तो मैं पैकेजिंग के दौरान त्रुटि करता हूं)।

वैकल्पिक रूप से, मैंने java -cp MyJar.jar com.mycompany.AlternateMain की कोशिश की लेकिन मुझे क्लासपाथ में सभी नेस्टेड जार जोड़ने का एक अच्छा तरीका पता नहीं है।

कोई सुझाव?

संपादित करें: यहाँ समाधान है कि मैं

इस्तेमाल किया JST के रूप में सुझाव दिया है, मैं अपने लांचर PropertiesLauncher उपयोग करने के लिए बदल दिया है। मैंने अपने वसंत-बूट-मेवेन-प्लगइन की कॉन्फ़िगरेशन को संशोधित करके ऐसा किया।

<plugin> 
    <groupId>org.springframework.boot</groupId> 
    <artifactId>spring-boot-maven-plugin</artifactId> 
    <configuration> 
    <mainClass>${start-class}</mainClass> 
    <layout>ZIP</layout> 
    ... 

<layout>ZIP</layout>triggers Spring Boot to use the PropertiesLauncher

मैं अपने वसा जार (mvn पैकेज) बनाया तो इस तरह वैकल्पिक मुख्य बुलाया:

java -jar -Dloader.main=com.mycompany.AlternateMain MyJar.jar 

मदद के लिए धन्यवाद!

+1

स्प्रिंग बूट मुख्य वर्ग और क्लासपाथ निर्दिष्ट करने के लिए बस जार के मेनिफेस्ट का उपयोग करता है।तो मुझे लगता है कि यहां असली सवाल एक निष्पादन योग्य जार में एक से अधिक मुख्य वर्ग हो सकता है? उस प्रश्न को यहां भी उत्तर/उत्तर दिया गया है: http://stackoverflow.com/q/3976514/953327 – FGreg

+0

आप इसके साथ क्या करने का इरादा रखते हैं? क्या आप स्प्रिंग बूट के भीतर से कई एप्लिकेशन बनाना चाहते हैं? – Makoto

+0

@FGreg मैं दूसरे आदेश का उपयोग करके वैकल्पिक मुख्य तक पहुंच सकता हूं, जो आपके द्वारा लिंक किए गए एसओ थ्रेड में उत्तर से मेल खाता है। इसे सफलतापूर्वक उपयोग करने के लिए, मुझे यह पता लगाना होगा कि मेरे नेस्टेड जार को क्लासपाथ में कैसे जोड़ना है। –

उत्तर

8

मुझे विश्वास नहीं है कि संपत्ति आपके मामले में लागू होगी। 3 अलग-अलग "लॉन्चर्स" हैं (दस्तावेज़ों पर वापस जाएं और देखें)। यदि आप एक जार बना रहे हैं तो यह जारलाउचर क्लास का उपयोग करता है। यदि आप इसे PropertiesLauncher पर स्विच करते हैं तो loader.main उपयोगी होगा।

META-INF/MANIFEST.MF

Main-Class: org.springframework.boot.loader.PropertiesLauncher 
+0

यह बहुत ही आशाजनक लगता है, लेकिन मेरे परिणाम समान हैं। PropertiesLauncher का उपयोग करने के लिए, मैंने वसंत-बूट-मेवेन-प्लगइन को कॉन्फ़िगर किया है, जैसा कि यहां बताया गया है http://stackoverflow.com/a/21328440/2860319। मैं अपने मैनिफेस्ट में देख सकता था कि यह काम करता है और PropertiesLauncher का उपयोग अब किया जा रहा था, लेकिन कमांड लाइन के माध्यम से निर्दिष्ट लोडर.माइन संपत्ति ने स्टार्ट-क्लास को नहीं बदला ... hmmmm –

+0

मैं गुणों को गलत तरीके से जोड़ रहा था, मैं अपडेट करूंगा मैंने जो किया उसके साथ मेरी पोस्ट। महान सुझाव के लिए धन्यवाद! –

3

मैं एक main रखने का सुझाव दूंगा लेकिन एक या अन्य "एंट्री पॉइंट" @Configuration कक्षा का चयन करने के लिए स्प्रिंग प्रोफाइल (या कॉन्फ़िगरेशन गुण) का उपयोग कर रहा हूं।

+1

क्या आप एक उदाहरण प्रदान कर सकते हैं? – rmv

7

मैं एक अलग दृष्टिकोण लिया और जो वर्ग मेरी SpringApplication वर्ग के रूप में उपयोग करने के लिए निर्धारित करने के लिए एक कमांड लाइन पैरामीटर का उपयोग करें। मेरे पास केवल एक मुख्य() विधि है, लेकिन अलग-अलग कॉन्फ़िगरेशन वाले विभिन्न अनुप्रयोग वर्ग जो कमांड लाइन पैराम के आधार पर उपयोग किए जाते हैं।

मैं main() उस में के साथ एक एकल वर्ग है:

public static void main(String[] args) { 
    SpringApplication app; 
    if(ArrayUtils.contains(args, "--createdb")){ 
     app = new SpringApplication(CreateDB.class); 
     args = (String[])ArrayUtils.add(args, "--spring.jpa.hibernate.ddl-auto=create"); 
    } else { 
     app = new SpringApplication(Application.class); 
    } 

    app.setWebEnvironment(false); 
    app.setShowBanner(false); 
    app.addListeners(new ConfigurationLogger()); 

    // launch the app 
    ConfigurableApplicationContext context = app.run(args); 

    // finished so close the context 
    context.close(); 
} 

लेकिन मैं 2 अलग SpringApplication श्रेणियां होती हैं: Application.class & CreateDB.class। प्रत्येक वर्ग एक अलग @ComponentScan पथ के साथ-साथ विभिन्न @EnableAutoConfiguration विकल्प और विभिन्न @Configuration विकल्पों को परिभाषित करता है। आखिरकार, मेरे कमांड लाइन तर्कों के आधार पर, मैं तय कर सकता हूं कि अतिरिक्त प्रोफाइल/आदि को प्रोग्रामिक रूप से सक्षम करना है या नहीं।

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

+0

यह वह जगह है जहां मैं भी जा रहा था, संभावित रूप से 'CreateDB' और' अनुप्रयोग' अलग-अलग पैकेजों में मौजूद है, इस प्रकार आप उस पैकेज में 'बेसपैकेज' सेट के साथ '@ घटक स्कैन' का उपयोग करने में सक्षम हैं? – ben3000

+2

दरअसल यह संभव है। मेरे मामले में, वे वास्तव में एक ही पैकेज में हैं, लेकिन मेरी '@ कॉम्पोनेंटस्कैन() 'स्पष्टीकरण अलग-अलग बहिष्करण नियमों के साथ स्कैन करने के लिए अलग-अलग बेस पैकेज सेट करता है। यह आपको अलग-अलग '@ ऑटो कॉन्फ़िगरेशन()' विकल्प, अलग-अलग कॉन्फ़िगरेशन क्लासेस इत्यादि भी प्राप्त करने की अनुमति देता है। और स्पष्ट रूप से - मुझे लॉन्चर और लॉन्चर पैरामीटर का उपयोग करने के लिए लॉन्च क्लास नाम निर्दिष्ट करने के लिए ऐसा करना बहुत आसान लगता है; यह मुझे किसी भी तरह से अमूर्त करने के लिए अनुमति देता है। मैंने मूल रूप से एक ही जार में 2 अलग स्प्रिंगबूट ऐप्स (जो सामान्य कक्षाएं साझा करते हैं) को पैक किया है। –

संबंधित मुद्दे