今天下午我做了一个关于学生信息管理系统的demo,主要功能是使用jdbc对学生信息进行增删改查,整体的逻辑按照JNDI进行,使用oracle数据库。
第一次运行,果不其然出现了异常,参照下图:
经过检查,我发现我oracle的jar包导入路径错了,没有按照JNDI中的要求导入到tomcat文件夹下的lib文件夹中,而是导入到了项目的lib文件夹中。我向tomcat文件夹下的lib文件夹中添加了同名的jar包,我以为这样一来,程序就能正常运行了。
然而并没有。
异常还是这个异常,ClassNotFoundException,无法加载oracle数据库的驱动。
我意识到可能是因为两个同名的jar包同时存在,tomcat在处理上可能存在某一方面的优先级。于是我决定把之前错误路径上的jar包给删掉,只保留正确路径上的jar包。经过这次改动,程序可以正常运行了。
到了这里,这个项目运行成功了,然而接下来才是正题。
项目成功运行后,我突发奇想,如果在已存在正确路径中jar包的基础上,在错误的路径上再导入一个jar包,会不会重新产生异常呢?
答案再次出乎我的意料,还是没有。程序运行得非常顺利。
我逐渐意识到,这个现象的产生,可能与jar包导入的先后次序有关系。于是我新建了一个项目,项目内容与这个相同。我先导入了一个错误(指路径不为tomcat文件夹下lib文件夹中的jar包,下文的正确同义)的jar包,运行程序,然后导入了正确的jar包,这次的运行结果与第一次运行的结果相同。
第二次,我先导入了一个正确的jar包,运行程序,然后导入了错误的jar包,这次的运行结果与上文运行成功的效果相同。
那么,如果正确和错误的jar包都存在,但是在两个jar包都导入完成之前没有运行程序,结果又会怎么样呢?带着这个疑问,我开始了第三次的测试。测试的结果是程序可以成功运行。
经过上面三次的测试,对于JNDI中jar包导入先后次序影响运行结果的问题,我简单总结如下:
(1)某一时刻,只要运行了含有某个jar包的程序,即便在别的路径导入一个同名的jar包,运行的结果都会与之前的一致。只有把先导入的jar包在其路径中删除,程序才会在另一个jar包的基础上运行。可以把这种现象理解为一种“先入为主”的效果。
(2)在JNDI中,如果同时存在正确和错误的jar包,且在两个jar包都导入完成前没有运行程序,则程序能够正常运行。
注:在本个demo中,我使用的是Java EE 5.0,Tomcat 6.0,更高级别的版本可能不会出现此类问题。