我可以在 Eclipse 中成功加载 src/ 目录中某些包中的资源。现在,我导出 jar(右键单击 src,导出,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 项目 http://jzy3d.org/misc/jarresources/jarresources.zip
一个用户类
public class User {
public static void main(String[] args) {
Loader pair = new Loader(SomeClass.class, "shade_vertex.glsl");
System.out.println("found:" + pair.getURL());
}
}
使用 new 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 {}