Classpath路径问题
- src不是classpayh,/WEB-INF/classes,lib才是classpath
- /WEB-INF/classes存放src目录java文件编译后的class文件,xml、properties文件
- lib和classes同属classpath,访问优先级lib>classes
- classpath:和classpath*:的区别
- classpath:只会到class路径下查找文件
- classpath*:不仅包含class路径 还包括jar文件路径
Class.getResource()和ClassLoader.getResource()的区别
Class.getResource
- 如果path不以/开头,默认加载此类所在包下的资源
- path用/开头,加载classpath下的资源
ClassLoader.getResource
- path不能以/开头 path是指类加载器的加载范围
- /表示Boostrap ClassLoader中加载范围 因为这个类加载器是C++实现的 所以加载范围是null
Class.getResource(“/”)==Class.getClassLoader.getResource(“”);
Class源码
public java.net.URL getResource(String name)
{
name = resolveName(name);
ClassLoader cl = getClassLoader0();
if (cl==null)
{
// A system class.
return ClassLoader.getSystemResource(name);
}
return cl.getResource(name);
}
可以看出Class.getResource()和ClassLoader.getResource()本质是一样的,Class.getResource()之所以可以加载/路径的原因是在name = resolveName(name);
中进行了判断
private String resolveName(String name)
{
if (name == null)
{
return name;
}
if (!name.startsWith("/"))
{
Class c = this;
while (c.isArray()) {
c = c.getComponentType();
}
String baseName = c.getName();
int index = baseName.lastIndexOf('.');
if (index != -1)
{
name = baseName.substring(0, index).replace('.', '/')
+"/"+name;
}
} else
{//如果是以"/"开头,则去掉
name = name.substring(1);
}
return name;
}