2016-06-26 4 views
0

Ich versuche, ein lauffähiges Glas aus dieser Java-Bibliothek zu erstellen:Wie java.lang.NoClassDefFoundError beim Exportieren von runnable jar in Intellij IDEA zu beheben?

https://github.com/Jefferson-Henrique/GetOldTweets-java

Einmal mit Eingaben über die Befehlszeile erstellt, soll das Glas der Lage sein, laufen.

Die Hauptdatei ist diese Exporter Klasse:

package me.jhenrique.main; 

import java.io.BufferedWriter; 
import java.io.FileWriter; 
import java.io.IOException; 
import java.text.SimpleDateFormat; 

import me.jhenrique.manager.TweetManager; 
import me.jhenrique.manager.TwitterCriteria; 
import me.jhenrique.model.Tweet; 

public class Exporter { 

    private static final SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd"); 

    public static void main(String[] args) { 
     if (args == null || args.length == 0) { 
      System.err.println("You must pass some parameters. Use \"-h\" to help."); 
      System.exit(0); 
     } 

     if (args.length == 1 && args[0].equals("-h")) { 
      System.out.println("\nTo use this jar, you can pass the folowing attributes:"); 
      System.out.println(" username: Username of a specific twitter account (without @)"); 
      System.out.println("  since: The lower bound date (yyyy-mm-aa)"); 
      System.out.println("  until: The upper bound date (yyyy-mm-aa)"); 
      System.out.println("querysearch: A query text to be matched"); 
      System.out.println(" maxtweets: The maximum number of tweets to retrieve"); 

      System.out.println("\nExamples:"); 
      System.out.println("# Example 1 - Get tweets by username [barackobama]"); 
      System.out.println("java -jar got.jar username=barackobama maxtweets=1\n"); 

      System.out.println("# Example 2 - Get tweets by query search [europe refugees]"); 
      System.out.println("java -jar got.jar querysearch=\"europe refugees\" maxtweets=1\n"); 

      System.out.println("# Example 3 - Get tweets by username and bound dates [barackobama, '2015-09-10', '2015-09-12']"); 
      System.out.println("java -jar got.jar username=barackobama since=2015-09-10 until=2015-09-12 maxtweets=1"); 
     } else { 
      TwitterCriteria criteria = TwitterCriteria.create(); 

      for (String parameter : args) { 
       String[] parameterSplit = parameter.split("="); 

       if (parameterSplit[0].equals("username")) { 
        criteria.setUsername(parameterSplit[1]); 
       } else if (parameterSplit[0].equals("since")) { 
        criteria.setSince(parameterSplit[1]); 
       } else if (parameterSplit[0].equals("until")) { 
        criteria.setUntil(parameterSplit[1]); 
       } else if (parameterSplit[0].equals("querysearch")) { 
        criteria.setQuerySearch(parameterSplit[1]); 
       } else if (parameterSplit[0].equals("maxtweets")) { 
        criteria.setMaxTweets(Integer.valueOf(parameterSplit[1])); 
       } 
      } 

      try { 
       BufferedWriter bw = new BufferedWriter(new FileWriter("output_got.csv")); 
       bw.write("username;date;retweets;favorites;text;geo;mentions;hashtags;id;permalink"); 
       bw.newLine(); 

       System.out.println("Searching... \n"); 
       for (Tweet t : TweetManager.getTweets(criteria)) { 
        bw.write(String.format("%s;%s;%d;%d;\"%s\";%s;%s;%s;\"%s\";%s", t.getUsername(), sdf.format(t.getDate()), t.getRetweets(), t.getFavorites(), t.getText(), t.getGeo(), t.getMentions(), t.getHashtags(), t.getId(), t.getPermalink())); 
        bw.newLine(); 
       } 

       bw.close(); 

       System.out.println("Done. Output file generated \"output_got.csv\"."); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 

    } 

} 

Es gibt auch eine TweetManager.java Datei, TwitterCriteria.java Datei und Tweet.java Datei im Ordner src. (Die Main.java-Datei zeigt nur Beispiele dafür, wie Code verwendet werden sollte.) Außerdem befinden sich zwei jars im libs-Ordner für dieses Projekt, "json-20140107.jar" und "jsoup-1.8.1.jar".

Ich mache eine kleine Änderung im Java-Code und ich möchte die got.jar-Datei mit dieser Änderung neu erstellen. Ich benutze Intellij IDEA. Ich habe keine Java-Erfahrung, daher war dieser Prozess bisher ziemlich rätselhaft.

Das Problem (glaube ich) ist, dass, wenn ich das Glas, das ich erstellt habe, das Glas ist nicht in der Lage, die beiden Libs Gläser "json-20140107.jar" und "jsoup-1.8.1.jar" zu finden. Der Ausgang I von Terminal bekommen, ist dies:

main_jar$ java -jar main.jar querysearch="europe refugees" maxtweets=1 
Searching... 

Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/http/client/HttpClient 
    at me.jhenrique.main.Exporter.main(Exporter.java:64) 
Caused by: java.lang.ClassNotFoundException: org.apache.http.client.HttpClient 
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424) 
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357) 
    ... 1 more 

