2012-10-01 26 views
7

के लिए एम्बेडेड जेटी सर्वर शुरू करना जो मैं करने की कोशिश कर रहा हूं, एक निष्पादन योग्य JAR फ़ाइल बनाना है जिसमें मेरी परियोजना होगी। मैं अपनी निर्भरता को शामिल किया है सही उसके बगल में, यह भी JAR फाइलों में, इसलिए मेरे निर्देशिका सूची कुछ इस तरह दिखता है:एक जेएआर फ़ाइल

~/Projects/Java/web-app/out:

web-app.jar

dependency1.jar

dependency2.jar

dependency3.jar

मुझे पता है और ठीक से यह सुनिश्चित करें कि मेरी समस्या, निर्भरता से ही नहीं उठता हूँ अपने आवेदन कार्यों के रूप में , ठीक उसी समय तक जब मैं जेटी एम्बेडेड शुरू करता हूं।

कोड मैं जेट्टी शुरू करने के लिए का उपयोग इस तरह है:

public class ServerExecutionGoal implements ExecutionGoal {  

    private final static Logger logger = Logger.getLogger(ServerExecutionGoal.class);  

    private WebAppContext getWebAppContext() throws IOException {  
     WebAppContext context = new WebAppContext();  
     System.out.println("context = " + context);  
     context.setResourceBase(new PathMatchingResourcePatternResolver().getResource("classpath:/webapp").getURL().toExternalForm());  
     context.setContextPath("/");  
     context.setLogger(new StdErrLog());  
     return context;  
    }  

    @Override  
    public void execute(Map<String, Object> stringObjectMap) throws ExecutionTargetFailureException {  
     logger.info("Instantiating target server ...");  
     final Server server = new Server(8089);  
     final ContextHandlerCollection handlerCollection = new ContextHandlerCollection();  
     try {  
      handlerCollection.setHandlers(new Handler[]{new RequestLogHandler(), getWebAppContext()});  
     } catch (IOException e) {  
      throw new ExecutionTargetFailureException("Could not create web application context", e);  
     }  
     server.setHandler(handlerCollection);  
     try {  
      logger.info("Starting server on port 8089 ...");  
      server.start();  
      server.join();  
      logger.info("Server started. Waiting for requests.");  
     } catch (Exception e) {  
      throw new ExecutionTargetFailureException("Failed to properly start the web server", e);  
     }  
    }  

    public static void main(String[] args) throws ExecutionTargetFailureException {  
     new ServerExecutionGoal().execute(null);  
    }  

}  

मैं पुष्टि कर सकते हैं कि "webapp" फ़ोल्डर /webapp करने के लिए अपने जार के अंदर सही ढंग से दूसरी जगह हो जाता है, और कहा कि जब मेरे आईडीई के माध्यम से कोड चलाने (IntelliJ IDEA 11) context.setResourceBase(new PathMatchingResourcePatternResolver().getResource("classpath:/webapp").getURL().toExternalForm()) प्रश्न में संसाधन के लिए मान्य रूप से नक्शे। साथ ही, मैं दिखा सकता हूं कि यह कुछ ऐसा हल करता है जैसे:

jar:file:~/Projects/Java/web-app/out/web-app.jar!/webapp 

और पहुंच योग्य है (मैंने इसे पढ़ा है)।

हालांकि, जब मैं अपने आवेदन के मुख्य विधि प्रारंभ करें, और जेट्टी, शुरू होता है http://localhost:8089 पर मैं निम्नलिखित हो:

HTTP ERROR: 503

Problem accessing /. Reason:

Service Unavailable 

Powered by Jetty://

कहाँ मैं गलत हो रहा हूँ?

मुझे पता है कि "संसाधनबेस" को "।" पर सेट करके। पता "http://localhost:8089" स्थान पर एक इंटरफ़ेस के रूप में कार्य करेगा "~/Projects/Java/web-app/out/" जहां मैं इसे डाउनलोड करने के लिए ऑफ़र करने पर क्लिक करने पर "web-app.jar" सहित सभी JAR फ़ाइलों की एक सूची देख सकता हूं।

मैं निम्न सवालों को देखा है, और जवाब लागू नहीं है:

  1. Embedded jetty application not working from jar: मैं NullPointerException पाने के बाद से Start.class.getProtectionDomain().getCodeSource()null को हल करता है।
  2. Embedded Jetty WebAppContext FilePermission issue: जिसका उत्तर केवल उत्तर नहीं दिया जाता है, लेकिन स्थिति स्पष्ट रूप से लागू नहीं होती है, क्योंकि मेरे पास अनुमति समस्या नहीं है (तथ्य यह है कि मुझे फ़ाइल सूची प्राप्त होनी चाहिए)।
  3. embedding jetty server problems: अनुत्तरित भी, लागू नहीं है क्योंकि मेरे पास कोई निर्भरता समस्या नहीं है (जैसा ऊपर ऊपर मेरी टिप्पणियों में बताया गया है)।

मुझे लगता है कि मैं किसी भी तरह /webapp फ़ोल्डर, जो मेरी src/main/resources/ निर्देशिका के अंतर्गत स्थित है और मेरे वेब अनुप्रयोग में बंडल किया गया है का उपयोग करने की जेट्टी सक्षम होना चाहिए। क्या मुझे एक बंडल किए गए वेब एप्लिकेशन को त्यागना चाहिए और इसके बजाय जेटी द्वारा कहीं भी सुलभ संदर्भ पथ को तैनात करना चाहिए (यह वांछनीय नहीं है क्योंकि यह मेरे और मेरे ग्राहकों के लिए कई मुद्दों का मुद्दा है)।

+0

तुम एक युद्ध फ़ाइल के साथ context.setWar (...) इस्तेमाल कर सकते हैं। यह सिर्फ आपके वितरण में एक फ़ाइल जोड़ देगा। –

+0

मुझे भी इसी तरह का मुद्दा सामना करना पड़ रहा है। जब सर्वर ग्रहण से शुरू होता है तो मुझे अनुरोध के लिए उचित प्रतिक्रिया मिल रही है। लेकिन जब इसे cmd से एक जार फ़ाइल से चलाया जाता है, तो मुझे 404 मिलते हैं। किसी भी मदद की सराहना की जाती है। –

उत्तर

0

मुझे यकीन नहीं है, अगर जेटी के WebAppContext का उपयोग PathMatchingResourcePatternResolver के साथ किया जा सकता है!

मेरी परियोजनाओं में से एक में मैंने अपनी समस्या javax.servlet.Filter लिखकर हल की, जो अनुरोधित संसाधनों को Class#getResourceAsStream द्वारा लोड करता है। Class#getResourceAsStream एक जार के अंदर और संसाधन संसाधन (उदा। मैवेन) के अंदर से संसाधनों को पढ़ता है।

आशा इस टिप आप के लिए उपयोगी है, चियर्स थिलो