org.postgresql.Driver 上的 Tomcat7 ClassNotFoundException

Tomcat7 ClassNotFoundException on org.postgresql.Driver

将系统从Debian 6(squeeze)升级到Debian 7(wheezy)后,Tomcat7无法启动应用程序。我是不是错过了要从 Tomcat6 目录结构复制到 Tomcat7 目录的配置文件?

Catalina.out

实际错误是 ClassNotFoundException,如启动时结果 catalina.out 所示,表明 postgresql 驱动程序不在 .war 文件部署中:

    Feb 10, 2016 10:30:00 AM org.apache.catalina.startup.HostConfig deployWAR
    INFO: Deploying web application archive /var/lib/tomcat7/webapps/dwf.war
    Feb 10, 2016 10:30:00 AM org.apache.catalina.startup.SetContextPropertiesRule begin
    WARNING: [SetContextPropertiesRule]{Context} Setting property 'debug' to '1' did not find a matching property.
    Feb 10, 2016 10:30:03 AM org.apache.tomcat.jdbc.pool.ConnectionPool init
    SEVERE: Unable to create initial connections of pool.
    java.sql.SQLException: org.postgresql.Driver
        at org.apache.tomcat.jdbc.pool.PooledConnection.connectUsingDriver(PooledConnection.java:254)
        at org.apache.tomcat.jdbc.pool.PooledConnection.connect(PooledConnection.java:182)
        at org.apache.tomcat.jdbc.pool.ConnectionPool.createConnection(ConnectionPool.java:701)
        at org.apache.tomcat.jdbc.pool.ConnectionPool.borrowConnection(ConnectionPool.java:635)
        at org.apache.tomcat.jdbc.pool.ConnectionPool.init(ConnectionPool.java:486)
        at org.apache.tomcat.jdbc.pool.ConnectionPool.<init>(ConnectionPool.java:144)
        at org.apache.tomcat.jdbc.pool.DataSourceProxy.pCreatePool(DataSourceProxy.java:116)
        at ....
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
        at java.lang.Thread.run(Thread.java:745)
    Caused by: java.lang.ClassNotFoundException: org.postgresql.Driver
        at java.net.URLClassLoader.run(URLClassLoader.java:366)
        at java.net.URLClassLoader.run(URLClassLoader.java:355)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
        at java.lang.Class.forName0(Native Method)
        at java.lang.Class.forName(Class.java:278)
        at org.apache.tomcat.jdbc.pool.PooledConnection.connectUsingDriver(PooledConnection.java:246)
        ... 32 more

WEB-INF/lib

postgresql .jar 在 .war 部署中,如目录列表所示:

root@app-02:/opt/tomcat/webapps/dwf/WEB-INF/lib# ls

antlr-2.7.6.jar
....
javassist-3.4.GA.jar         
postgresql-9.1-901.jdbc4.jar

Hibernate.cfg.xml

hibernate.cfg.xml 引用了驱动程序 class 并提供了用户名和密码,所以我缺少什么?

root@app-02:/opt/tomcat/webapps/dwf# cat ./WEB-INF/classes/hibernate.cfg.xml
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
    <session-factory>
        <property name="hibernate.bytecode.use_reflection_optimizer">false</property>
        <property name="hibernate.connection.driver_class">org.postgresql.Driver</property>

        <property name="hibernate.connection.username">usernameXXXXX</property>

        <!--PROD/DEV/QA-->
        <property name="hibernate.connection.password">passwordXXXXX</property>

        <property name="hibernate.dialect">org.hibernate.dialect.PostgreSQLDialect</property>
         <!-- Enable Hibernate's automatic session context management -->
         <property name="current_session_context_class">thread</property>

         <!-- Disable the second-level cache  -->
         <property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property>

         <!-- Echo all executed SQL to stdout -->
         <property name="show_sql">false</property>

        <mapping resource="com/ph/dwf/common/db/Application.hbm.xml" />
        .....

尽量把你的jar postgresql-9.1-901.jdbc4.jar直接放在~\apache-tomcat-7.0.67\lib下面