- 浏览: 275868 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (129)
- 数据交互---协议---编码---乱码 (6)
- 客户端技术---JS---JQUERY (25)
- 客户端技术---CSS (2)
- 平台技术---类加载器 (5)
- 平台技术---线程安全 (3)
- 平台技术---JAVA---API---反射PROXY---AOP---IO (15)
- 服务端技术---SERVLET、JSP (2)
- 服务端技术---WEB容器 (12)
- 服务端技术---EJB容器 (1)
- 服务端技术---SSH (4)
- 持久技术---SQL、连接池、数据库 (22)
- 系统---设计模式 (3)
- 系统---报表---BRIT (2)
- 系统---UML (2)
- 开源项目---RED5 (2)
- 开源项目---JDK_JAVAC (1)
- 开源项目---BEANSHELL (2)
- 有技术含量的面试题 (3)
- IDE---ECLIPSE---MAVEN (11)
- 自我总结 (4)
- 性能调优 (2)
最新评论
-
jaywcjlove:
http://jaywcjlove.github.io/hot ...
JS 网页快捷键设置 -
xubindehao:
编译后的字节码放到缓存中
JAVAC动态编译 -
luyanfei78:
"maven.test.skip同时控制maven- ...
Maven编译打包时如何忽略测试用例 -
石斧砍柴好慢:
学习了!
修改Maven本地仓库和eclipse3.6的Maven本地仓库地址 -
至尊宝_唯一:
今天在myeclipse中出现了定义在META-INF在的co ...
数据源放于:/META-INF/context.xml
一、WebappClassLoader覆盖了classloader的loadclass方法
public synchronized Class loadClass(String name, boolean resolve) throws ClassNotFoundException { if (log.isDebugEnabled()) log.debug("loadClass(" + name + ", " + resolve + ")"); Class clazz = null; // Log access to stopped classloader if (!started) { try { throw new IllegalStateException(); } catch (IllegalStateException e) { log.info(sm.getString("webappClassLoader.stopped", name), e); } } // (0) 检查自身缓存:WebappClassLoader之前是否已经load过这个资源 clazz = findLoadedClass0(name); if (clazz != null) { if (log.isDebugEnabled()) log.debug(" Returning class from cache"); if (resolve) resolveClass(clazz); return (clazz); } // (1) 检查上一级缓存:ClassLoader之前是否已经load过 clazz = findLoadedClass(name); if (clazz != null) { if (log.isDebugEnabled()) log.debug(" Returning class from cache"); if (resolve) resolveClass(clazz); return (clazz); } // (2) 先交由系统ClassLoader,因此WEB-INF/lib和WEB-INF/classes或{tomcat}/libs下的类定义不能覆盖JVM 底层能够查找到的定义(譬如不能通过定义java.lang.Integer替代底层的实现 try { clazz = system.loadClass(name); if (clazz != null) { if (resolve) resolveClass(clazz); return (clazz); } } catch (ClassNotFoundException e) { // Ignore } // (5) Permission to access this class when using a SecurityManager,检查是否允许载入该类,如果该类禁止载入则抛异常 if (securityManager != null) { int i = name.lastIndexOf('.'); if (i >= 0) { try { securityManager.checkPackageAccess(name.substring(0,i)); } catch (SecurityException se) { String error = "Security Violation, attempt to use " + "Restricted Class: " + name; log.info(error, se); throw new ClassNotFoundException(error, se); } } } //这是一个很奇怪的定义,JVM的ClassLoader建议先由parent去load,load不到自己再去load(见如上 ClassLoader部分),而Servelet规范的建议则恰好相反,Tomcat的实现则做个折中,由用户去决定(context的 delegate定义),默认使用Servlet规范的建议,即delegate=false boolean delegateLoad = delegate || filter(name); // (1) 先由parent去尝试加载,此处的parent是SharedClassLoader,见如上说明,如上说明,除非设置了delegate,否则这里不执行 if (delegateLoad) { if (log.isDebugEnabled()) log.debug(" Delegating to parent classloader1 " + parent); ClassLoader loader = parent; //此处parent是否为空取决于context 的privileged属性配置,默认privileged=true,即parent为SharedClassLoader if (loader == null) loader = system; try { clazz = loader.loadClass(name); if (clazz != null) { if (log.isDebugEnabled()) log.debug(" Loading class from parent"); if (resolve) resolveClass(clazz); return (clazz); } } catch (ClassNotFoundException e) { ; } } // (2) 到WEB-INF/lib和WEB-INF/classes目录去搜索,细节部分可以再看一下findClass,会发现默认是先搜索WEB-INF/classes后搜索WEB-INF/lib if (log.isDebugEnabled()) log.debug(" Searching local repositories"); try { clazz = findClass(name); if (clazz != null) { if (log.isDebugEnabled()) log.debug(" Loading class from local repository"); if (resolve) resolveClass(clazz); return (clazz); } } catch (ClassNotFoundException e) { ; } // (3) 由parent再去尝试加载一下 if (!delegateLoad) { if (log.isDebugEnabled()) log.debug(" Delegating to parent classloader at end: " + parent); ClassLoader loader = parent; if (loader == null) loader = system; try { clazz = loader.loadClass(name); if (clazz != null) { if (log.isDebugEnabled()) log.debug(" Loading class from parent"); if (resolve) resolveClass(clazz); return (clazz); } } catch (ClassNotFoundException e) { ; } } throw new ClassNotFoundException(name); }
二、WebappClassLoader定义了自己的findclass方法
public Class findClass(String name) //调用 protected Class findClassInternal(String name) //调用 protected ResourceEntry findResourceInternal(String name, String path) { .... for (i = 0; (entry == null) && (i < repositoriesLength); i++) { try { String fullPath = repositories[i] + path;//repositories里面只有一个值,即:WEB-INF/classes Object lookupResult = resources.lookup(fullPath); if (lookupResult instanceof Resource) { resource = (Resource) lookupResult; } // Note : Not getting an exception here means the resource was // found entry = findResourceInternal(files[i], path); ResourceAttributes attributes = (ResourceAttributes) resources.getAttributes(fullPath); contentLength = (int) attributes.getContentLength(); entry.lastModified = attributes.getLastModified(); if (resource != null) { try { binaryStream = resource.streamContent(); } catch (IOException e) { return null; } if (needConvert) { if (path.endsWith(".properties")) { fileNeedConvert = true; } } .... } } catch (NamingException e) { } } if ((entry == null) && (notFoundResources.containsKey(name)))//这里已经缓存了加载失败的类名字以提高性能。 return null; JarEntry jarEntry = null; synchronized (jarFiles) {//如果在WEB-INF/classes中没找到则在CLASSPATH中JAR里找 try { if (!openJARs()) { return null; } for (i = 0; (entry == null) && (i < jarFilesLength); i++) { jarEntry = jarFiles[i].getJarEntry(path); } .... }
发表评论
-
eclipse tomcat启动,内存溢出问题
2012-06-18 15:27 2079在 启动过程中出现 内 ... -
实用的TOMCAT插件
2012-03-06 08:15 2030最近没事整了一个TOMCAT插件,和大家分享一下,附件是使用文 ... -
数据源放于:/META-INF/context.xml
2012-02-13 23:10 3398官方文档有些,在项目加了/META-INF/context.x ... -
TOMCAT---类加载器---findClass解读
2012-02-08 16:50 7WebappClassLoader中findclass ... -
TOMCAT处理JSP流程原理【apache-tomcat-6.0.32】
2011-11-26 16:25 1572tomcat处理JSP流程: -
Tomcat6.0 SSL配置--配置https协议的站点
2011-10-27 14:39 11011.首先用jdk自带的工具keytool生成一个" ... -
Tomcat 7 可以修改 Session 默认的 Cookie 名 JSESSIONID 了
2011-10-26 20:19 2510看看下面这个配置: <Context path=&qu ... -
启动tomcat7后报错,java.lang.NoClassDefFoundError: org/apache/juli/logging/LogFactory
2011-10-26 20:06 1568自己前一段时间出现了这个问题,通过在网上搜索,大概知道了原因, ... -
weblogic应用之间登录冲突--解决方案
2011-10-26 19:33 9781.找到应用部署的目录WEB-INF下有weblogic.xm ... -
TOMCAT结构
2011-10-17 17:56 832Tomcat 的心脏是两个组件:Connector连接器 和 ... -
TOMCAT怎么禁止访问WEB-INF目录
2011-10-17 17:52 54org.apache.catalina.core.Standa ... -
TOMCAT类加载
2011-10-11 19:30 1091对WEB应用的类路径为什么是WEB-INF/CLASSESS或 ... -
【转载】Tomcat连接器:Coyote框架
2011-09-13 10:48 914不论Tomcat的容器设计得如何精妙,本质上Tomcat就 ...
相关推荐
apache-tomcat-8.5.87-src 源码修改,修改tomcat类加载器WebappClassLoaderBase,以支持加载 作了加密的web项目。
DevLoader.zip tomcat 类加载器
3-7Tomcat中自定义类加载器的使用与源码实现(1).mp4
当tomcat从客户端收到请求时,将直接从Redis加载会话。 支持Redis默认,哨兵和集群模式(基于配置)。 展望未来,我们无需在Load Balancer中启用粘性会话(JSESSIONID)。 支持: Apache Tomcat 7 Apache ...
NULL 博文链接:https://sunfish.iteye.com/blog/1478036
用于 Apache Tomcat 的 Redis 会话管理器 概述 一个会话管理器实现,将会话存储在 Redis 中,以便在 Tomcat 服务器集群中轻松分发请求。 会话被实现为非粘性的——也就是说,每个请求都能够到达集群中的任何服务器...
│ ch09.rar 类加载器(实例演示) │ ch12.rar FORM验证登录文件,BASIC验证配置文件,Realm配置代码 │ ch13.rar Tomcat阀的使用(实例演示) │ ch14.rar JDBC资源(实例演示) │ ch17.rar 将Tomcat...
类加载器与Tomcat 类加载器 原理 tomcat
3-7Tomcat中自定义类加载器的使用与源码实现(2).mp4
3. 依赖于wiris云端服务器是加载公式插件的根本原因,css,js,post请求都依赖于wiris云端,如果网络很慢就会解析很慢 解决方案: 本地部署wiris插件服务器,js,css,post请求等,使其不依赖wiris云端 步骤: 1. 复制...
这里将JVM、OSGI、Tomcat以及OSGI和Web服务器整合平台的类加载器做了详细的说明和分析,能让你对类加载器的做一个较为系统的了解。
为了防止产品代码泄漏或授权等被破解,想到对源码加密,说是对源码加密,实际是需要对class文件进行加密。如果对class文件加密了,那类加载器如何能解析呢?...2、tomcat类加载器修改; 3、Spring-asm类加载修改;
java中JVM类加载器和双亲委派机制剖析,类加载示例、加载器示例、自定义一个类加载器示例;Tomcat自定义加载器详解
类加载器之所以能实现类隔离,是因为两个类相等的前提是它们由同一个类加载器加载,否则必定不相等。 JVM 在加载时,采用的是一种双亲委托机制,当类加载器要加载一个类时,加载顺序是: 首先将请求委托给父加载器,...
强烈推荐,涉及tomcat启动脚本catlina,原理,server结构分析,类加载器 tomcat权威指南等资料
其次,将jakarta-tomcat-5.0.28.zip解压至d:\jakarta-tomcat-5.0.28; d.安装SQL Server 2000(缺省的数据库用户:sa,密码:password),PostgreSQL8.0.1(数据库用户:postgres,密码:password)。 个人通讯录管理...
#指定哪些请求交给tomcat处理,"controller"为在workers.propertise里指定的负载分配控制器名 JkMount /*.jsp controller 4)在confi目录下创建workers.properties 内容为: worker.list = ...
Tomcat无法加载css和js等静态资源文件的情况想必从事相关行业的工作人员都有遇到过吧,接下来为大家介绍下详细的解决方法,感兴趣的朋友可以参考下
3.1版本包含对Apache Tomcat 3.0的几个改进,包括servlet重新加载,WAR文件支持和为IIS和Netscape Web服务器添加的连接器。最新的维护版本3.1.1包含了对安全问题的修复。Apache Tomcat 3.1.x没有进行积极的开发。...