可执行的Jar文件将无法运行:命令提示符中的错误

时间:2014-08-30 13:47:54

标签: java executable-jar

导致可执行Jar文件出现问题。整个项目在eclipse中正常工作但是从命令提示符导出和运行时出现以下错误 enter image description here

我认为它无法找到其中一个图像,但是不明白为什么它在jar文件中抛出错误而不是在eclipse中运行时的项目。该项目有一个运行器类,它打开包含smallframe类的主页面。这些都在GUI包中,所使用的任何图像都在src / Resources文件夹中。

关于哪里最受欢迎的任何建议。

编辑:只需更改所有图像的代码,但是某些人会收到错误"无法对类型为Object"的非静态方法getClass()进行静态引用。所以使用了Class name" GenerateImages.class"而不是getClass()。这适用于Eclipse,但似乎无法在可执行的Jar文件中工作。 enter image description here

在下面放了createQuestionOne的代码,只是想知道我做错了什么:

public static void createQuestionOne(int startShape, int endShape, String symbols, int scenarioNum, String fileSaveLocation) throws IOException  
{

//shapes
final BufferedImage shapeLeft = ImageIO.read(GenerateImages.class.getClassLoader().getResource(startShape + ".png"));
final BufferedImage shapeRight = ImageIO.read(GenerateImages.class.getClassLoader().getResource(endShape + ".png"));
final BufferedImage questionMark = ImageIO.read(GenerateImages.class.getClassLoader().getResource("questionMark.png"));

//arrows
final BufferedImage rightArrow = ImageIO.read(GenerateImages.class.getClassLoader().getResource("rightArrow.png"));

//Transformations
final BufferedImage transform1 = ImageIO.read(GenerateImages.class.getClassLoader().getResource(symbols.substring(0,1)+ ".png"));
//
final BufferedImage none = ImageIO.read(GenerateImages.class.getClassLoader().getResource("None.png"));

final int width = 60;
final int height = 90;
final int smallWidth = 34;

final BufferedImage questionLayout = new BufferedImage(5*width,height,BufferedImage.TYPE_INT_RGB);

        Graphics2D reDraw = questionLayout.createGraphics();

        //set background to white
        reDraw.setColor(Color.WHITE);  
        reDraw.fillRect(0, 0, questionLayout.getWidth(), questionLayout.getHeight()); 

        //Question Line
        reDraw.drawImage(shapeLeft,0,15, null);
        reDraw.drawImage(rightArrow,width,15, null);
        reDraw.drawImage(transform1,width*2,30, null);
        reDraw.drawImage(rightArrow,width*2+smallWidth,15, null);
        reDraw.drawImage(questionMark,width*3+smallWidth,15, null);


try{
ImageIO.write(questionLayout, "png", new File(fileSaveLocation + "\\S" + (scenarioNum + 1) +"Q1.png"));
 ;}catch (Exception e) {}

//output correct answer as image

drawSingleShapeImage(shapeRight,scenarioNum, 1, fileSaveLocation);
drawDistractionShapeImage(none,scenarioNum, 1, 4, fileSaveLocation);

}

1 个答案:

答案 0 :(得分:1)

你永远不应该对资源位置进行硬编码,因为简单来说,当它被导出为jar或war文件时,执行它的环境可能会改变一种解决问题的可能方法是使用

getResource of java.lang.ClassLoader - 正如javadoc所说 - 它找到了具有给定名称的资源。资源是一些数据(图像,音频,文本等),可以通过类代码以独立于代码位置的方式访问。 资源的名称是'/' - 标识资源的分隔路径名。

此方法将首先在父类加载器中搜索资源;如果父项为null,则搜索内置到虚拟机的类加载器的路径。如果失败,此方法将调用findResource(String)来查找资源。

甚至尝试使用getResourcesAsStream()

加载资源

因此,在您的情况下,使用getResource()读取文件并重新创建jar