问题
I'm trying to establish a connection to an Oracle database using BasicDataSource using DBCP.
I downloaded commons-dbcp-1.4-bin.zip from here.
There are three jar files on the classpath.
- commons-dbcp-1.4
commons-dbcp-1.4-sources- commons-dbcp-1.4-javadoc
I'm using the following code for the connection to be established.
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;
}
}
It throws the following exception,
javax.servlet.ServletException: java.lang.NoClassDefFoundError: org/apache/commons/pool/KeyedObjectPoolFactory
It appears to imply that I'm using a wrong source. What might be the reason for this exception to be caused?
回答1:
Solution
You need to get the commons-pool
library (JAR) on a classpath.
The fact is indicated as commons-pool
being a dependency of commons-dbcp
in project's dependecies list
Explanation
Basically the NoClassDefFoundError
means the Java execution turned out to require a specific class which is not on classpath. This is because classes needs other classes (typically indicated in import
s). In your case (at least) one of the classes from commons-dbcp
declares a dependency to org/apache/commons/pool/KeyedObjectPoolFactory
.
The name of the class is given using /
as separators. If that's a common name (not your own class), you may try to find where to get it from by just typing the full name (e.g. org/apache/commons/pool/KeyedObjectPoolFactory
) in Google.
来源:https://stackoverflow.com/questions/13423491/javax-servlet-servletexception-java-lang-noclassdeffounderror-org-apache-commo