2014-08-30 40 views
0

只有導出的可執行文件Jar文件存在問題。整個項目在eclipse中工作正常,但是當從命令提示符導出並運行時出現以下錯誤 enter image description here可執行文件Jar文件將不會運行:命令提示符中的錯誤

我認爲它無法找到其中一個圖像,但不明白爲什麼它會拋出jar文件中的錯誤,而不是在eclipse中運行時的項目。該項目有一個runner類,它打開包含smallframe類的主頁面。這些都在GUI軟件包中,所用的所有圖像都在src/Resources文件夾中。

任何建議看哪裏最受歡迎。

編輯:只是更改所有圖像的代碼,但得到一些錯誤的一些「無法從類型對象的非靜態方法getClass()靜態引用」所以使用類名稱「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

嘗試讀取圖像這樣'className.class.getClassLoader() .getResource(「yourImage」)'並重新創建罐子 – SparkOn 2014-08-30 13:50:29

+0

謝謝你的工作 - 在代碼中做一些替換。是錯誤的,因爲我已經硬編碼了當jar被導出時改變的位置。只是想明白,所以不要犯同樣的錯誤兩次 – user1836661 2014-08-30 14:15:43

回答

1

你不應該硬編碼的資源位置當它被導出爲jar或war文件時可能會發生變化解決問題的一種可能的方法是使用

getResource of java.lang.ClassLoader - 正如javadoc所說 - 它發現具有給定名稱的電子資源。資源是一些數據(圖像,音頻,文本等),可以通過類代碼以獨立於代碼位置的方式訪問。 資源的名稱是標識資源的「/」分隔的路徑名。

此方法將首先搜索父類加載器的資源;如果父項爲空,則搜索內置於虛擬機的類加載器的路徑。如果失敗,該方法將調用findResource(String)來查找資源。

甚至嘗試用getResourcesAsStream()

所以你的情況看使用的getResource(將文件加載資源),並重新創建的jar

相關問題