2011-06-14 12 views
2

レガシーアプリケーションを再構築しようとしています。 これを行うには、すべてのクラスファイルとリソースをjarファイルにパッケージングします。NarPointerExceptionが正常に実行されたときにjarファイルが実行されない

私はすべてをジャーに、このコマンドを使用しています:

jar -cfm ../Deploy/JEmu.jar Manifest.txt *.class Resources/

私のマニフェストファイルには、次のようになります。

Manifest-Version: 1.0 
Created-By: 1.2.2 (Sun Microsystems Inc.) 
Main-Class: JEmu 
Name: JEmu.class 

エントリポイントであるクラスがパッケージ化されJEmu.class、あります私は瓶を実行するとき、私はこのエラーが表示されます:

java -jar JEmu.jar 
Exception in thread "main" java.lang.ExceptionInInitializerError 
Caused by: java.lang.NullPointerException 
     at javax.swing.ImageIcon.<init>(Unknown Source) 
     at ControlBar.<init>(ControlBar.java:88) 
     at JEmu.<clinit>(JEmu.java:85) 
Could not find the main class: JEmu. Program will exit. 

私は確かに何が原因ですそのこと。

のControlBarのライン88は、次のとおりです。

stopButton = new JButton(new ImageIcon(classLoader.getResource("Resources/stop.gif"))); 

私が間違って何をやっている、それがjarファイルにパッケージ化さていないとき、それはすべて動作しますか?

+0

stop.gifはjarに正しく追加されていますか? – talnicolas

+0

classLoaderとは何ですか?どのように初期化されますか? – PeterMmm

+0

可能であれば、より具体的なものに改良してください。ありがとう。 – Trufa

答えて

3

classLoader.getResource("Resources/stop.gif")おそらく指定されたリソースが見つかりません。この場合、nullが返されます。したがって、NullPointerExceptionが返されます。

+0

この回答は正しいです。ファイル名の大文字と小文字の区別について忘れました。 – Malfist

0

問題は、VMが"Resources/stop.gif"という名前のリソースを見つけることができないことです。これは、stop.gifファイルがパッケージ"Resources"にあり、JARファイルのベースにあるためです。デフォルトでは、getResourceメソッドは、クラスローダーが取得されたクラスのパッケージから始まります。あなたのコードの場合は、Threadクラスがあるパッケージになります。最終的には、VMが画像がある場所ではない場所"/java/lang/Resources/stop.gif"の画像を探します。その後、

あなたが固定された場所を探している場合は、JARの底に位置すなわち、リソースディレクトリ、のように「/」を使用してURL文字列の前に付けていることを確認してください:

classLoader.getResource("/Resources/stop.gif"); 

について考えるもう一つ現在のスレッドからClassLoaderを使用する必要があるかどうかです。通常、アプリケーションクラスで使用されるClassLoaderが適切です。 this.getClass().getResource(...)と似たようなものを実行することで、それを取り出すことができます。

+0

それは当てはまりません。私のアプリケーションはパッケージを持っていませんし、一旦ファイル名の大文字小文字を修正すると正しく動作します。 – Malfist

+0

コンテキストクラスローダーの場合、答えが正しくないことは間違いありません。 'ClassLoader'のgetResourceを呼び出すことは、' Class'のgetResourceメソッドを呼び出すよりも別の検索ロジックを直接実行したことを忘れてしまいます。 'Class'のgetResourceメソッドを呼び出す場合、その答えは正しいです。あなたのアプリケーションにパッケージを使用しないあなたのケースでは、どちらの方法でも問題ありません。 –

関連する問題