java - 无法将图像导出到可运行的 jar 文件中
java - Can't export an image into a runnable jar file
我正在尝试导出与图像有关的程序。当我导出所述项目时,它会给我一个输入为空的 IllegalArgumentException。我到处寻找答案,但每个答案似乎都不适用于我的代码:
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 -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
您的应用程序似乎无法找到您在相对路径中指定的图像。尝试将图像放在 jar 文件附近的 images 文件夹中。
您的 jar 文件需要包含“/images/x.png”和“/images/o.png”条目才能正常工作(因此它们位于 class 路径上)。它不是出于某种原因。
一般来说,在这种情况下首先要寻找的是世界是否真的像您想象的那样。用 jar tvf my.jar
查看罐子内部可以发现很多东西!
我正在尝试导出与图像有关的程序。当我导出所述项目时,它会给我一个输入为空的 IllegalArgumentException。我到处寻找答案,但每个答案似乎都不适用于我的代码:
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 -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
您的应用程序似乎无法找到您在相对路径中指定的图像。尝试将图像放在 jar 文件附近的 images 文件夹中。
您的 jar 文件需要包含“/images/x.png”和“/images/o.png”条目才能正常工作(因此它们位于 class 路径上)。它不是出于某种原因。
一般来说,在这种情况下首先要寻找的是世界是否真的像您想象的那样。用 jar tvf my.jar
查看罐子内部可以发现很多东西!