Я пытаюсь создать работоспособную баночку из этой библиотеки 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, перечисленные в разделе «Зависимости» на вкладке «Модули». (Все это были предложения от предыдущих ответов, связанных с этой проблемой.)
Я пробовал все другие предложения, я мог бы найти на эту тему и ничего не работает но для избежания этой ошибки. Что я делаю не так?
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
Благодарим вас за отзыв Olav. В итоге я включил зависимости в банке, как только выяснилось, что у меня проблема (я не использовал Maven для автоматической загрузки дополнительных зависимостей, которые мне нужны). – dimachidy