Question:
JavaWeb项目已添加外部扩展Oracle驱动文件后连接数据库时提示java.lang.ClassNotFoundException: oracle.jdbc.OracleDriver
Analysis:
通过异常提示可以看出该问题是因为找不到Oracle数据库的驱动类
我们在发布Web项目前需要将Web项目相关类进行编译,形成JVM可执行的.class文件
此时编译不会报找不到Oracle数据库驱动的异常,因为未发布项目前我们可以找得到驱动文件所在的位置
如下图:
此时我们可以正常编译.java文件而不会出现找不到Oracle数据库的驱动类异常
而发布Web项目需要在Tomcat中部署Web项目相关JSP和相关class文件(此时.java的源文件无作用,编译后的.class文件才是有用的文件)
这个时候我们在加载类时找不到Oracle数据库的驱动类
为什么呢?
因为在Tomcat容器中加载类的顺序为
(网上流传的加载类顺序,这个比较全,这些内容会在《深入浅出JVM》中介绍,等五一结束去图书馆借这本书再进行修改)
1.最先是$JAVA_HOME/jre/lib/ext/下的jar文件。
2.环境变量CLASSPATH中的jar和class文件。
3.$CATALINA_HOME/common/classes下的class文件。
4.$CATALINA_HOME/commons/endorsed下的jar文件。
5.$CATALINA_HOME/commons/i18n下的jar文件。
6.$CATALINA_HOME/common/lib 下的jar文件。
(JDBC驱动之类的jar文件可以放在这里,这样就可以避免在server.xml配置好数据源却出现找不到JDBC Driver的情况。)
7.$CATALINA_HOME/server/classes下的class文件。
8.$CATALINA_HOME/server/lib/下的jar文件。
9.$CATALINA_BASE/shared/classes 下的class文件。
10.$CATALINA_BASE/shared/lib下的jar文件。
11.各自具体的webapp /WEB-INF/classes下的class文件。
12.各自具体的webapp /WEB-INF/lib下的jar文件。
不会从其他路径加载类(未自定义加载类配置)
自然也就找不到Oracle数据库的驱动类,会提示ClassNotFoundException异常
Solution: (本例IDE为Eclipse;数据库为Oracle;Web容器为Tomcat)
Method 1 : 需要复制数据库驱动文件
将数据库的驱动文件复制到{ 你的项目的 }\WebContent\WEB-INF\lib文件夹下
当编译运行JavaWeb项目时会自动将ojdbc3.jar这个驱动文件部署到Tomcat中的Web项目中的\WEB-INF\lib如下图
此时就不会再有找不到Oracle驱动的ClassNotFound异常,如果其他设置正确就会正确运行
Method 2 : 不需要复制数据库驱动文件,在部署项目时将Oracle驱动文件部署(复制)到Tomcat中的Web项目中的\WEB-INF\lib目录中
1. 右击你的JavaWeb项目选择Build Path的再选择Configure Build Path, 如下图
2. 然后进入Java Build Path 界面
选中Libraries进入下图界面
点击Add External JARs导入外部jar文件,这里即数据库驱动文件
如下图
3. 单击Oracle驱动包,然后单击打开将Oracle驱动包导入, 如下图
4. 导入数据库驱动包后,在Java Build Path的Libraries下会出现刚刚导入的数据库驱动包,如下图
5. 单击左侧Java Build Path上方的Deployment Assembly进入Web Deployment Assembly,然后单击Add按钮,如下图
6. 然后双击Java Build Path Entries进入Java Build Path Entries
7. 然后单击该驱动包选中,点击finish. 部署结束
当编译运行JavaWeb项目时会自动将ojdbc3.jar这个驱动文件部署(复制)到Tomcat中的Web项目中的\WEB-INF\lib如下图
此时就不会再有找不到Oracle驱动的ClassNotFound异常,如果其他设置正确就会正确运行