2012-05-29 6 views
7

मेरे पास मेवेन और जेट्टी के साथ एक बहुत ही सरल वेबपैप प्रोजेक्ट है जो अब तक बहुत अच्छी तरह से काम कर रहा है। लेकिन अब मुझे जेएनडीआई के साथ MySQL कनेक्शन पूलिंग सेट करने की आवश्यकता है क्योंकि डेटाबेस कनेक्शन हमेशा समय समाप्त हो जाते हैं।डेटासोर्स के साथ जेट्टी-एनवी.एक्सएमएल एमवीएन जेटटी पर वेबएप कॉन्टेक्स्ट में विफल होने की ओर जाता है:

<modelVersion>4.0.0</modelVersion> 
... 
<packaging>war</packaging> 
... 
<properties> 
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 
    <jetty-version>8.1.0.v20120127</jetty-version> 
</properties> 
<dependencies> 
    ... 
    <dependency> 
     <groupId>mysql</groupId> 
     <artifactId>mysql-connector-java</artifactId> 
     <version>5.1.20</version> 
    </dependency> 
    <dependency> 
     <groupId>org.mortbay.jetty</groupId> 
     <artifactId>jetty-maven-plugin</artifactId> 
     <version>${jetty-version}</version> 
     <type>maven-plugin</type> 
    </dependency> 
</dependencies> 
... 
<build> 
    <plugins> 
    <plugin> 
     <groupId>org.mortbay.jetty</groupId> 
     <artifactId>jetty-maven-plugin</artifactId> 
     <version>${jetty-version}</version> 
     <configuration> 
       <scanIntervalSeconds>10</scanIntervalSeconds> 
      </configuration> 
     </plugin> 
    </plugins> 
    ... 
</build> 

अब मैं निम्नलिखित के साथ फ़ोल्डर/src/मुख्य/webapp/वेब-INF में एक घाट-env.xml बनाया:

सब यहाँ सबसे पहले मेरी pom.xml की प्रासंगिक सामग्री है सामग्री:

<Configure class="org.eclipse.jetty.webapp.WebAppContext"> 
    <New id="project-db" class="org.eclipse.jetty.plus.jndi.Resource"> 
     <Arg>jdbc/db</Arg> 
     <Arg> 
      <New class="com.mysql.jdbc.jdbc2.optional.MysqlConnectionPoolDataSource"> 
       <Set name="url">jdbc:mysql://www.example.com:3306/mydb</Set> 
       <Set name="username">dbuser</Set> 
       <Set name="password">dbpass</Set> 
      </New> 
     </Arg> 
    </New> 
</Configure> 

लेकिन समस्या यह है कि मैं भी घाट-Maven-प्लगइन के रूप में लक्ष्य पर शुरू करने के लिए विफल रहता है इस संबंध में काम करता है, तो परीक्षण नहीं कर सकते है

mvn jetty:run 

निम्न त्रुटि के साथ:

WARN:oejw.WebAppContext:Failed startup of context o.m.j.p.JettyWebAppContext 
{/,file:/D:/documents/programmierung/workspace/battleships-trunk/src/main/webapp/} 
,file:/D:/documents/programmierung/workspace/battleships-trunk/src/main/webapp/ 

java.lang.IllegalArgumentException: Object of class 
'org.mortbay.jetty.plugin.JettyWebAppContext' is not of type 
'org.eclipse.jetty.webapp.WebAppContext'. 
Object Class and type Class are from different loaders. 

तो कैसे मैं यह काम करने के लिए मिल सकता है? मैं जेट्टी संस्करण 8.x उपयोग करने के लिए के रूप में मैं WebSocket समर्थन की जरूरत के लिए मजबूर कर रहा हूँ और दूरदराज के उत्पादक सर्वर के रूप में जेट्टी 8. चल रहा हो जाएगा

संपादित पहले पावेल Veller का जवाब मैंने कोशिश की है: के लिए इकट्ठा युद्ध प्रसारित दूरस्थ jetty8 सर्वर और एक ही गलती केवल यह है कि पिछले त्रुटि अब के रूप में पढ़ता है:

java.lang.IllegalArgumentException: Object of class 
'org.eclipse.jetty.webapp.WebAppContext' is not of type 
'org.eclipse.jetty.webapp.WebAppContext'. 
Object Class and type Class are from different loaders. 

तो ऐसा लगता है के रूप में एक से अधिक वर्ग लोडर परस्पर विरोधी हैं।

