2012-09-24 15 views
6

Eclipseで実行可能なjarファイルを作ることができます。それがast.jarと呼ばれ、MainクラスがASTExplorerであるとしましょう。これがjava -jar ast.jarで動作することを確認できます。実行可能なjarファイルの生成の魔法

次に、jarファイルを別のディレクトリに解凍し、ASTExplorerがastexplorerディレクトリにあることを確認します。しかし、私はこのコマンドを実行したときjava -cp . astexplorer.ASTExplorer私はこのエラーが発生します。

java -cp . astexplorer/ASTExplorer 
Exception in thread "main" java.lang.NoClassDefFoundError: org/eclipse/swt/widgets/Composite 
at java.lang.ClassLoader.defineClass1(Native Method) 
at java.lang.ClassLoader.defineClassCond(ClassLoader.java:631) 
at java.lang.ClassLoader.defineClass(ClassLoader.java:615) 

jarファイルには、org/eclipse/swtディレクトリがありません。

Directory screenshot

実行可能なjarファイルの背後にある魔法は何ですか?なぜ解凍されたときに実行されませんか?

+0

あなたは、日食の黒い魔法を使わずに、アリでJARを作成してみるべきです。 –

+0

'java -jar ast.jar'を実行するときのクラスパスは何ですか? jarファイルを展開すると、クラスパスは '.'になります。私は環境変数CLASSPATHが 'java -jar ast.jar'が動作するように設定されていると推測しています。 – km1

答えて

2

Eclipseは実行可能なjarをパッケージ化するときに、依存関係をネストされたjarファイルとして含めます。また、ネストされたjarでクラスを見つける方法を理解する特殊なクラスローダーも含まれます。それはネストされたjarファイルでのみ動作します。

私は、Eclipseの生産実行可能なjarファイルで見て、ここで私はあなたがする必要があると思う何をしました:

  1. は、ディレクトリにすべてを抽出します。依存関係のjarファイルは、最上位ディレクトリ
  2. で抽出されたORG /日食/ JDT /内部ディレクトリを削除します
  3. java -cp .;dep-jar;dep-jar;... your.main.class

で最上位のディレクトリから自分のメインクラスを実行します

私は実行可能な瓶でこれを試しました。私は周りに横たわっていることが起こり、それは動作します。ステップ2は厳密には必要ではない。

+0

私はそれを-cpを使って実行させることができます:すべてのJARファイルはECLIPSE main.classからです。私はそれをラップアップし、jarファイルへの参照を自動的に作成する以外に、実行可能なjarファイルを生成した後に大きな魔法がないようだと思います。 – prosseek

+1

さらに、mainfestファイルに "jarinjar"クラスローダーを置き換えます。 –

関連する問題