簡體   English   中英

getResource()無法加載jar中的內容

[英]getResource() can't load content in a jar

我可以在eclipse中成功加載位於我的src / dir的某個包中的資源。 現在,我導出jar(右鍵單擊src,export,jar,並保留默認設置),並且不能在另一個eclipse項目中加載資源。

我通過指示站在相同包名中的類來構建資源的路徑:

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()
  • Thread.currentThread()。getContextClassLoader()。getResource()方法
  • 在包名稱的開頭添加/刪除'/'字符
  • 使用'/','\\'或File.separatorChar,甚至'。',都失敗了。

我證實了這一點:

  • jar包含資源(在eclipse項目的“Referenced Libraries”中擴展jar內容)
  • packageName(getClass())+ filename)返回一個干凈的名稱:“\\ org \\ jzy3d \\ plot3d \\ rendering \\ ddp \\ algorithms \\ dual_peeling_init_vertex.glsl”

我無休止地檢索一個null:/


編輯:截圖和代碼,以顯示“應該工作”

在此輸入圖像描述

你可以在這里檢索這個SSCCE壓縮的eclipse項目

用戶類

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 {}

首先,盡量不要將源文件直接放在默認包(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"));

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

問題實際上是這一行:

protected static char c = File.separatorChar;

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

在任何情況下,您應該為此特定示例使用的是:

URL out = getClass().getResource("file.glsl");

Class#getResource()已經處理了相對於類的解析,因此在應用程序中復制該代碼沒有意義。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM