2014-01-17 102 views
0

我的問題是,當我使用maven構建可執行jar(使用陰影插件)並嘗試運行罐子,我收到一個錯誤:運行可執行文件時,Java加載資源失敗maven jar文件:無法解析「file:/ ....」

java.io.IOException: Unable to resolve "file:/C:/Users/name/Desktop/nameofjar-SNAPSHOT.jar!/path/to/file.gz 

當我運行Eclipse中的主程序,在GUI中正確加載資源文件。我打印的文件的目錄的輸出:

Loading parser from serialized file /C:/Users/name/git/guis/target/classes/path/to/file.gz 

的IOException的在這行代碼發生:

URL url = SentenceParser.class.getResource("file.gz"); 
props.setProperty("file", url.getPath()); 

的file.gz位於的src /主/資源/路徑/要/file.gz並且該類在src/main/java/path/to的java src目錄中定義。

經過研究,我的問題幾乎完全像這個人的問題:java, loading of resources fails: unable to resolve file:/my-jar.jar!/folder/my-file。他們聲明他們必須具有文件的路徑才能放入屬性文件。我也需要文件的路徑,並且無法將資源作爲流獲取。我需要該路徑才能將該路徑添加到屬性文件,然後由外部庫讀取該文件。

+0

可能重複[java,資源加載失敗:無法解析文件:/my-jar.jar!/ folder/my-file](http://stackoverflow.com/questions/20739266/java-loading- of-resources-fails-unable-to-resolve-file-my-jar-jar-folder-my) – Raedwald

+0

如果您閱讀我的完整回覆,我說明了這一點。我正在尋找替代答案。 – user3191272

回答

0

如果應用程序需要讀取和操縱其他jar文件,最好將文件放置在jar文件的外部。像這樣:

file.gz
myjar.jar
myjar2.jar

這樣,你可以使用如下代碼獲得對公共資源文件的絕對路徑:

static final String WORKINGDIR = System.getProperty("user.dir"); 
static final String SEPARATOR = System.getProperty("file.separator"); 
String path = WORKINGDIR + SEPARATOR + "file.gz"; 
URL url = SentenceParser.class.getResource(path); 

試試這個,看看它是否有效。

問題是,當您直接從Eclipse中運行應用程序時,應用程序本身不在jar中。您只是運行未打包的類文件。因此,它可以很好地找到資源文件。但是當你打開你的應用程序並運行它時,資源文件駐留在jar中,應用程序很難找到它。如果您將資源文件保存在jar外部,那麼使用上面提供的代碼可以更輕鬆地找到它們。無論如何,我覺得這對我來說最合適。