- 论坛徽章:
- 0
|
一、原理
JVM在运行时会产生三个ClassLoader, 它们分别是Bootstrap ClassLoader、Extension ClassLoader和AppClassLoader:
Bootstrap ClassLoader 加载核心类库static const char classpathFormat[] ="%/lib/rt.jar:""%/lib/i18n.jar:""%/lib/sunrsasign.jar:""%/lib/jsse.jar:""%/lib/jce.jar:""%/lib/charsets.jar:""%/classes";这里我们可看到为什么在classpath里为什么不加载这些类
Extension ClassLoader 加载扩展类,即/lib/ext中的类。
AppClassLoader 加载Classpath中指定的类。
从上面可以看出,所有web应用程序的类都是AppClassLoader来加载的,三者的关系为:AppClassLoader的Parent是ExtClassLoader,而ExtClassLoader的Parent为Bootstrap ClassLoader。加载一个类时,首先BootStrap先进行寻找,找不到再由ExtClassLoader寻找,最后才是AppClassLoader。ClassLoader这种加载类的模型被称为是委托模型。
从上面的理论可以看到,一般情况下web应用程序的类都是通过 AppClassLoader来进行加载的,当然你也可以选把web应用程序类放在扩展目录下让ExtClassLoader去加载,这样做当然很不适合,因为一般情况下的web程序应用类由于关联的关系都必须按一定的目录结构存放,所以必须让AppClassLoader来加载这些类了。
这是你选择设置classpath的理由。
二、方法
为了让AppClassLoader找到你需要应用的类,你必须用classpath指定类的路径。例如sybase的驱动放在E:\weblib\msbase.jar的这个包里,那么在classpath里指定一个路径:E:\weblib\msbase.jar,当应用程序要使用了sybase的驱动时自动在这个包里去寻找,反之,如果没有classpath的这个设置,试想AppClassLoader从哪里去找你要应用的类呢?当然要注意的AppClassLoader寻找是一种委托模型(原理篇里已说明了寻找的次序)。依此类推所有你需要用的应用类你都必须在classpath里进行设置。
我这里有一个例子:
环境是e:\tomcat 4.1 ,e:\jbuilder8\jdk1.4,e:\sybase数据库
e:\sybase\ASEP\3pclass.zip;e:\sybase\ASEP\monclass.zip;E:\jbuilder8\jdk1.4;E:\jbuilder8\jdk1.4\lib;E:\jbuilder8\jdk1.4\jre\lib;e:\Oracle\Ora81\orb\classes\yoj.jar;e:\Oracle\Ora81\orb\classes\share.zip;e:\Oracle\Ora81\orb\classes\share.zip;e:\Tomcat 4.1\common\lib\servlet.jar;e:\Oracle\Ora81\orb\classes\yoj.jar;e:\Oracle\Ora81\orb\classes\share.zip;e:\weblib\jConnect55.tar;e:\weblib\jConnect55\classes\jconn2.jar;e:\weblib\jConnect55\classes\jTDS2.jar;e:\weblib\jConnect55\classes;e:\weblib\classes12.zip;e:\weblib\nls_charset12.zip;e:\weblib\mssqlserver.jar;e:\weblib\msbase.jar;e:\weblib\msutil.jar;E:\Tomcat 4.1\webapps\test\WEB-INF\classes;E:\Tomcat 4.1\webapps\web1000\WEB-INF\classes;E:\Tomcat 4.1\webapps\web1000\WEB-INF\classes\com;
理解了这个以后,剩下的工作就是满世界去找可以满足你的需求的类。
希望我已经说明白这个问题了。 |
|