Java 在Tomcat中加载JNDI资源时发生ClassNotFoundException
我目前正在尝试使用Tomcat/JNDI读取MS SQL Server数据库表。如果我手动将数据源硬编码到Java源中,我可以毫无问题地从表中读取数据,但是当我尝试使用JNDI加载数据源时,我得到一个ClassNotFoundException:Java 在Tomcat中加载JNDI资源时发生ClassNotFoundException,java,tomcat,jndi,Java,Tomcat,Jndi,我目前正在尝试使用Tomcat/JNDI读取MS SQL Server数据库表。如果我手动将数据源硬编码到Java源中,我可以毫无问题地从表中读取数据,但是当我尝试使用JNDI加载数据源时,我得到一个ClassNotFoundException: java.lang.ClassNotFoundException: com.microsoft.jdbc.sqlserver.SQLServerConnectionPoolDataSource org.apache.catalina.loader.We
java.lang.ClassNotFoundException: com.microsoft.jdbc.sqlserver.SQLServerConnectionPoolDataSource
org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1714)
org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1559)
org.apache.tomcat.dbcp.dbcp.BasicDataSource.createConnectionFactory(BasicDataSource.java:1420)
org.apache.tomcat.dbcp.dbcp.BasicDataSource.createDataSource(BasicDataSource.java:1371)
org.apache.tomcat.dbcp.dbcp.BasicDataSource.getConnection(BasicDataSource.java:1044)
TestServlet.doGet(TestServlet.java:53)
javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
我不希望看到这种情况,因为我将Microsoft的JDBC驱动程序(sqljdbc4.jar)存储在Tomcat的lib目录(而不是应用程序的WEB-INF/lib)中,并且当我将数据源硬编码到Java源代码中时,它工作得很好。有没有人知道为什么会发生这种情况,或者知道在使用JNDI资源时,为了让Tomcat将lib目录添加到类路径而必须指定的其他内容
context.xml:
<Context>
<!-- Default set of monitored resources -->
<WatchedResource>WEB-INF/web.xml</WatchedResource>
<!-- Uncomment this to disable session persistence across Tomcat restarts -->
<!--
<Manager pathname="" />
-->
<!-- Uncomment this to enable Comet connection tacking (provides events
on session expiration as well as webapp lifecycle) -->
<!--
<Valve className="org.apache.catalina.valves.CometConnectionManagerValve" />
-->
<Resource name="jdbc/dspr" auth="Container" type="javax.sql.DataSource"
username="<USERNAME OMITTED>"
password="<PASSWORD OMITTED>"
driverClassName="com.microsoft.jdbc.sqlserver.SQLServerConnectionPoolDataSource"
url="<URL OMITTED>"
validationQuery="select 1"
/>
</Context>
WEB-INF/WEB.xml
TestServlet.java(doPost()代码):
PrintWriter out=response.getWriter();
试一试{
//当此块被删除时,Servlet将失败,并出现ClassNotFoundException
//使用而不是下面的块
InitialContext initContext=新的InitialContext();
Context-envContext=(Context)initContext.lookup(“java:/comp/env”);
DataSource ds=(DataSource)envContext.lookup(“jdbc/dspr”);
// =========
//Servlet在取消注释并且注释掉上面的块时工作
//SQLServerConnectionPoolDataSource ds=新SQLServerConnectionPoolDataSource();
//ds.setURL(“”);
//ds.setUser(“”);
//设置密码(“”);
// =========
连接c=ds.getConnection();
语句s=c.createStatement();
布尔值good=s.execute(“从DS.test_表1中选择*);
System.out.println(“**查询良好?”+良好);
ResultSet rs=s.getResultSet();
while(rs.next()){
字符串col=rs.getString(“col1”);
字符串val=rs.getString(“val1”);
System.out.println(col+“|”+val);
}
c、 close();
}捕获(NamingE例外){
抛出新的ServletException(e);
}捕获(SQLE异常){
抛出新的ServletException(e);
}
写下“你好”;
out.close();
Tomcat包含和,因此您只需提供驱动程序类名
<Resource name="jdbc/dspr" auth="Container" type="javax.sql.DataSource"
maxActive="100" maxIdle="30" maxWait="10000"
username="<USERNAME OMITTED>"
password="<PASSWORD OMITTED>"
driverClassName="com.microsoft.sqlserver.jdbc.SQLServerDriver"
url="<URL OMITTED>" />
请参见中的示例。下面呢?您可以将资源注入servlet,而不是查找资源。请参见事实证明,我使用了
com.microsoft.jdbc.sqlserver.SQLServerConnectionPoolDataSource
作为驱动程序类名。实际上,它是com.microsoft.sqlserver.jdbc.SQLServerConnectionPoolDataSource。又名PEBCAK。我实际上也试过。我只是得到了com.microsoft.sqlserver.jdbc.SQLServerDriver
的ClassNotFoundException。请尝试我在本主题中提供的解决方案
<Resource name="jdbc/dspr" auth="Container" type="javax.sql.DataSource"
maxActive="100" maxIdle="30" maxWait="10000"
username="<USERNAME OMITTED>"
password="<PASSWORD OMITTED>"
driverClassName="com.microsoft.sqlserver.jdbc.SQLServerDriver"
url="<URL OMITTED>" />