2012-02-20 13 views
4

eclipseのsrc/dirのパッケージに含まれるリソースを正常に読み込むことができます。さて、私はjarをエクスポートします(src、export、jarを右クリックし、デフォルト設定を保持します)。リソースを別のEclipseプロジェクトにロードすることはできません。 getResource()はjar内のコンテンツをロードできません

は、私は、同じパッケージ名でクラスの地位を示すことにより、リソースへのパスを構築する:

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ファイルは、リソース(日食プロジェクトの "参照されるライブラリ" 内のjarコンテンツを拡充)
  • のpackageName(のgetClass())+ファイル名が含まれています)きれいな名前を返します。 "\ ORG \ jzy3d \ PLOT3D \レンダリング\ DDP \アルゴリズム\ dual_peeling_init_vertex.glsl"

私は延々とnullの取得:/

EDIT:スクリーンショットとコード

enter image description here

を "それが動作するはずです" あなたはこのa SSCCE zipped eclipse project here

ユーザークラス

newで動的にクラスを提供
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

+0

あなたのjarファイルがランタイムクラスパスになっていることを確認してください – objects

+0

"*何か提案がありますか?" * 1)[SSCCE](http://sscce.org/)を投稿してください。 2) 'System.out.println(packageName(getClass())+" file.glsl "); // debugging 101' –

答えて

2

まず、デフォルトのパッケージ(SRC)で直接ソースファイルを配置しないようにしてください。 jarをエクスポートするとsrcフォルダが含まれないため、ソースをラップするために少なくとも1つのパッケージを作成します。したがって、独自のデフォルトパッケージを作成すると、リソースパスの基盤となるいくつかの定義済みのルートディレクトリが作成されます。

独自のデフォルトのパッケージを作成した後、あなたの問題が既に修正されるかもしれないが、それは、その後でなかった場合は、これを試してみてください。

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

0

問題は、実際にはこの行です:

protected static char c = File.separatorChar; 

これは、Windows上のバックスラッシュになりますが、Class#getResource()のパスは、前方に正しく機能するためにはスラッシュでなければなりません。 JREはおそらく相対パスとしてパスを探していて、バックスラッシュを文字通り解釈します。いずれの場合においても

、あなたがこの特定の例のために使用されなければならないことである。

​​

Class#getResource()すでにクラスにこの相対的な解決扱うので、それはあなたのアプリケーションでそのコードを複製しても意味がありません。 。

関連する問題