【问题标题】:executable Jar file will not run: error in command prompt可执行 Jar 文件将无法运行:命令提示符错误
【发布时间】:2014-08-30 13:47:53
【问题描述】:

只是导出的可执行 Jar 文件有问题。整个项目在 Eclipse 中运行良好,但是从命令提示符导出和运行时出现以下错误

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

任何关于在哪里看起来最受欢迎的建议。

编辑:只需更改所有图像的代码,但由于某些“无法从对象类型对非静态方法 getClass() 进行静态引用”而出现错误,因此使用了类名“GenerateImages.class”而不是 getClass()。这适用于 Eclipse,但似乎不适用于可执行 Jar 文件。

已经把 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);

}

【问题讨论】:

  • 尝试以 className.class.getClassLoader().getResource("yourImage") 的方式读取图像并重新创建 jar
  • 感谢您的工作-在整个代码中进行了一些替换。错误是因为我已经硬编码了位置,然后在导出 jar 时更改了位置。只是想明白,所以不要犯同样的错误两次

标签: java executable-jar


【解决方案1】:

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

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

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

甚至尝试用getResourcesAsStream()加载资源

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

【讨论】:

    猜你喜欢
    • 2013-02-21
    • 1970-01-01
    • 2015-03-28
    • 2018-12-16
    • 1970-01-01
    • 2011-06-30
    • 1970-01-01
    • 2017-06-28
    • 2011-08-12
    相关资源
    最近更新 更多