导致可执行Jar文件出现问题。整个项目在eclipse中正常工作但是从命令提示符导出和运行时出现以下错误
我认为它无法找到其中一个图像,但是不明白为什么它在jar文件中抛出错误而不是在eclipse中运行时的项目。该项目有一个运行器类,它打开包含smallframe类的主页面。这些都在GUI包中,所使用的任何图像都在src / Resources文件夹中。
关于哪里最受欢迎的任何建议。
编辑:只需更改所有图像的代码,但是某些人会收到错误"无法对类型为Object"的非静态方法getClass()进行静态引用。所以使用了Class name" 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);
}
答案 0 :(得分:1)
你永远不应该对资源位置进行硬编码,因为简单来说,当它被导出为jar或war文件时,执行它的环境可能会改变一种解决问题的可能方法是使用
getResource of java.lang.ClassLoader
-
正如javadoc所说 - 它找到了具有给定名称的资源。资源是一些数据(图像,音频,文本等),可以通过类代码以独立于代码位置的方式访问。
资源的名称是'/' - 标识资源的分隔路径名。
此方法将首先在父类加载器中搜索资源;如果父项为null,则搜索内置到虚拟机的类加载器的路径。如果失败,此方法将调用findResource(String)来查找资源。
甚至尝试使用getResourcesAsStream()
因此,在您的情况下,使用getResource()读取文件并重新创建jar