【问题标题】:Error with image resources in jar filejar 文件中的图像资源错误
【发布时间】:2012-02-16 05:40:47
【问题描述】:

我在运行 jar 文件时遇到问题。如果我在 eclipse 中编译代码一切正常,但是当我导出到 jar 并尝试运行程序时,它会引发错误。 错误是:

Exception in thread "main" java.lang.NullPointerException
    at javax.swing.ImageIcon.<init>(Unknown Source)
    at game.ChessSquare.<init>(ChessSquare.java:17)
    at game.ChessFrame.DrawField(ChessFrame.java:131)
    at game.ChessFrame.<init>(ChessFrame.java:38)
    at game.Chess.main(Chess.java:7)

所以抛出这个错误的代码是

//text is something like "pawn" or "king".The whole image is an icon on the button 
img = new ImageIcon(getClass().getResource("white/"+text+".png"));

据我了解,它找不到图像,因此 img 变量为空。但我不明白为什么它会在 Eclipse 中运行。有什么帮助吗?谢谢

PS@AndrewThompson

E:\Desktop>jar tvf chess.jar
49 Sat Feb 11 23:40:06 GMT 2012 META-INF/MANIFEST.MF
378 Sat Feb 11 22:51:04 GMT 2012 game/ChessFieldCoord.class
1932 Sat Feb 11 23:39:48 GMT 2012 game/ChessSquare.class
536 Sat Feb 11 22:51:04 GMT 2012 game/Chess.class
2122 Sat Feb 11 22:51:04 GMT 2012 game/Rook.class
2357 Sat Feb 11 22:51:04 GMT 2012 game/Bishop.class
1946 Sat Feb 11 22:51:04 GMT 2012 game/Queen.class
2127 Sat Feb 11 22:51:04 GMT 2012 game/Pawn.class
1630 Sat Feb 11 22:51:04 GMT 2012 game/Knight.class
878 Sat Feb 11 22:51:04 GMT 2012 game/Empty.class
1642 Sat Feb 11 22:51:04 GMT 2012 game/King.class
915 Sat Feb 11 22:52:32 GMT 2012 game/ChessFrame$1.class
841 Sat Feb 11 22:52:32 GMT 2012 game/ChessFrame$2.class
695 Sat Feb 11 22:52:32 GMT 2012 game/ChessFrame$3.class
3525 Sat Feb 11 22:52:32 GMT 2012 game/ChessFrame$Move.class
4675 Sat Feb 11 22:52:32 GMT 2012 game/ChessFrame.class
997 Sat Feb 11 22:51:04 GMT 2012 game/ChessFigure.class
928 Sat Feb 11 15:49:32 GMT 2012 game/black/bishop.png
1947 Sat Feb 11 15:49:10 GMT 2012 game/black/king.png
1247 Sat Feb 11 15:49:38 GMT 2012 game/black/knight.png
627 Sat Feb 11 15:49:44 GMT 2012 game/black/pawn.png
1668 Sat Feb 11 15:49:20 GMT 2012 game/black/queen.png
626 Sat Feb 11 15:49:26 GMT 2012 game/black/rook.png
1493 Sat Feb 11 15:48:30 GMT 2012 game/white/bishop.png
1889 Sat Feb 11 15:48:06 GMT 2012 game/white/king.png
1544 Sat Feb 11 15:48:40 GMT 2012 game/white/knight.png
1003 Sat Feb 11 15:48:48 GMT 2012 game/white/pawn.png
2440 Sat Feb 11 15:48:12 GMT 2012 game/white/queen.png
837 Sat Feb 11 15:48:20 GMT 2012 game/white/rook.png

发生错误的文件是ChessSquare.class

【问题讨论】:

  • 你检查过最终 Jar 里有什么吗?
  • 检查 .jar 文件中的文件“white/XXX.png”。仅供参考,您可以使用标准的“winzip”命令(以及 JDK“jar”命令行工具)查看/编辑您的 jar 文件。
  • i.stack.imgur.com/wPyuO.png - 这是里面的chess.jar。我无法理解的是为什么它从 Eclipse 运行而不是从 jar 运行。文件夹结构始终相同:(
  • 因为它是游戏/白色,而不是白色?
  • 1) 要通知某人您发表了评论,请在评论前加上@PersonName 2) 请不要发布文本信息的屏幕截图。使用jar tool 列出命令行中的内容(参见列出 jar 文件的目录),然后复制/粘贴输出。

标签: java eclipse


【解决方案1】:
img = new ImageIcon(getClass().getResource("/game/white/"+text+".png"));

注意前导斜杠以及game 前缀。

【讨论】:

  • 正如已经告诉 DaveNewton 的那样,它不起作用。当我尝试运行它时,同样的错误。如果没有前导斜杠,它甚至无法编译。在这里发布之前,我已经尝试了所有可能的地址组合:(
  • “尝试了每个可能的地址组合”显然不是,因为其中一个可以工作。另外,它不管有没有/,都应该编译OK。前导/ 仅表示“从类路径的根目录查看”。如果没有/,它将从类文件的包中搜索。
【解决方案2】:

如 cmets 所示,查看您的 jar(使用 winzip、7zip 或类似的东西)以查看资源所在的位置。如果它不在“白色”目录中,那么您的 jar 构建有问题。

至于为什么它在 Eclipse 中运行...这可能是因为当您运行程序时 Eclipse 将资源目录包含在类路径中。这意味着 getClass().getResource(...) 调用找到了 png。

如果您将文件保存在 Eclipse 的资源目录中,它也可以将文件导出到 jar 中的 META-INF 目录中,请查看资源。如果它正在这样做,那么您可能已经设置了要构建的 jar,以便部署到 Web 环境中(请参阅 servlet 3.0 片段)。

最后一点,使用 getClass().getResource(...) 时要小心,因为它会将您锁定为仅查找与发出该调用的类的 ClassLoader 关联的资源(取决于相关 ClassLoader 层次结构的操作方式)。您可能希望稍后提供扩展,您可以将其他图像集打包到 jar 中。在这些情况下,您将不得不依靠稍微不同的机制来加载图像(请参阅 ClassLoader.getResources 作为起点)。

编辑:这看起来严格来说是一个 Eclipse 问题。根据 jar 的结构方式,正确的路径是“game/white/king.png”。

【讨论】:

  • 我也尝试使用 BlueJ 导出到 jar,同样的,它从 IDE 运行,但不是从 jar 运行。我是 Java 新手,但它的行为对我来说似乎很奇怪
  • 右键单击包含图像的资源文件夹并检查属性(也可以查看项目的构建属性)。您正在寻找的是指示资源被复​​制到哪个目录的东西。如果您使用 Ant 或类似工具执行此操作,您可以将资源复制到类目录中,然后 jar 类目录或在事后使用 zip ant 任务添加它们。
【解决方案3】:

我是个白痴,我终于弄清楚错误在哪里。正如我写的那样,输出是"file:/E:/Desktop/Chess/bin/game/white/Pawn.png",请注意Pawn.png 中的大P 字母。但实际图像的名称以小写字母开头。这就是为什么它不起作用。对我来说仍然是个谜,为什么它在 Eclipse 中起作用

【讨论】:

    猜你喜欢
    • 2012-02-16
    • 1970-01-01
    • 1970-01-01
    • 2011-06-03
    • 1970-01-01
    • 2015-05-02
    • 2016-12-28
    • 2018-11-24
    • 2012-04-26
    相关资源
    最近更新 更多