javax.servlet.ServletException:java.lang.NoClassDefFoundError:org / apache / commons / pool / KeyedObjectPoolFactory

时间:2012-11-16 19:54:59

标签: java oracle10g database-connection apache-commons-dbcp

我正在尝试使用BasicDataSource使用DBCP建立与Oracle数据库的连接。

我从commons-dbcp-1.4-bin.zip下载了here

类路径上有三个jar文件。

  1. 公地DBCP-1.4
  2. 公地DBCP-1.4-来源
  3. 公地DBCP-1.4的Javadoc
  4. 我正在使用以下代码建立连接。

    import java.sql.Connection;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import org.apache.commons.dbcp.BasicDataSource;
    
    public class DatabaseConnection {
    
        private final static BasicDataSource BASIC_DATA_SOURCE = new BasicDataSource();
        private final static String SQL = "SELECT * FROM admin WHERE login_id=? AND admin_pwd=?";
    
        static {
            BASIC_DATA_SOURCE.setDriverClassName("oracle.jdbc.OracleDriver");
            BASIC_DATA_SOURCE.setUrl("jdbc:oracle:thin:@localhost:1521:xe");
            BASIC_DATA_SOURCE.setUsername("wagafashiondb");
            BASIC_DATA_SOURCE.setPassword("root");
        }
    
        private static Connection getConnection() throws SQLException {
            return BASIC_DATA_SOURCE.getConnection();
        }
    
        public boolean exists(String userName, String password) throws SQLException {
            Connection connection = null;
            PreparedStatement ps = null;
            ResultSet rs = null;
            boolean exists = false;
    
            try {
                connection = getConnection();
                ps = connection.prepareStatement(SQL);
                ps.setString(1, userName);
                ps.setString(2, password);
                rs = ps.executeQuery();
                exists = rs.next();
            } finally {
                try {
                    if (connection != null) {connection.close();}
                    if (ps != null) {ps.close();}
                    if (rs != null) {rs.close();}
                } catch (SQLException e) {
    
                }
            }
            return exists;
        }
    }
    

    抛出以下异常,

    javax.servlet.ServletException: java.lang.NoClassDefFoundError: org/apache/commons/pool/KeyedObjectPoolFactory
    

    似乎暗示我使用了错误的来源。导致此异常的原因可能是什么?

1 个答案:

答案 0 :(得分:6)

解决方案

您需要在类路径上获取commons-pool库(JAR)。 事实表明commons-poolproject's dependecies list

commons-dbcp的依赖关系

解释

基本上NoClassDefFoundError意味着Java执行结果需要一个不在类路径上的特定类。这是因为类需要其他类(通常在import s中表示)。在您的情况下(至少)commons-dbcp中的一个类声明了对org/apache/commons/pool/KeyedObjectPoolFactory的依赖。

使用/作为分隔符给出了类的名称。如果这是一个通用名称(不是您自己的类),您可以尝试通过在Google中输入全名(例如org/apache/commons/pool/KeyedObjectPoolFactory)来查找从何处获取该名称。