2012-05-12 20 views
40

मैवेन का पहला उपयोग और मैं निर्भरताओं के साथ अटक गया हूं।मेवेन निर्भरता पर NoClassDefFoundError

मैंने ग्रहण के साथ एक मेवेन प्रोजेक्ट बनाया और निर्भरताओं को जोड़ा, और यह बिना किसी समस्या के काम कर रहा था।

लेकिन जब मैं कमांड लाइन के माध्यम से इसे चलाने के लिए प्रयास करें:

Exception in thread "main" java.lang.NoClassDefFoundError: org/codehaus/jackson/JsonParseException 
     at tr.edu.hacettepe.cs.b21127113.bil138_4.db.DatabaseManager.<init>(DatabaseManager.java:16) 
     at tr.edu.hacettepe.cs.b21127113.bil138_4.db.DatabaseManager.<init>(DatabaseManager.java:22) 
     at tr.edu.hacettepe.cs.b21127113.bil138_4.App.main(App.java:10) 
Caused by: java.lang.ClassNotFoundException: org.codehaus.jackson.JsonParseException 
     at java.net.URLClassLoader$1.run(URLClassLoader.java:217) 
     at java.security.AccessController.doPrivileged(Native Method) 
     at java.net.URLClassLoader.findClass(URLClassLoader.java:205) 
     at java.lang.ClassLoader.loadClass(ClassLoader.java:321) 
     at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:294) 
     at java.lang.ClassLoader.loadClass(ClassLoader.java:266) 
     ... 3 more 

मेरे पोम:

$ mvn package # successfully completes 
$ java -cp target/bil138_4-0.0.1-SNAPSHOT.jar tr.edu.hacettepe.cs.b21127113.bil138_4.App # NoClassDefFoundError for dependencies 

यह निर्भरता डाउनलोड करता है, सफलतापूर्वक बनाता है, लेकिन जब मैं इसे चलाने के लिए प्रयास करते हैं, मैं NoClassDefFoundError मिल .xml इस तरह है:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 

    <groupId>tr.edu.hacettepe.cs.b21127113</groupId> 
    <artifactId>bil138_4</artifactId> 
    <version>0.0.1-SNAPSHOT</version> 
    <packaging>jar</packaging> 

    <name>bil138_4</name> 
    <url>http://maven.apache.org</url> 

    <properties> 
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 
    </properties> 

    <dependencies>   
    <dependency> 
      <groupId>org.codehaus.jackson</groupId> 
      <artifactId>jackson-core-asl</artifactId>   
    </dependency> 
     <dependency> 
      <groupId>org.codehaus.jackson</groupId> 
      <artifactId>jackson-mapper-asl</artifactId>    
     </dependency> 
    </dependencies> 
    <dependencyManagement> 
    <dependencies> 
    <dependency> 
     <groupId>org.codehaus.jackson</groupId> 
     <artifactId>jackson-core-asl</artifactId> 
     <version>1.9.6</version> 
    </dependency> 
    <dependency> 
     <groupId>org.codehaus.jackson</groupId> 
     <artifactId>jackson-mapper-asl</artifactId> 
     <version>1.9.6</version> 
    </dependency> 
    </dependencies> 
    </dependencyManagement> 
</project> 

क्या कोई मेरी मदद कर सकता है?

उत्तर

16

when I try to run it, I get NoClassDefFoundError

इसे कैसे चलाएं? आप शायद अपने मैवेन क्लासपाथ को सही तरीके से आयात किए बिना ग्रहण के साथ चलाने की कोशिश कर रहे हैं। इसके लिए ग्रहण के साथ मेवेन को एकीकृत करने के लिए m2eclipse प्लगइन देखें।

सत्यापित करने के लिए कि आपके Maven config सही है, तो आप exec plugin उपयोग करने के साथ अपने अनुप्रयोग चला सकते हैं:

mvn exec:java -D exec.mainClass=<your main class> 

अद्यतन: सबसे पहले, जब exec:java चल अपने त्रुटि के बारे में, अपने मुख्य वर्ग tr.edu.hacettepe.cs.b21127113.bil138_4.App है। कक्षा के नामों के बारे में बात करते समय, वे हमेशा (लगभग) हमेशा डॉट से अलग होते हैं। सरल वर्ग का नाम सिर्फ अंतिम भाग है: App आपके मामले में। पूरी तरह से योग्य नाम पूर्ण पैकेज प्लस सरल वर्ग का नाम है, और जब आप कुछ चलाने के लिए मेवेन या जावा को देते हैं तो यही वह है। आप जो उपयोग करने का प्रयास कर रहे थे वह स्रोत फ़ाइल के लिए एक फ़ाइल सिस्टम पथ था। यह एक पूरी तरह से अलग जानवर है। एक वर्ग का नाम आम तौर पर फ़ाइल सिस्टम में स्रोत फ़ाइल की तुलना में क्लास पथ में पाया गया क्लास फ़ाइल में सीधे अनुवाद करता है। आपके विशिष्ट मामले में, प्रश्न में कक्षा फ़ाइल शायद target/classes/tr/edu/hacettepe/cs/b21127113/bil138_4/App.class पर होगी क्योंकि मैवेन target/classes पर संकलित होता है, और जावा परंपरागत रूप से प्रत्येक स्तर के पैकेजिंग के लिए एक निर्देशिका बनाता है।

