2016-08-28 82 views
1

我有一個無法訪問我的資源的可運行jar文件,它位於默認src目錄之外。根據來自What is the difference between Class.getResource() and ClassLoader.getResource()我的理解,我應該可以通過以下getResourceFile函數訪問根/ RES/IMG/img1.png(見下面的文件夾設置):Java classloader無法在jar文件中找到資源

public class Foo { 

    private static final ClassLoader CLASS_LOADER = Foo.class.getClassLoader(); 

    public static File getResourceFile(String relativePath) { 
     // Since I'm using getClassLoader, the path will resolve starting from 
     // the root of the classpath and it'll take an absolute resource name 
     // usage: getResourceFile("img/img1.png") 
     // result: Exception in thread "main" java.lang.NullPointerException 
     return new File(CLASS_LOADER.getResource(relativePath).getFile()); 
    } 
} 

文件夾設置:

root/ 
    src/ 
     foo/ 
      bar/ 
    res/ 
     img/ 
      img1.png 
     audio/ 
      audio1.wav 

當我嘗試執行jar可執行文件本身時出現問題。然而,奇怪的是,我無法通過eclipse IDE複製它,它實際上能夠正確解析路徑。我已經通過(項目 - >屬性 - > Java構建路徑 - >添加文件夾)將資源目錄添加到構建路徑,所以Java應該能夠在運行時找到資源文件夾。

在生成jar文件方面是否存在缺少的東西?開箱後的JAR文件的一切似乎是爲了與IMG和音頻目錄的根是(考慮到上述初始文件夾設置):

foo/ 
    /bar 
img/ 
    img1.png 
audio/ 
    audio1.wav 
+0

你可以發佈'relativePath'值嗎? –

+1

一旦進入'jar',資源不再是「文件」。如果你把它的URI放到'File'中,那麼文件將不會被找到,因爲它不在文件系統中。你應該使用它作爲輸入流,而不是文件。 – RealSkeptic

+0

@DavidPérezCabrera:例如:img/img1.png – Alan

回答

5

File s只能被用來表示在文件系統中的實際文件。一旦將文件打包到JAR中,資源(img/img1.png)不再是文件,而是JAR文件中的條目。只要你在Eclipse中使用文件夾結構,資源就是單個文件,所以一切都很好。

試試這個:

System.out.println(CLASS_LOADER.getResource(relativePath)); 

它將打印一個網址,但不會是在文件系統中的文件的有效路徑,但對JAR文件中的條目。

通常情況下,您只需要閱讀資源。在這種情況下,請使用getResourceAsStream()打開InputStream