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",
ClassLoader
JVM会使用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.properties
ClassLoaderUtil.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,抛出 NullPointerException
ClassPathUtils.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,抛出 NullPointerException
getResourceInAllClassLoader(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,抛出 NullPointerException
callingClass
是null,将会忽略此参数ClassLoader
里面都查不到资源,那么返回nullCopyright © 2008-2019 by feilong