6

Eclipseで実行可能なjarファイルを作成できます。ast.jarそれがと呼ばれ、メインクラスがASTExplorerであるとしましょう。これがで機能することを確認できjava -jar ast.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ディレクトリがないことです。

ディレクトリのスクリーンショット

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

4

1 に答える 1

2

Eclipseが実行可能なjarをパッケージ化すると、依存関係がネストされたjarファイルとして含まれ、ネストされたjar内のクラスを見つける方法を理解する特別なクラスローダーも含まれます。ネストされたjarでのみ機能し、すべてを抽出すると機能しなくなります。

Eclipseで生成された実行可能なjarを調べましたが、次のことを行う必要があると思います。

  1. すべてをディレクトリに抽出します。依存関係のjarファイルは最上位ディレクトリに抽出されます
  2. org / eclipse / jdt/internalディレクトリを削除します
  3. トップレベルのディレクトリからメインクラスを実行します。

    java -cp .;dep-jar;dep-jar;... your.main.class

たまたま横になっていた実行可能なjarを使用してこれを試しましたが、機能します。ステップ2は厳密には必要ありません。

于 2012-09-24T22:07:02.570 に答える