Resin服务器getResource揭秘
(感谢网友 liuxiaori 继续分享其经历)这样的详细的图文并茂的文章让我很佩服!
前言
接上文“由一个问题到Resin ClassLoader的学习”,本文将以this.getClass().getResource(“/”).getPath()和this.getClass().getResourceAsStream(“/a.txt”)为例,一步步解析加载的过程。
调试环境
- 下载resin3.0.23的源码(http://www.caucho.com/download/resin-3.0.23-src.zip)。
- 部署到myeclipse中,有错误,本人忽略了。Resin可运行。
- 将EhCacheTestAnnotation部署到resin3.0.23中。
- 调试this.getClass().getResource(“/”).getPath()。
问题来了,无论如何也模拟不出来<compiling-loader>所造成的影响,一直输出:/D:/work_other/project/resin-3.0.23/bin/ 。无奈之下,采用了这种方式:使用两个eclipse,一个使用发布版本的,部署EhCacheTestAnnotation进行调试;另外一个部署resin3.0.23源码,调试到哪里对照看源码。
开始
1) this.getClass().getResource(“/”).getPath()
本次调试涉及的所有类加载器为:
EnvironmentClassLoader$24156236[web-app:http://localhost:8787/EhCacheTestAnnotation]
EnvironmentClassLoader$7806641[host:http://localhost:8787]
EnvironmentClassLoader$22459270[servlet-server:]
sun.misc.Launcher$AppClassLoader@7259da
sun.misc.Launcher$ExtClassLoader@16930e2
首先进入Class的getResource(String name)方法,如下图: