Runnable JAR文件不会

时间:2013-05-19 17:20:42

标签: java eclipse manifest packaging

我用Java创建了这个纸牌游戏。它做了什么它呈现一张牌面朝上,另外4张牌面朝下。你下注1到100个硬币并试图从面朝下的牌中挑选更高的牌。如果你选择一张更高的牌,你的赌注加倍,你可以选择在另一轮中加倍或者没有。

该程序在一个包中使用3个.java文件:

  • HigherNumber:主类,包含大部分代码。
  • Deck:包含代表一副牌的类的定义。
  • 卡片:包含代表个人卡片的类别的定义。

很自然,这个程序使用了很多图片来代表卡片。在我最初的实现中,我只是向ImageIcon传递了一个字符串来表示卡片的位置。所以,对于面朝下卡片的图标,

faceDown = new ImageIcon("multimedia/redBack.gif");

当我这样做时,程序在运行Eclipse时运行得很好。所以我使用Eclipse导出到可运行的JAR文件。这个JAR文件然后运行没有问题,除非我将JAR文件移动到其他地方,没有任何图像出现。

所以我研究并发现了使用URL来解决这个问题。我重新编写程序以使用URL,所以现在我有这样的东西:

//Set URL for default faceDown icon.
faceDownURL = this.getClass().getResource(pictureRoot +"redBack.gif");
//Set location for default back face of cards.
faceDown = new ImageIcon(faceDownURL);

现在它在Eclipse中运行良好,但我无法使导出的可运行JAR工作。从Windows运行时,它只是有点眨眼,什么都不做。当我通过命令行运行时,我得到了这个:

C:\Documents and Settings\mstabosz>java -jar C:\Temp\HigherNumber.jar
Exception in thread "main" java.lang.NullPointerException
        at javax.swing.ImageIcon.<init>(Unknown Source)
        at higherNumber.Card.setImage(Card.java:150)
        at higherNumber.Card.<init>(Card.java:36)
        at higherNumber.Deck.<init>(Deck.java:22)
        at higherNumber.HigherNumber.<init>(HigherNumber.java:16)
        at higherNumber.HigherNumber.main(HigherNumber.java:857)

尝试遵循此代码,看起来问题的根源在第150行的Card类中。在第150行,该类位于 setImage()函数中,该函数正在构建一个名为iconName的字符串,用于在创建每张卡时为其设置图像。然后它将ImageIcon返回给Card类的构造函数。

//Set up the icon for the card.
this.cardIcon = setImage();

第150行是return语句。以下是创建ImageIcon中使用的URL cardIconURL的语句。

//Create a URL based on the constructed string.
URL cardIconURL = this.getClass().getResource(iconName);

return new ImageIcon(cardIconURL);

我不知道这里出了什么问题。当我使用Strings而不是URL时,该程序作为可运行的JAR运行良好。它在Eclipse中运行时工作正常。它现在不能作为可运行的JAR工作。

我确实读过一些名为“清单”的内容,但我很难理解。我确实让Eclipse为这个程序生成一个清单:

Manifest-Version: 1.0
Main-Class: higherNumber.HigherNumber

我错过了什么?

2 个答案:

答案 0 :(得分:0)

我使用类似的东西:

URL myurl = this.getClass().getResource("file.png");
myIconImage = Toolkit.getDefaultToolkit().getImage(myurl);
你正在做的事情:

return new ImageIcon(cardIconURL);

也许尝试我的第二行。我也将图像存储在罐子里。

答案 1 :(得分:0)

好吧,看起来我通过将包含图片的“多媒体”文件夹拖放到Eclipse中的“highernumber”包中来获取可运行JAR中的图像文件。我仍然得到NullPointerException。