die runnable Glas in IntelliJ Bei der Herstellung, I "jar" in der Artefakte Registerkarte ausgewählt, überprüft die "Build auf make" Feld haben "Exporteur", wie mein Haupt Klasse und stellte sicher, dass mein Klassenpfad auf den Ordner mit den Ordnern json und jsoup zeigte. Ich habe auch die json und jsoup Bibliotheken unter "Abhängigkeiten" in der Registerkarte Module aufgeführt. (Diese waren alle Vorschläge aus früheren Antworten auf dieses Problem bezogen.)

enter image description here

enter image description here

enter image description here

Ich habe alle anderen Vorschläge habe ich versucht, zu diesem Thema finden konnte, und nichts hat funktioniert um diesen Fehler zu vermeiden. Was mache ich falsch?

Edit: Gelöst - Problem war ich Maven für zusätzliche Abhängigkeit Downloads zu verwenden, benötigen wurde mir klar, das Problem war, dass ich zusätzliche Abhängigkeiten hatte (neben dem json und jsoup Gläser), die automatisch von Maven heruntergeladen werden mußte, die wasn Es passiert nicht, weil ich das Projekt nicht als Maven-Projekt in Intellij importiert habe. Ich wusste zuerst nicht, was Maven war, aber als ich mir die pom.xml-Datei in dem Code ansah, den ich benutzte, sah ich, dass die Apache-HttpClient-Bibliothek zusätzlich zu den json- und jsoup-Bibliotheken referenziert wurde, und das hatte ich nicht Ein Jar für die HttpClient-Bibliothek.

Sobald ich das Projekt als Maven-Projekt importiert hatte, wurden die zusätzlichen Abhängigkeiten automatisch heruntergeladen und die exportierte JAR-Datei funktionierte wie erwartet. Vielen Dank an Will für eine sehr klare Erklärung, die mir sicherte, dass ich nicht die Bibliotheken importierte, die ich bereits hatte!

hatte ich ein letztes kleines Problem mit Maven und Intellij deren Lösung ich hier, falls jemand anderes bekommt die „kein Haupt Manifest Attribut“ Fehler mit Maven und Intellij: Wrong Manifest.mf in IntelliJ IDEA created .jar

Antwort

0

Sie sollen entweder enthalten, die Abhängigkeiten in das Glas oder halten Sie das Glas mit den Bibliotheken, von denen es abhängt.Leider habe ich zu wenig Erfahrung mit IDEA (keine), um Ihnen zu sagen, wie man Include-Abhängigkeiten in ein Jar aufnehmen kann.

+0

Vielen Dank für den Tipp Olav - Ich endete mit den Abhängigkeiten im Glas, sobald ich mein Problem (das war ich Maven nicht verwenden, um automatisch zusätzliche Abhängigkeiten herunterladen, die ich brauchte). – dimachidy

0

Ich hatte schnell ein Glas mit einer Abhängigkeit von einem anderen Jar erstellen.

Ich habe zuerst die Bibliothek zu meinem Projekt IntelliJ mit

IntelliJ Libraries

Ich habe dann das Glas von ‚Von Modulen mit Abhängigkeiten‘ auf Artefakte und Auswahl gehen From modules with dependencies

Ich habe dann die Hauptklasse für das Glas Set main class for jar

Mein abgeschlossenes Glas-Setup sah so aus.

completed jar setup

zum Menü Erstellen Dann gehen Sie und wählen Sie Artefakte bauen und die Build-Aktion auswählen.

Build jar

Sie sollten jetzt ein Glas haben

completed jar

ich Sie öffnen das Glas sollten Sie Ihre Programme Klassendateien und die Klassendateien für alle Abhängigkeiten sehen.

exploeded jar

Hoffnung, das hilft.

+0

Vielen Dank für die klare Erklärung Will - nachdem ich genau das getan habe, was Sie beschrieben haben, habe ich immer noch den Fehler, der mich auf das eigentliche Problem hinweist: Ich habe Maven nicht richtig dazu benutzt, automatisch die zusätzlichen Abhängigkeiten herunterzuladen, die mir fehlten. Ich schätze die Screenshots, sie waren sehr hilfreich für die Vernunft zu überprüfen, was ich tat. – dimachidy

+0

Ich bin froh, dass ich dir helfen konnte und dass du dein Problem gelöst hast. –

Verwandte Themen