今天下午我做了一个关于学生信息管理系统的demo,主要功能是使用jdbc对学生信息进行增删改查,整体的逻辑按照JNDI进行,使用oracle数据库。

    第一次运行,果不其然出现了异常,参照下图:


浅谈JNDI导入两个同名不同路径jar包的先后次序影响程序运行结果的问题_jar

   

    经过检查,我发现我oracle的jar包导入路径错了,没有按照JNDI中的要求导入到tomcat文件夹下的lib文件夹中,而是导入到了项目的lib文件夹中。我向tomcat文件夹下的lib文件夹中添加了同名的jar包,我以为这样一来,程序就能正常运行了。

    然而并没有。

    异常还是这个异常,ClassNotFoundException,无法加载oracle数据库的驱动。

    我意识到可能是因为两个同名的jar包同时存在,tomcat在处理上可能存在某一方面的优先级。于是我决定把之前错误路径上的jar包给删掉,只保留正确路径上的jar包。经过这次改动,程序可以正常运行了。


浅谈JNDI导入两个同名不同路径jar包的先后次序影响程序运行结果的问题_Class_02

浅谈JNDI导入两个同名不同路径jar包的先后次序影响程序运行结果的问题_jar_03

    

    到了这里,这个项目运行成功了,然而接下来才是正题。

    项目成功运行后,我突发奇想,如果在已存在正确路径中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,更高级别的版本可能不会出现此类问题。