2017-09-24 85 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; 
    } 
} 

不知道如何解决这个问题?它在Eclipse中正常工作,但不在jar中。

编辑:

从Java的罐子 “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编辑: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

这使得sence,但...我不知道如何运行,我把它放到我的cmd提示符,它说:'jar'不被识别为内部或外部命令, 可操作的程序或批处理文件。 –

+0

只是想出来,不得不更新我的路径变量! –

+0

终于搞清楚了......我的部分是最愚蠢的错误..我忘了大写我的文件路径,使用jar tvf my.jar帮我看到了。请你帮忙! –

-1

看起来像你的应用程序无法找到图像,你在相对路径中指定。尝试将您的图片放在您的jar文件附近的文件夹图片中。

+0

尽管您的解决方案适用于发布的代码,但它不是OP所要求的。创建JAR的主要原因之一是让它包装应用程序所需的所有东西(如图像/图标)。把它们放在JAR之外是从首选的解决方案中退出。 – Pshemo