आपकी मूल समस्या यह है कि आपने जैक्सन जार को अपने क्लास पथ पर नहीं रखा है। जब आप कमांड लाइन से जावा प्रोग्राम चलाते हैं, तो आपको क्लास पथ सेट करना होगा ताकि यह पता चल सके कि यह कक्षाएं कहां से लोड कर सकता है। आपने अपना खुद का जार जोड़ा है, लेकिन अन्य आवश्यक नहीं। आपकी टिप्पणी मुझे लगता है कि आप समझ नहीं पाते कि मैन्युअल रूप से क्लास पथ कैसे बनाया जाए। संक्षेप में, कक्षा पथ में दो चीजें हो सकती हैं: क्लास फाइलों वाली श्रेणी फाइलें और जार जिसमें क्लास फाइलें होती हैं। जार युक्त निर्देशिकाएं काम नहीं करेंगी। कक्षा पथ बनाने के बारे में अधिक जानकारी के लिए, "Setting the class path" और java और javac टूल दस्तावेज़ देखें।

आपका वर्ग पथ कम से कम, और बिना लाइन फ़ीड करने की आवश्यकता होगी:

target/bil138_4-0.0.1-SNAPSHOT.jar: 
/home/utdemir/.m2/repository/org/codehaus/jackson/jackson-core-asl/1.9.6/jackson-core-asl-1.9.6.jar: 
/home/utdemir/.m2/repository/org/codehaus/jackson/jackson-mapper-asl/1.9.6/jackson-mapper-asl-1.9.6.jar 

ध्यान दें कि विंडोज पर विभाजक अर्धविराम है (;)।

मैं इसे जल्द से जल्द ध्यान देने के लिए क्षमा चाहता हूं। समस्या आपकी मूल पोस्ट में बैठी थी, लेकिन मुझे याद आया।

+0

यह त्रुटि प्राप्त करना: http://pastebin.com/g2txkMY6। मैं इसे mcleclipse प्लगइन के साथ ग्रहण पर चला सकता हूं, मैंने इस पर एप्लिकेशन विकसित किया। मैं सिर्फ यह नहीं समझ सकता कि इसे कमांड लाइन के माध्यम से कैसे चलाया जाए। और मेरे मैवेन क्लासपाथ को कैसे आयात करें? संपादित करें: जावा कमांड में -classpath /home/utdemir/.m2/repository/ पैरामीटर जोड़ने के साथ प्रयास किया, अभी भी कोई भाग्य नहीं है। – utdemir

+1

मेरा जवाब अपडेट किया गया। –

+0

धन्यवाद। क्लासपाथ को सेट करते हुए आप समस्या हल करते हैं, प्रश्न को सुलझाने के रूप में चिह्नित करते हैं।लेकिन मेरे पास कुछ और प्रश्न हैं: 1- मुझे प्लगइन के लिए क्लासपाथ में जैक्सन क्यों नहीं जोड़ना है? 2- Exec प्लगइन को मेरे प्रोजेक्ट को संकलित करने की आवश्यकता है, इसलिए मुझे एमवीएन संकलन या पैकेज चलाया जाना चाहिए, है ना? 3- यह कोड मेरा असाइनमेंट है, क्या उनके क्लासपाथ में पुस्तकालय जोड़ना उनकी ज़िम्मेदारी है, या मुझे इसके बारे में कुछ करना है? – utdemir

80

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

आप क्लासपाथ पर -cp पैरामीटर के साथ मैन्युअल रूप से लाइब्रेरी निर्दिष्ट कर सकते हैं, लेकिन यह जल्दी से थकाऊ हो जाता है।

एक बेहतर समाधान पुस्तकालय कोड को आपके आउटपुट JAR फ़ाइल में "छाया" करना है। ऐसा करने के लिए maven-shade-plugin नामक एक मेवेन प्लगइन है। आपको इसे अपने पीओएम में पंजीकृत करने की आवश्यकता है, और जब आप mvn package चलाते हैं तो यह आपके पुस्तकालय कोड के लिए स्वचालित रूप से "uber-JAR" बनाएगा।

बस, सभी आवश्यक पुस्तकालयों बंडल को जोड़ने के लिए अपने पोम के लिए निम्न:

$ mvn package 
$ java -cp target/bil138_4-0.0.1-SNAPSHOT.jar tr.edu.hacettepe.cs.b21127113.bil138_4.App 

यदि आप चाहते हैं करने के लिए:

<project> 
    ... 
    <build> 
    <plugins> 
     <plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-shade-plugin</artifactId> 
     <version>1.6</version> 
     <executions> 
      <execution> 
      <phase>package</phase> 
      <goals> 
       <goal>shade</goal> 
      </goals> 
      </execution> 
     </executions> 
     </plugin> 
    </plugins> 
    </build> 
    ... 
