2017-09-24 3 views
0

이미지와 관련된 프로그램을 내보내려고합니다. 내가 그 프로젝트를 내보낼 때 그것은 나에게 입력이 널인 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; 
    } 
} 

어떤 생각 방법이 문제를 해결하기 위해? 이클립스에서는 잘 동작하지만 항아리에서는 그렇지 않다.

편집 :

-jar "myjar.jar"자바의 출력 :

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) 

편집 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 프롬프트에 넣고 그것은 말했다 : '항아리'는 내부 또는 외부 명령으로, 실행 프로그램이나 배치 파일로 인식되지 않습니다. –

+0

내 경로 변수를 업데이트해야했습니다. –

+0

마침내 알아 냈어 ... 내 실수로 ... 실은 실수 .. 내 파일 경로를 대문자로하는 것을 잊어 버렸습니다. 항아리 tvf my.jar를 사용하여 그것을 볼 수있었습니다. 도와달라고! –

-1

은 보이는 당신을 상대 경로로 지정하십시오. jar 파일 근처의 이미지에 이미지를 놓으십시오.

+0

솔루션이 게시 된 코드에서 작동하는 동안 OP가 요구 한 것이 아닙니다. JAR을 만드는 주된 이유 중 하나는 응용 프로그램 (이미지/아이콘과 같은)에 필요한 모든 것을 포장하도록하는 것입니다. 그것들을 JAR 외부에 두는 것은 선호되는 해결책에서 물러납니다. – Pshemo

관련 문제