EDIT2 पावेल द्वारा अनुरोध के रूप में मैं एक सरल webapp जो आप here on Dropbox पा सकते हैं के साथ त्रुटि निर्मित। यह एक ज़िप्ड ग्रहण मेवेन प्रोजेक्ट है।

+0

इस समस्या का डेटा स्रोत से कोई लेना देना नहीं है। मेरे पास jetty-env.xml बिल्कुल नहीं है। – Lucky

उत्तर

7

jetty-maven-plugin पर निर्भरता को हटाने का प्रयास करें - यह निर्भरता प्लगइन को WAR में जोड़ती है, जिसे आप नहीं चाहते हैं।

यदि आपको जेटी से किसी भी कक्षा का उपयोग करने की आवश्यकता है, तो provided के दायरे के साथ जेटी के विशिष्ट संस्करण (प्लगइन के बजाए) के लिए निर्भरता जोड़ें।

+0

वास्तव में मुझे एक कदम आगे मिला, धन्यवाद। ऐसा लगता है कि इसने मेवेन की मेरी समझ में सुधार किया है;) हालांकि अब मेरे पास एक नई त्रुटि है जो निम्नानुसार पढ़ती है: 'java.lang.No.SuchMethodException: class com.mysql.jdbc.jdbc2.optional.MysqlConnectionPoolDataSource.setUsername (class java.lang .Sring) 'जो' ... के कारण होता है जब 'जेटी का XML कॉन्फ़िगरेशन मेरी jetty-env.xml को पार करता है। ** संपादित करें ** ठीक है, मैंने गलत टाइप किया है, इसे 'name = "उपयोगकर्ता" 'पढ़ना चाहिए। अब ऐसा लगता है कि काम कर रहा है। आपका बहुत बहुत धन्यवाद! – ckuepker

+0

@ कोंटा, ठीक है, मैंने कहा कि आपके क्लासपाथ पर कहीं भी जेट्टी कक्षाओं का दो संस्करण था :) खुशी है कि आपने इसे हल किया है –

+1

इस मुद्दे के साथ काफी संघर्ष के बाद यह प्रदान करने के लिए नीचे आया। धन्यवाद! – remrick

1

ऐसा लगता है कि यह कहीं से जेटी 6 खींच रहा है। आप जो अपवाद देख रहे हैं वह उस कोड से आ रहा है जो jetty-env.xml (org.mortbay.jetty.plus.webapp.EnvConfiguration) पार्स करता है। XMLConfiguration कक्षा से प्राप्त होने वाली वास्तविक कक्षा के साथ Configure तत्व पर घोषित कक्षा की तुलना करता है। उत्तरार्द्ध आपके मामले में instance of org.mortbay.jetty.plugin.JettyWebAppContext है और आप इसे org.eclipse.jetty.webapp.WebAppContext (जो JettyWebAppContext के लिए मूल श्रेणी होगी) वे दोनों एक ही "नेमस्पेस" से आए थे)।

यह कहना मुश्किल है कि यह कहां से हो रहा है लेकिन शायद आपके .m2 का निरीक्षण करें और पुष्टि करें कि आपके जेटी निर्भरताओं के लिए उचित बाइनरी हैं? इसे उस संस्करण को चलाने की ज़रूरत नहीं है जिसे आप चलाने की उम्मीद करते हैं।

अद्यतन। सभी getParent() के माध्यम से

  1. Thread.currentThread().getContextClassLoader() के साथ पहली बार लोड और पाश जब तक सभी विकल्प समाप्त कर रहे हैं: जब यह विन्यास में परिभाषित वर्गों को लोड करता है जेट्टी निम्नलिखित है।
  2. सफल नहीं होने पर, जेटी कोर क्लासेस (XmlConfiguration.class.getClassLoader()) लोड करने वाले वर्ग लोडर के साथ लोड करने का प्रयास करें, सभी माता-पिता के माध्यम से भी लूपिंग।
  3. अगर अब भी सफल नहीं, एक Class.forName()
  4. रिपोर्ट ClassNotFoundException करते हैं सफल नहीं।

आप org.mortbay.util.Loader के कोड में देख सकते हैं

