私はこのJavaライブラリから実行可能なjarファイルを作成しようとしています:Intellij IDEAのrunnable jarをエクスポートするときにjava.lang.NoClassDefFoundErrorを修正するには?
https://github.com/Jefferson-Henrique/GetOldTweets-java
は一度作成、jarファイルは、コマンドラインから入力して実行することができます。
メインファイルには、この輸出クラスです:
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();
}
}
}
}
srcフォルダ内TweetManager.javaファイル、TwitterCriteria.javaファイル、およびTweet.javaファイルもあります。 (Main.javaファイルにはコードの使用例が示されています)さらに、このプロジェクトのlibsフォルダには、 "json-20140107.jar"と "jsoup-1.8.1.jar"の2つのjarがあります。
私はJavaコードを少し変更しています。この変更を含むgot.jarファイルを再作成したいと思います。私はIntellij IDEAを使用しています。私はJavaの経験がないので、このプロセスはこれまでかなり推測されています。
私が作成した瓶を実行すると、瓶は2つのlibs jars "json-20140107.jar"と "jsoup-1.8.1.jar"を見つけることができません。私は端末から取得した出力がこれです:のIntelliJで実行可能な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
、私は、アーティファクトタブで「瓶」を選択し、「ビルド・メイクの」ボックスをチェックし、私のメインとして「輸出」を持っていますクラスパスがjsonとjsoupフォルダを含むフォルダを指していることを確認しました。また、Modulesタブの "Dependencies"にjsonとjsoupライブラリがあります。 (これらはすべて、この問題に関連する以前の回答からの提案でした。)
私はこのトピックに見つけることができる他のすべての提案を試みたし、何も働いていませんこのエラーを回避するためです。私は間違って何をしていますか?
編集:解決 - 問題私は問題を実現追加の依存関係のダウンロードのためにMavenを使用するために必要だったが、私はwasn Mavenの、によって自動的にダウンロードする必要が(JSONとjsoup瓶以外の)追加の依存関係を持っていたということでした私はプロジェクトをMavenプロジェクトとしてIntellijにインポートしなかったので、起こっていません。私はMavenが最初にあったのかどうかはわかりませんでしたが、私が使用していたコードのpom.xmlファイルを見ると、ApacheのHttpClientライブラリがjsonとjsoupライブラリに加えて参照されていて、 HttpClientライブラリのjarファイルです。
プロジェクトをMavenプロジェクトとしてインポートすると、追加の依存関係が自動的にダウンロードされ、エクスポートされたjarファイルが期待通りに機能しました。私がすでに持っていたライブラリをどのようにインポートしていたのかという問題ではないことを私が保証した非常に明確な説明のためにWillに感謝します!
私は、その解決策、私はここで見つけるMavenとのIntelliJと1つの最終小さな問題を抱えていた、誰がMavenとのIntelliJと「何の主要なマニフェスト属性」エラーを取得しない場合には:Wrong Manifest.mf in IntelliJ IDEA created .jar
チップをいただきありがとうございます。Olav - 私は自分の問題(私が必要な追加の依存関係を自動的にダウンロードするためにMavenを使用していない)を見つけたら、jarファイルの依存関係を含めてしまいました。 – dimachidy