无法从Tomcat Java servlet连接到H2

时间:2014-08-22 13:26:52

标签: java eclipse tomcat servlets h2

我对来自Java servlet的H2数据库连接(在Tomcat上运行)有一个奇怪的问题。

方案如下: 首先,我在Tomcat 7.0上运行servlet,一切都很好。我可以访问localhost上的静态网页。然后,当我尝试通过HTML表单执行与servlet的通信时,一切都会中断,我得到一个异常:

java.lang.ClassNotFoundException: org.h2.Driver
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1718)
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1569)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Unknown Source)
....

等等。

问题是,我在类路径中有h2 jar文件(使用Eclipse:右键单击项目 - >属性 - >库选项卡 - >添加(外部)JAR ...)。我真正无法理解的是,如果我从非servlet类(如Java Application)运行相同的代码,一切正常,我可以连接到数据库。

我用来连接的代码是:

try {
    Class.forName("org.h2.Driver").newInstance();//it breaks here
}
catch(Exception Ex) {
    Ex.printStackTrace();
}
try {
    connection = DriverManager.getConnection(url, username, password);
}
catch(Exception Ex){
    Ex.printStackTrace();
}

我使用与H2控制台完全相同的连接URL,用户名和密码,我可以毫无问题地连接到该控制台。

谢谢!

2 个答案:

答案 0 :(得分:2)

将H2驱动程序jar放入Tomcat的类路径中,或者将maven依赖项tomcat-jdbc(可能还有tomcat-juli)添加到pom.xml中。

这是我的理论。您在webapp类加载器级别(在web-inf \ lib下)具有H2驱动程序,但Tomcat的catalina类(在服务器类路径中)无法访问它。如果您在本地webapp中没有tomcat-jdbc,则创建连接池的任务将委派给系统/服务器类加载器,该类加载器显然无法访问本地webapp类加载器。

答案 1 :(得分:1)

您需要确保库位于类路径中,Eclipse中的那些设置可能没有您期望的效果。

您可以在WEB-INF / lib上手动包含该库。或者,您可以在Tomcat common lib文件夹中包含H2 jar。