2012-02-20 39 views
4

我可以成功加載站在eclipse中某些包中的src/dir的資源。現在,我導出jar(右鍵單擊src,export,jar,並保留默認設置),並且不能將資源加載到另一個eclipse項目中。getResource()無法加載罐子中的內容

我通過指示在同一個包名稱的類站立構建路徑資源:

URL out = getClass().getClassLoader().getResource(packageName(getClass())+"file.glsl"); 
// out is null when loaded from a jar!! 

protected static String packageName(Class<?> clazz){ 
    return packageName(clazz.getPackage()); 
} 
protected static String packageName(Package p){ 
    return c + p.getName().replace('.', c) + c; 
} 
protected static char c = File.separatorChar; 

你看到任何錯誤的方式? 我想:

  • 的getClass()的getResource()
  • 的getClass()getClassLoader()的getResource()
  • 的getClass()getClassLoader()的getResourceAsStream()
  • 主題。。。 currentThread()。getContextClassLoader()。的getResource()
  • 加法/使用任一 '/', '\',或即File.separatorChar在封裝名稱
  • 的開頭去除 '/' 炭,甚至' ',全部失敗。

我證實:

  • jar包含資源(擴大Eclipse項目的 「引用的庫」 罐子內容)
  • 的packageName(的getClass())+文件名)返回一個乾淨的名稱: 「\組織\ jzy3d \ PLOT3D格式\渲染\ DDP \算法\ dual_peeling_init_vertex.glsl」

我無休止地檢索空:/


編輯:截圖和代碼表明, 「應該工作」

enter image description here

您可以用新的動態檢索該a SSCCE zipped eclipse project here

用戶類

public class User { 
    public static void main(String[] args) { 
     Loader pair = new Loader(SomeClass.class, "shade_vertex.glsl"); 
     System.out.println("found:" + pair.getURL()); 

    } 
} 

提供一流SomeClass()。getClass()產生相同的結果。

裝載機

package com.pkg.loader; 

import java.io.File; 
import java.net.URL; 

public class Loader { 
    public Loader(Class<?> c, String file) { 
     this(packageName(c.getPackage()), file); 
    } 

    public Loader(Package p, String file) { 
     this(packageName(p), file); 
    } 

    protected Loader(String pack, String file) { 
     this.pack = pack; 
     this.file = file; 
    } 

    public String getStringPath() { 
     return pack+file; 
    } 

    public URL getURL() { 
     URL out = Thread.currentThread().getContextClassLoader().getResource(getStringPath()); 
     if(out==null) 
      throw new RuntimeException("unable to find shader URL for :'"+getStringPath()+"'"); 
     return out; 
    } 

    protected static String packageName(Class<?> clazz){ 
     return packageName(clazz.getPackage()); 
    } 

    protected static String packageName(Package p){ 
     return c + p.getName().replace('.', c) + c; 
    } 

    protected static char c = File.separatorChar; 

    protected String pack; 
    protected String file; 
} 

標記類

public class SomeClass {} 
+0

您是否已手動檢查資源是否位於您的jar中的預期位置? – DNA 2012-02-20 23:56:05

+0

確保你的jar在運行時類路徑 – objects 2012-02-20 23:52:37

+0

「*任何建議?」* 1)發佈[SSCCE](http://sscce.org/)。 2)'System.out.println(packageName(getClass())+「file.glsl」); //調試101' – 2012-02-21 06:25:04

回答

2

首先,儘量不要直接將源文件的默認包(SRC)。 創建至少一個包裝來包裝源代碼,因爲當導出jar文件時,不包含src文件夾。因此,如果您創建自己的默認包,那麼您將擁有一些定義的根目錄以將資源路徑作爲基礎。

您創建了自己的默認包後,您的問題可能已經是固定的,但如果它不是那麼試試這個:

YourClass.class.getResource("/your_root_package/blah/blah/file.glsl"); 

它爲我的圖片:

public static Image ICON32 = Toolkit.getDefaultToolkit().getImage(MainFrame.class.getResource("/files/images/icon32.png")); 

是的,所以,希望這有助於。 :)

+0

正如剛編輯的那樣,該文件確實站在一個包中,並按照您的建議加載:/無論如何,謝謝! – Martin 2012-02-21 09:19:37

0

這個問題實際上是這一行:

protected static char c = File.separatorChar; 

這將是在Windows的反斜槓,但對於Class#getResource()路徑必須向前才能正常工作斜槓。 JRE可能會查找您的路徑作爲相對路徑並從字​​面上解釋反斜槓。

在任何情況下,你應該使用這個特殊的例子是什麼:

​​

Class#getResource()已經處理了這個相對於類解決,所以它沒有任何意義重複的代碼在你的應用程序。