应用程序找不到jdbc驱动通常是由于类路径(环境变量classpath)设置方面问题。另外有的程序不使用classpath,而是使用注册表。有的程序如JBuilder使用自带的jdk。设置不当都可能导致应用程序找不到jdbc驱动。出现诸如java.lang.ClassNotFoundException之类错误。
杀手锏:将jdbc驱动程序包(.jar或.zip文件)扔到jre(jre是jdk的一部分,一般在jdk目录下)目录下的lib目录下的ext目录下,这是java的“系统扩展库”目录,其下文件会被java运行环境自动加载,可消除找不到jdbc驱动程序的现象。
注意如果你装了多个jdk,请先确认你应用程序运行时使用的是哪个目录下的jre,另外,检查一下注册表中Jdk、jre的版本是否适当。jdbc3.0要求jdk1.4,jdbc2.0一般使用jdk1.3。可能Oracle在你注册表中设置了jdk/jre是低版本,而你的Tomcat要使用高版本,互相打架呢。
1、jdk1.5目前不宜使用,许多软件只支持jdk1.4,甚至只支持jdk1.3。例如, oracle直到9i第二版才作为新特性宣布支持jdk1.3(见oracle白皮书)。另外, jdk与jdbc要配套,jdk1.3/1.2配jdbc2.0,jdk1.4配jdbc3.0,jdk1.5配jdbc4.0,目前 没几个厂家提供jdbc4.0驱动。
2、win2003与jdk有点不兼容,win2000下正常的java程序在win2003下出问题的情形已有先例。非要用win2003不可时,考虑设置为兼容win2000模式。
3、java程序放在带空格或汉字路径下,某些场合可能有问题。此外,设置 classpath时,好像要把该路径整个加上引号。
4、使用“杀手锏”时,classpath环境变量中对驱动程序不再需要设置,设了也没用。
5、【举例】如果jdk装在D:\j2sdk140目录,那么SQL Server的mssqlserver.jar不是放在D:\j2sdk140\lib\mssqlserver.jar,而是放在D:\j2sdk140\jre\lib\ext\mssqlserver.jar,其它两个文件msbase.jar、msutil.jar也类似处理。
6、java“扩展库目录”中的jar文件其地位是作为java本身(扩展)的类库文件, 在java运行时会自动加载,然后这些文件被java系统封锁,不能删除。所以, 检查驱动程序包文件(如mssqlserver.jar)是否对位的方法是:运行一个java程序(不管它是否使用jdbc),然后删除驱动包文件,如果报“共享冲突”之类错误,就表示该包已经被java用了,这时除非Class.forName中的类名写错, 否则没有找不到驱动程序类而报java.lang.ClassNotFoundException之类错误的道理。
7、装有多个jdk时,问题复杂些,但不是杀手锏不行。可以用windows搜索功能找一下机器上究竟有多少个java.exe、javaw.exe,以它们所在目录为当前目录,执行java.exe -version查看版本信息,并把各个java.exe、javaw.exe所对应的jre\lib\ext都放上驱动包应该可以被找到。但找到驱动后,连不上服务器,那是另外的问题了。例如,出现错误信息:[Microsoft][SQLServer 2000 Driver for JDBC]Error establishing socket时,从字面上看,jdbc驱动已经找到并运行了。这时连不上可能是url没写对、jdk与jdbc版本不配、jdbc与服务器不配等别的原因了。“杀手锏”已经奏效。
8、装多个jdk时,应检查注册表JavaSoft下记载的jdk、jre路径及记载的当前版本信息,有的程序使用注册表信息,如果装了多个版本jdk,而注册表中只有一个作为当前版本,那么这个版本合适吗?每个jdk安装时可能都在环境变量path中加入其相关路径,而只有排在前面的路径起作用,可用set命令查看环境变量。当你在dos窗口或在bat中运行java.exe、javaw.exe时,如果当前目录没有可执行文件java.exe或javaw.exe,windows会在path记载的各个路径下依次查找,按路径次序找到的第一个java.exe或javaw.exe的版本是否符合要求。每个软件的bat经常设置classpath、path、JAVA_HOME等环境变量,多个软件的设置可能互相影响。遇到问题时,可仔细分析这些因素。tomcat 与oracle有时“打架”,可以从tomcat用的jdk版本通常较高,oracle带的jdk版本通常较低着手分析解决。