</project> 

इसके पूर्ण होते ही, आप आदेशों को आप ऊपर के लिए इस्तेमाल किया जा सकता है फिर से चलाएं JARs को शामिल करने के संदर्भ में छाया प्लगइन की और कॉन्फ़िगरेशन करें, निष्पादन योग्य JAR फ़ाइल के लिए मुख्य श्रेणी निर्दिष्ट करना, और इसी तरह, maven-shade-plugin site पर "उदाहरण" अनुभाग देखें।

+3

यदि कोई इस उत्तर में चलता है, तो यहां वह जगह है जहां आप प्लगइन का वास्तविक संस्करण प्राप्त कर सकते हैं, क्योंकि 1.6 अब बहुत पुराना है: http://mvnrepository.com/artifact/org.apache.maven.plugins/maven-shade -प्लगिन – Scadge

2

आपको अपनी निर्भरता के लिए पोम फ़ाइल में क्लासपाथ बनाना है। इसलिए आपको सभी निर्भरताओं को एक स्थान पर कॉपी करना होगा।

मेरे ब्लॉग की जांच करें। http://madhawagunasekara.blogspot.com/2014/10/solving-javalangnoclassdeffounderror-in.html

<build> 
 
    <plugins> 
 
    <plugin> 
 
    <groupId>org.apache.maven.plugins</groupId> 
 
    <artifactId>maven-dependency-plugin</artifactId> 
 
    <version>2.1</version> 
 
    <executions> 
 
    <execution> 
 
     <id>copy-dependencies</id> 
 
     <phase>package</phase> 
 
     <goals> 
 
     <goal>copy-dependencies</goal> 
 
     </goals> 
 
     <configuration> 
 
     <outputdirectory>${project.build.directory}/lib</outputdirectory> 
 
     <overwritereleases>false</overwritereleases> 
 
     <overwritesnapshots>false</overwritesnapshots> 
 
     <overwriteifnewer>true</overwriteifnewer> 
 
     </configuration> 
 
    </execution> 
 
    </executions> 
 
    </plugin> 
 
    <plugin> 
 
    <groupId>org.apache.maven.plugins</groupId> 
 
    <artifactId>maven-jar-plugin</artifactId> 
 
    <version>2.4</version> 
 
    <configuration> 
 
    <archive> 
 
     <manifest> 
 
     <addClasspath>true</addClasspath> 
 
     <classpathPrefix>lib/</classpathPrefix> 
 
     <mainClass>$fullqualified path to your main Class</mainClass> 
 
     </manifest> 
 
    </archive> 
 
    </configuration> 
 
    </plugin> 
 
    
 
    </plugins> 
 
    
 
    
 
</build>

-2

परियोजना का चयन -> स्वच्छ समाधान हो जाना चाहिए इस

2

यह अफ़ीम का सत्त्व जार अपने उत्पादन युद्ध/जार का हिस्सा नहीं होने के कारण है। ग्रहण या स्थानीय निर्माण में उन्हें कक्षा के हिस्से के रूप में शामिल किया गया है, लेकिन रिमोट बिल्ड या ऑटो/अनुसूचित बिल्ड उन्हें क्लासपाथ का हिस्सा नहीं मानते हैं।

आप प्लगइन का उपयोग कर निर्भर जार शामिल कर सकते हैं।

नीचे जोड़े अपने पोम के प्लगइन्स अनुभाग

<plugin> 
     <artifactId>maven-assembly-plugin</artifactId> 
     <version>3.0.0</version> 
     <configuration> 
      <descriptorRefs> 
       <descriptorRef>jar-with-dependencies</descriptorRef> 
      </descriptorRefs> 
     </configuration> 
    </plugin> 
-1

में झलकी मेरे मामले में, Maven बाइनरी अपने कॉर्पोरेट लैपटॉप (Program Files \ Maven) में एक सुरक्षित फ़ोल्डर में रखा गया है, जिससे मुसीबतों Maven खींचने के लिए/निर्भरता को बचाने खजाने, इसलिए deps नहीं पाए जाते हैं (NoClassDefFoundError)

बस जगह Maven में c: \ Maven

Instructions

+0

इस उत्तर के पास ओपी के सवाल से कोई लेना देना नहीं है। – shiri

+0

मेरे मामले में, त्रुटि वही थी: NoClassDefFoundError पीछे कारण: परियोजना की जावा निर्भरताएं नहीं मिलीं; मेवेन सही ढंग से भंडार बनाने/प्रबंधित करने में सक्षम नहीं था। इस त्रुटि को लागू करने के बाद इस त्रुटि को अपरिवर्तित किया गया, ऊपर साझा किया गया ... @shiri आप कैसे कह सकते हैं कि मेरे उत्तर के प्रश्न के साथ कुछ लेना देना नहीं है ?? – cepix

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