2015-07-13 5 views
23

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

लेकिन क्या होगा अगर एक और (तृतीय पक्ष) WAR फ़ाइल (उदाहरण के लिए, GeoServer) को जोड़ा जाना चाहिए?

  1. एक सामान्य बिलाव सर्वर स्थापित करें:

    शायद निम्नलिखित सामान्य प्रक्रिया है।

  2. स्प्रिंग बूट एप्लिकेशन को एक WAR फ़ाइल के रूप में बनाएं, और इसे टॉमकैट के वेबपैस फ़ोल्डर में जोड़ें।
  3. वेबपैस फ़ोल्डर में एक और (तृतीय-पक्ष) WAR फ़ाइल भी जोड़ें।

लेकिन यह अच्छा होगा अगर निम्न कॉन्फ़िगरेशन संभव था।

  1. स्प्रिंग बूट एप्लिकेशन को एक स्टैंडअलोन जार के रूप में बनाएं, जिसमें एम्बेडेड टोमकैट शामिल है।
  2. स्प्रिंग बूट एप्लिकेशन जार को तैनात करें।
  3. एम्बेडेड टॉमकैट पहचानने वाले फ़ोल्डर में एक और (तृतीय-पक्ष) WAR फ़ाइल जोड़ें।
  4. एम्बेडेड टोमकैट का उपयोग कर स्प्रिंग बूट एप्लिकेशन सामग्री और एक और WAR की सामग्री दोनों की सेवा करें।

यह कैसे किया जा सकता है?

अद्यतन

जब वसंत बूट आवेदन वसा जार (= निष्पादन योग्य जार) से बना है, जवाब में कोड पर्याप्त नहीं है। संशोधित एक प्रकार है:

@Bean 
public EmbeddedServletContainerFactory servletContainerFactory() { 
    return new TomcatEmbeddedServletContainerFactory() { 

     @Override 
     protected TomcatEmbeddedServletContainer getTomcatEmbeddedServletContainer(
       Tomcat tomcat) { 
      try { 
       Context context = tomcat.addWebapp("/foo", "/path/to/foo.war"); 
       WebappLoader loader = 
        new WebappLoader(Thread.currentThread().getContextClassLoader()); 
       context.setLoader(loader); 
      } catch (ServletException ex) { 
       throw new IllegalStateException("Failed to add webapp", ex); 
      } 
      return super.getTomcatEmbeddedServletContainer(tomcat); 
     } 

    }; 
} 

के बाद से एक वसा जार में जार फ़ाइलों प्रणाली classloader से लोड नहीं किया जा सकता है, एक स्पष्ट माता पिता classloader निर्दिष्ट किया जाना चाहिए। अन्यथा, अतिरिक्त WAR स्प्रिंग बूट एप्लिकेशन के वसा जार में लाइब्रेरी जार लोड नहीं कर सकता है जिसमें डब्ल्यूएआर जोड़ा गया है।

+0

टैग विवरण पढ़ें। "एम्बेडेड" "एम्बेडिंग" नहीं है! – Olaf

+0

मैं वर्तमान में ऐसा करने की कोशिश कर रहा हूं ([यहां देखें] (http://stackoverflow.com/questions/42191815/cannot-add-web-plplication-to-built-in-tomcat)) लेकिन मुझे मिल रहा है अनुपलब्ध फ़ाइल निर्भरताओं के कारण अपवादों के टन। कोई विचार है कि मैं यहाँ क्या खो रहा हूँ? – displayname

उत्तर

19

आप Tomcat.addWebapp का उपयोग कर एम्बेडेड टोमकैट में एक युद्ध फ़ाइल जोड़ सकते हैं। जैसा कि इसके जावाडोक कहते हैं, यह "टॉमकैट की वेब ऐप्स निर्देशिका में वेब एप्लिकेशन जोड़ने के बराबर है"। स्प्रिंग बूट में इस एपीआई का उपयोग करने के लिए, आपको कस्टम TomcatEmbeddedServletContainerFactory सबक्लास का उपयोग करने की आवश्यकता है:

@Bean 
public EmbeddedServletContainerFactory servletContainerFactory() { 
    return new TomcatEmbeddedServletContainerFactory() { 

     @Override 
     protected TomcatEmbeddedServletContainer getTomcatEmbeddedServletContainer(
       Tomcat tomcat) { 
      // Ensure that the webapps directory exists 
      new File(tomcat.getServer().getCatalinaBase(), "webapps").mkdirs(); 

      try { 
       Context context = tomcat.addWebapp("/foo", "/path/to/foo.war"); 
       // Allow the webapp to load classes from your fat jar 
       context.setParentClassLoader(getClass().getClassLoader()); 
      } catch (ServletException ex) { 
       throw new IllegalStateException("Failed to add webapp", ex); 
      } 
      return super.getTomcatEmbeddedServletContainer(tomcat); 
     } 

    }; 
} 
+0

धन्यवाद! मैं आपके कोड के साथ एक युद्ध को एकीकृत करने में सफल रहा हूं। (कुछ चेतावनियां दिखाई देती हैं, लेकिन यह मेरे द्वारा जोड़े गए युद्ध के लिए विशिष्ट है और मुझे लगता है कि इसे हल किया जा सकता है)। – zeodtr

+6

एक मामूली समस्या: जब server.tomcat.basedir application.properties में निर्दिष्ट नहीं है, WAR विस्तार विफल रहता है। कारण निम्नानुसार है: यदि वह चर निर्दिष्ट नहीं है, तो वसंत एक अस्थायी निर्देशिका बनाता है और इसे आधार डीआईआर के रूप में निर्दिष्ट करता है। लेकिन उस निर्देशिका में 'wepapps' उपनिर्देशिका नहीं है जिसमें एम्बेडेड टॉमकैट WAR की विस्तारित फ़ाइलों के लिए एक उपनिर्देशिका mkdir() की कोशिश करता है। – zeodtr

+0

जब वसंत बूट आवेदन वसा जार से बना होता है, तो उपरोक्त कोड पर्याप्त नहीं है। कृपया मेरा अद्यतन देखें। – zeodtr

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