预览加载中,请您耐心等待几秒...
1/10
2/10
3/10
4/10
5/10
6/10
7/10
8/10
9/10
10/10

在线预览结束,喜欢就下载吧,查找使用更方便

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

为什么写这篇文档? 使用过hibernate,spring或其他大型组件,写过50个类以上的网络应用程序(webapplication)的开发者应该知道,当系统中有很多类时,如果开启了Tomcat的reloadable=true,那么每当相关文件改变时,Tomcat会停止webapp并释放内存,然后重新加载webapp.这实在是个浩大的工程。 所以我总是在想如果能有只重载某几个类的功能,将极大的满足我这个即时调试狂。 去年我在论坛上发帖,才发现已经有一些应用服务器具有了这个功能,比如WebLogic,WebSphere,等等。好像还有一个很酷的名字,叫开发模式。看来我还是孤陋寡闻了点。 当然很多人都是在Tomcat上开发,包括我。我很喜欢它的轻小,那些大内存和高CPU消耗的应用服务器不愧为硬件杀手,没理由不改进Tomcat:)。 最终实现功能 我没有时间去研究Tomcat的文件监听机制,也没时间去把他写成”开发模式”这么完整的功能,我最终实现的是,实现重载功能的测试jsp--很抱歉我还是没办法写得更完整。当然,你可以在这个基础上进行改进。 阅读须知 阅读本文,你应该具备以下知识 jvm规范有关类加载器的章节 HYPERLINK"http://java.sun.com/docs/books/vmspec/2nd-edition/html/VMSpecTOC.doc.html"http://java.sun.com/docs/books/vmspec/2nd-edition/html/VMSpecTOC.doc.html Tomcat类加载机制 HYPERLINK"http://www.huihoo.org/apache/tomcat/"http://www.huihoo.org/apache/tomcat/ java反射机制 HYPERLINK"http://java.sun.com/docs/books/tutorial/reflect/"http://java.sun.com/docs/books/tutorial/reflect/ ant HYPERLINK"http://ant.apache.org/"http://ant.apache.org/ (好象该网址被不定时封锁,有时能上,有时不能) 最好在你的电脑上安装ant,因为Tomcat源码包使用ant从互联网获得依赖包。不过我也是修改了一个错误才使它完全编译通过。 当然,你也可以用其他IDE工具检查并添加依赖包,在IDE中,其实你只需要添加jar直到使org.apache.catalina.loader.WebappClassLoader无错即可。 修改过程 说明 新添加的代码请添加到java文件的末尾,因为我在说明行数的时候,尽量符合原始行数 webapp类加载器 在Tomcat中,org.apache.catalina.loader.WebappClassLoader是webapp的类加载器,所以需要修改它实现重载功能。 资源列表 在WebappClassLoader中,有一个Map类型属性resourceEntries,它记载了webapp中WEB-INF/classes目录下所加载的类,因此当我们需要重载一个类时,我们需要先将它在resourceEntries里删除,我编写了一个方法方便调用: publicbooleanremoveResourceEntry(Stringname){ if(resourceEntries.containsKey(name)){ resourceEntries.remove(name); returntrue; } returnfalse; } 是否重载标志 让WebappClassLoader需要知道加载一个类是否使用重载的方式。所以我建立一个boolean类型的属性和实现它的getter/setter方法: privatebooleanisReload=false; publicbooleanisReload(){ returnisReload; } publicvoidsetReload(booleanisReload){ this.isReload=isReload; } 动态类加载器 根据jvm类加载器规范,一个类加载器对象只能加载一个类1次,所以重载实际上是创建出另一个类加载器对象来加载同一个类。当然,我们不需要再创建一个WebappClassLoader,他太大而且加载规则很复杂,不是我们想要的,所以我们创建一个简单的类加载器类org.apache.catalina.loader.DynamicClassLoader: packageorg.apache.catalina.loader;