getResource()无法加载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项目的“引用库”中的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()已经处理解决这个相对于类的问题,所以在应用程序中复制该代码没有任何意义。

    链接地址: http://www.djcxy.com/p/66123.html

    上一篇: getResource() can't load content in a jar

    下一篇: In org .commons.ziparchiveentry how to give the filename in foreign languages