public final class ClassLoaderUtil extends Object
ClassLoader工具类.
Class#getResourceAsStream(String) VS
ClassLoader#getResourceAsStream(String)基本上,两个都可以用于从 classpath 里面进行资源读取,classpath包含classpath中的路径和classpath中的jar
假设配置文件在 src/main/resources下面,比如 messages/feilong-core-message_en_US.properties,
Class#getResourceAsStream(String)需要这么写 "/messages/feilong-core-message_en_US.properties",
路径可以写成相对路径或者绝对路径; 以 / 开头,则这样的路径是指定绝对路径, 如果不以 / 开头, 则路径是相对与这个class所在的包的ClassLoader#getResourceAsStream(String)需要这么写 "messages/feilong-core-message_en_US.properties",
ClassLoaderJVM会使用BootstrapLoader去加载资源文件.
所以路径还是这种相对于工程的根目录即"messages/feilong-core-message_en_US.properties" 不需要"/"- 如果你的项目使用了spring,建议条件允许的话,使用
org.springframework.core.io.ClassPathResource,这个类是基于ClassLoader的,同时会org.springframework.util.StringUtils#cleanPath(String),并且如果发现首字符是/斜杆, 会去掉,这样使用起来很方便
ClassLoader,
URLClassLoader,
"org.springframework.core.io.ClassPathResource#ClassPathResource(String, ClassLoader)"| Modifier and Type | Method and Description |
|---|---|
static URL |
getResource(String resourceName)
获得给定名称
resourceName 的资源. |
static InputStream |
getResourceAsStream(String resourceName,
Class<?> callingClass)
加载资源
resourceName为 InputStream. |
static URL |
getResourceInAllClassLoader(String resourceName,
Class<?> callingClass)
Load a given resource.
|
public static URL getResource(String resourceName)
resourceName 的资源.
比如,在
src/test/resources目录下面有messages/feilong-core-test.properties资源文件,编译之后,地址会出现在target/test-classes/messages/feilong-core-test.propertiesClassLoaderUtil.getResource("/messages/feilong-core-test.properties") 或者 ClassLoaderUtil.getResource("messages/feilong-core-test.properties")返回相同的结果file:/E:/Workspaces/feilong/feilong-core/target/test-classes/messages/feilong-core-test.properties
- 如果
resourceName是以斜杆 "/" 开头,那么会被截取,因为ClassLoader解析方式不需要开头的斜杆, 请参见org.springframework.core.io.ClassPathResource#ClassPathResource(String, ClassLoader)- "",表示classes 的根目录
示例 (maven)测试 在web环境中,(即使打成jar的情形) getResource("")file:/E:/Workspaces/feilong/feilong-platform/feilong-core/target/test-classes/ file:/E:/Workspaces/feilong/feilong-platform/feilong-web-test/src/main/webapp/WEB-INF/classes/ getResource("com")file:/E:/Workspaces/feilong/feilong-platform/feilong-core/target/test-classes/com file:/E:/Workspaces/feilong/feilong-platform/feilong-web-test/src/main/webapp/WEB-INF/classes/com/
resourceName - the resource nameresourceName 是null,抛出 NullPointerExceptionClassPathUtils.toFullyQualifiedPath(Package, String),
getResource(ClassLoader, String),
getClassLoaderByClass(Class)public static InputStream getResourceAsStream(String resourceName, Class<?> callingClass)
resourceName为 InputStream.
- 如果
resourceName是以 斜杆 "/" 开头,那么会被截取, 因为 ClassLoader解析方式不需要 开头的斜杆, 请参见org.springframework.core.io.ClassPathResource#ClassPathResource(String, ClassLoader)- "",表示classes 的根目录
resourceName - The name of the resource to loadcallingClass - The Class object of the calling objectresourceName 是null,抛出 NullPointerExceptiongetResourceInAllClassLoader(String, Class),
"org.apache.velocity.util.ClassUtils#getResourceAsStream(Class, String)"public static URL getResourceInAllClassLoader(String resourceName, Class<?> callingClass)
- 如果
resourceName是以 斜杆 "/" 开头,那么会被截取,因为 ClassLoader解析方式不需要开头的斜杆, 请参见org.springframework.core.io.ClassPathResource#ClassPathResource(String, ClassLoader)- "",表示classes 的根目录
This method will try to load the resource using the following methods (in order):
- From
Thread.currentThread().getContextClassLoader()- From
ClassLoaderUtil.class.getClassLoader()- From
callingClass.getClassLoader()(如果 callingClass 不是null)
resourceName - The name of the resource to loadcallingClass - The Class object of the calling objectresourceName 是null,抛出 NullPointerExceptioncallingClass 是null,将会忽略此参数ClassLoader里面都查不到资源,那么返回nullCopyright © 2008-2019 by feilong