繁体   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