2016-06-26 7 views
0

私はこの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ライブラリがあります。 (これらはすべて、この問題に関連する以前の回答からの提案でした。)

enter image description here

enter image description here

enter image description here

私はこのトピックに見つけることができる他のすべての提案を試みたし、何も働いていませんこのエラーを回避するためです。私は間違って何をしていますか?

編集:解決 - 問題私は問題を実現追加の依存関係のダウンロードのために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

答えて

0

をあなたはに依存関係を含める必要がありますどちらかjarファイルに依存するライブラリをjarファイルに保存します。残念ながら、IDEA(none)の経験はあまりありません。どのようにインクルードするかを教えてください。

+0

チップをいただきありがとうございます。Olav - 私は自分の問題(私が必要な追加の依存関係を自動的にダウンロードするためにMavenを使用していない)を見つけたら、jarファイルの依存関係を含めてしまいました。 – dimachidy

0

私は別のJarへの依存関係を持つJarの作成にすばやく行きました。

は、私が最初に私は、設定 From modules with dependencies

私は、「依存関係を持つモジュールからの」アーティファクトと選択に行くことによってジャーを作成したのIntelliJ

IntelliJ Libraries

を使用して、私のプロジェクトにライブラリを追加しましたJarのメインクラス Set main class for jar

完成したjarの設定は次のようになっています。

completed jar setup

[ビルド]メニューに移動し、成果物を作成し、ビルドアクションを選択し選択します。

Build jar

あなたは今瓶

completed jar

を持っている必要があり、私はあなたがあなたのプログラムのクラスファイルとの依存関係のためのクラスファイルを参照する必要がありjarファイルを開きます。

exploeded jar

お役に立てば幸いです。

+0

明白な説明をありがとうございます - 私が実際に問題を指摘したエラーがまだありました。記述したとおりにしても、Mavenを正しく使用していなかった追加の依存関係を自動的にダウンロードしませんでした。私はスクリーンショットを感謝し、彼らは私がしていたことを確認する上で大変役に立つものでした。 – dimachidy

+0

私は助けて、あなたの問題を解決できたことをうれしく思います。 –

関連する問題