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;
你看到任何错误的方式? 我试过了:
我证实:
我无休止地检索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()
已经处理解决这个相对于类的问题,所以在应用程序中复制该代码没有任何意义。
上一篇: getResource() can't load content in a jar
下一篇: In org .commons.ziparchiveentry how to give the filename in foreign languages