Java 在Tomcat中加载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

我目前正在尝试使用Tomcat/JNDI读取MS SQL Server数据库表。如果我手动将数据源硬编码到Java源中,我可以毫无问题地从表中读取数据,但是当我尝试使用JNDI加载数据源时,我得到一个ClassNotFoundException:

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>"  />