2016-06-26 2 views
0

Я пытаюсь создать работоспособную баночку из этой библиотеки Java:Как исправить java.lang.NoClassDefFoundError при экспорте runnable jar в Intellij IDEA?

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

После создания банка должен иметь возможность работать с входами из командной строки.

Основной файл этот экспортёр класс:

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(); 
      } 
     } 

    } 

} 

Существует также TweetManager.java файл, TwitterCriteria.java файл и Tweet.java файл в папке Src. (Файл Main.java показывает только примеры того, как использовать код.) Кроме того, в этом каталоге есть два баночки json-20140107.jar и jsoup-1.8.1.jar.

Я вношу небольшие изменения в код Java, и я хочу воссоздать файл got.jar с включенным изменением. Я использую Intellij IDEA. У меня нет java-опыта, поэтому этот процесс был довольно доволен и проверен.

Проблема (я думаю) заключается в том, что когда я запускаю созданный банком, банку не удается найти две банки libs «json-20140107.jar» и «jsoup-1.8.1.jar». Выход я получаю от терминала это:

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 

Совершая работоспособный банку в Intellij, я выбрал «баночку» на вкладке Артефакты, был установлен флажок «Развивайте сделать», есть «экспортер», как мой основной класс, и убедитесь, что мой путь в классе указал на папку, содержащую папки json и jsoup. У меня также есть библиотеки json и jsoup, перечисленные в разделе «Зависимости» на вкладке «Модули». (Все это были предложения от предыдущих ответов, связанных с этой проблемой.)

enter image description here

enter image description here

enter image description here

Я пробовал все другие предложения, я мог бы найти на эту тему и ничего не работает но для избежания этой ошибки. Что я делаю не так?

Edit: Решено - Проблема была мне нужно использовать Maven для загрузки дополнительных файлов зависимостей я понял, проблема заключалась в том, что у меня были дополнительные зависимости (кроме JSON и jsoup банки), которые необходимы для загрузки автоматически Maven, который WASN Это произошло потому, что я не импортировал проект как проект Maven в Intellij. Я не знал, что такое Maven, но когда я посмотрел на файл pom.xml в используемом мной кодеке, я увидел, что в библиотеку apache HttpClient добавлены библиотеки json и jsoup, и у меня не было банку для библиотеки HttpClient.

После того как я импортировал проект в качестве проекта Maven, дополнительные зависимости были автоматически загружены, а экспортированный файл jar работал должным образом. Спасибо Will за очень четкое объяснение, которое заверило меня, что проблема заключается не в том, как я импортировал библиотеки, которые у меня уже были!

У меня был один окончательный небольшая проблема с Maven и Intellij, решение я нашел здесь, в случае, если кто-то получает ошибку «не главный манифест атрибут» с Maven и Intellij: Wrong Manifest.mf in IntelliJ IDEA created .jar

ответ

0

Вы должны либо включать зависимости в банку или держать банку с библиотеками, на которых это зависит.К сожалению, у меня слишком мало опыта работы с IDEA (нет), чтобы рассказать вам, как включить его, включая зависимости в банке.

+0

Благодарим вас за отзыв Olav. В итоге я включил зависимости в банке, как только выяснилось, что у меня проблема (я не использовал Maven для автоматической загрузки дополнительных зависимостей, которые мне нужны). – dimachidy

0

Я быстро поработал над созданием Jar с зависимостью от другого Jar.

Я первый добавил библиотеку к моему проекту с использованием IntelliJ

IntelliJ Libraries

Затем я создал Jar, перейдя к артефактам и выбора «Из модулей с зависимостями» From modules with dependencies

Я тогда установить основной класс для банок Set main class for jar

Мое завершенное устройство установки было таким.

completed jar setup

Затем перейдите в меню Построение выберите Построить Артефакты и выберите действие сборки.

Build jar

Теперь вы должны иметь баночку

completed jar

Я вас открыть банку вверх, вы должны увидеть ваши программы файлы классов и файлы классов для любых зависимостей.

exploeded jar

Надежда, что помогает.

+0

Благодарим вас за ясное объяснение. Будет - после выполнения точно так, как вы описали, я все еще получил ошибку, которая указала мне на реальную проблему: я неправильно использовал Maven для автоматической загрузки дополнительных зависимостей, которые я отсутствовал. Я ценю снимки экрана, они очень помогли проверить, что я делаю. – dimachidy

+0

Рад, что я могу помочь и решить вашу проблему. –

Смежные вопросы