2017-09-24 6 views
0

イメージと関係のあるプログラムをエクスポートしようとしています。上記のプロジェクトをエクスポートすると、入力がnullのIllegalArgumentExceptionが返されます。私は答えのためにすべてをオーバー見てきましたが、それぞれが自分のコードで動作していないよう:java - イメージを実行可能なjarファイルにエクスポートできません

package dev.ttt; 

import java.awt.image.BufferedImage; 
import java.io.IOException; 

import javax.imageio.ImageIO; 

public class Assets { 

    public static BufferedImage x, o; 

     public static void init() { //Loads the X and O images 

      System.out.println("Loading Assets..."); 

      x = loadImage("/images/x.png"); 

      o = loadImage("/images/o.png"); 

      System.out.println("Assets loaded."); 

     } 

     public static void sayLoad(String path) { //Prints the image path to the console 
      System.out.println("Loading " + path); 
     } 

    public static BufferedImage loadImage(String path) { 
     try { 
      sayLoad(path); //Prints the image path to the console 
      return ImageIO.read(Assets.class.getResourceAsStream(path)); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     return null; 
    } 
} 

任意のアイデアはどのようにこの問題を解決するために? Eclipseではうまく動作しますが、jarファイルでは動作しません。

EDIT: "myjar.jar" -jar Javaから

出力:

Initializing window... 
Size: 330 330 
Initializing Canvas... 
Initialization complete. 
Starting Thread... 
Thread Started. 
Initializing Game... 
Loading Assets... 
Loading /images/x.png 
Exception in thread "Thread-2" java.lang.IllegalArgumentException: input == null! 
    at javax.imageio.ImageIO.read(Unknown Source) 
    at dev.ttt.Assets.loadImage(Assets.java:31) 
    at dev.ttt.Assets.init(Assets.java:16) 
    at dev.ttt.GameLoop.gameInit(GameLoop.java:81) 
    at dev.ttt.GameLoop.run(GameLoop.java:129) 
    at java.lang.Thread.run(Unknown Source) 

はEDIT 2:

55 Sun Sep 24 17:47:30 EDT 2017 META-INF/MANIFEST.MF 
1308 Sat Sep 23 20:18:30 EDT 2017 dev/ttt/WinDetection.class 
3719 Sat Sep 23 20:18:30 EDT 2017 dev/ttt/GameLoop.class 
2347 Sun Sep 24 17:47:14 EDT 2017 dev/ttt/Game.class 
1451 Sun Sep 24 17:47:14 EDT 2017 dev/ttt/Assets.class 
503 Sat Sep 23 20:18:30 EDT 2017 dev/ttt/Launcher.class 
2874 Sat Sep 23 20:18:30 EDT 2017 dev/ttt/ai/AI.class 
456 Sat Sep 23 20:18:30 EDT 2017 dev/ttt/player/Player.class 
2875 Sat Sep 23 20:18:30 EDT 2017 dev/ttt/player/MouseInput.class 
1010 Sun Sep 24 12:09:46 EDT 2017 images/O.png 
1034 Sun Sep 24 12:09:46 EDT 2017 images/X.png 
310 Thu Sep 21 12:22:30 EDT 2017 .checkstyle 
385 Thu Sep 21 12:26:28 EDT 2017 .project 
343 Sat Sep 23 21:03:18 EDT 2017 .classpath 
+1

"jar tvf your.jar" –

+0

からの出力をリストアップしてください。@OP re edit:ThorbjørnRavnAndersenはstacktraceを要求しませんでしたが(これも便利なので削除することはできますが)、JARファイル構造について'jar tvf your.jar'コマンドで取得できます(詳細はhttps://docs.oracle.com/javase/tutorial/deployment/jar/view.html)。 – Pshemo

答えて

0

jarファイルには、これが機能するためには(クラスパス上にあるように) "/images/x.png"と "/images/o.png"エントリが必要です。それは何らかの理由でではありません。

一般的に、この状況で最初に探すのは、世界が実際にあなたのようであると思われる場合です。 jar tvf my.jarで瓶の中を見ると、多くのことを明らかにすることができます!

+0

それは意味がありますが...私はそれをどのように実行するのか分かりません、私はそれを私のcmdプロンプトに入れて、それは言った: 'jar'は内部または外部コマンドとして認識されません 操作可能なプログラムまたはバッチファイル。 –

+0

ちょっと分かりました、私のパス変数を更新しなければなりませんでした! –

+0

最後に分かった...私のところで最も賢明な間違い。私はファイルパスを大文字にするのを忘れてしまいました.jar tvf my.jarを使って私はそれを見ました。あなたを助けてください! –

-1

アプリケーションがイメージにどのあなたを見つけることができないように見えます相対パスで指定します。 jarファイルの近くの画像に画像を配置してください。

+0

あなたのソリューションは投稿されたコードで動作しますが、OPが要求したものではありません。 JARを作成する主な理由の1つは、アプリケーションが必要とするすべてのもの(画像/アイコンなど)をラップできるようにすることです。それらをJARの外部に置くことは、望ましい解決策から後退しています。 – Pshemo

関連する問題