यह आपके मामले में वर्ग लोड करता है (http://grepcode.com हुड के नीचे का शीघ्रता से अवलोकन के लिए एक महान संसाधन है), लेकिन जाहिरा तौर सही साथ नहीं कक्षा लोडर।

अब मैं यह मान लेगा कि अपने classpath कि चीजों के आदेश के साथ हस्तक्षेप पर कहीं एक अतिरिक्त घाट जार की है।

+0

यह एक अच्छा सुझाव की तरह लगता है लेकिन इस बीच मैंने दूरस्थ उत्पादक सर्वर पर इकट्ठे युद्ध की कोशिश की। वहां यह वही त्रुटि रिपोर्ट करता है लेकिन 'org.mortbay.jetty.plugin.JettyWebAppContext 'के बजाय ' org.eclipse.jetty.webapp.WebAppContext 'प्रकार का नहीं है। अब यह' org.eclipse.jetty 'रिपोर्ट करता है। webapp.WebAppContext ' ' org.eclipse.jetty.webapp.WebAppContext 'प्रकार का नहीं है, इसलिए क्लास लोडर के साथ एक अलग समस्या प्रतीत होती है। (उस जानकारी को प्रारंभिक प्रश्न में अभी लेना) – ckuepker

+0

ठीक है, यह सुनिश्चित करने के लिए कि मैंने बाइनरी की जांच की है। सभी संस्करण सही हैं। मैंने .m2 से डाउनलोड किए गए JAR को भी हटा दिया और m2e को दोबारा डाउनलोड करने दें। कुछ नहीं बदला। – ckuepker

+0

@ कॉन्ट्रा, मैंने जेटी को उन वर्गों को कैसे लोड किया है, इस बारे में विवरण के साथ मेरा जवाब अपडेट किया। देखें कि आपके क्लासपैथ पर कहीं से अधिक जेटी जेएआर हैं या नहीं। दुर्भाग्यवश, इस तरह के प्रश्न पर्यावरण तक पहुंच के बिना समस्या निवारण करना मुश्किल है।आप और मुझे पता है कि यह काम करना चाहिए (यह अन्य लोगों के लिए है, है ना?) लेकिन यह आपके विशेष मामले में काम नहीं करता है। कुछ आपके विशेष मामले के साथ बिल्कुल सही नहीं होना चाहिए और हमें यह पता लगाने की जरूरत है कि यह क्या है ... –

0

की वजह से एक ही मुद्दा था: यह classpath में एक अतिरिक्त घाट जार डाल

<useTestClasspath>true</useTestClasspath> (true instead of false) 

...

-1

मैं एक ही मुद्दा था और यह तय हो गई लेकिन क्यों समझ नहीं कर सकते हैं।

org.eclipse.jetty.webapp.WebAppContext 

बदलते

org.eclipse.jetty.maven.plugin.JettyWebAppContext 

करने से यह किसी कारण के लिए काम करने के लिए, वास्तव में समझ नहीं क्यों शुरू कर दिया। जाहिर है मैवेन प्लगइन के साथ कुछ करने के लिए है?

0

निर्भरता के दायरे सहित मेरे लिए त्रुटि हल हो गई।

<scope>provided</scope> 

pom.xml यह ऐसा दिखाई देगा में,

<!-- JETTY DEPENDENCIES --> 
<dependency> 
    <groupId>org.eclipse.jetty</groupId> 
    <artifactId>jetty-server</artifactId> 
    <version>${jetty.version}</version> 
    <scope>provided</scope> 
</dependency> 
<dependency> 
    <groupId>org.eclipse.jetty</groupId> 
    <artifactId>jetty-servlet</artifactId> 
    <version>${jetty.version}</version> 
    <scope>provided</scope> 
</dependency> 
<dependency> 
    <groupId>org.eclipse.jetty</groupId> 
    <artifactId>jetty-webapp</artifactId> 
    <version>${jetty.version}</version> 
    <scope>provided</scope> 
</dependency> 
<dependency> 
    <groupId>org.eclipse.jetty</groupId> 
    <artifactId>jetty-servlets</artifactId> 
    <version>${jetty.version}</version> 
    <scope>provided</scope> 
</dependency> 
घाट निर्भरता और त्रुटियों में

बंद हो गई। और बीटीडब्ल्यू, जेटी संस्करण जो मैं उपयोग कर रहा हूं वह 9.3.7.v20160115 है।

+0

उह, कहाँ? किस निर्भरता में? क्या आप इसे कहां डालने के लिए कुछ और संदर्भ प्रदान कर सकते हैं? – Cheeso

+0

@ चेसियो क्षमा करें कि मेरा जवाब विस्तार से समझा नहीं रहा था। जैसा कि मैंने पहले ही जवाब में इसका उल्लेख किया है, मैंने इसे जेटी-निर्भरताओं के तहत pom.xml के तहत शामिल किया है। मैंने इसे अपडेट किया है। ;) – Lucky

+0

धन्यवाद, @ भाग्यशाली! – Cheeso

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

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