簡體   English   中英

帶有JDBC的tomcat 6.0拋出ClassNotFoundException com.mysql.jdbc.Connection

[英]tomcat 6.0 with JDBC throws ClassNotFoundException com.mysql.jdbc.Connection

我已經通過Eclipse成功連接到MySQL數據庫,而沒有參與tomcat,因此至少取得了一些進展。 但是,當我從網頁(Tomcat 6.0)嘗試時,它會引發錯誤。 我遵循了這些教程,閱讀了文檔,看了無數的論壇,但現在兩天都找不到了。

讓我們一步一步看。 我正在運行tomcat 6.0.26並且已經安裝了MySQL,並可以正常運行。

1.將connectorj放置到CATALINA_HOME/lib

makun /home/makun/tomcat/apache-tomcat-6.0.26/lib ->ls | grep -i mysql*
mysql-connector-java-5.1.13-bin.jar

2.告訴Tomcat我的M​​ySQL信息。 (聲明資源要求),還映射用於調用數據庫測試的servlet(即/ tmp_db_test)

符(/WEB-INF/web.xml)

<?xml version="1.0" encoding="ISO-8859-1"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
    version="2.4">

    <servlet>
        <servlet-name>DatabaseTest</servlet-name>
        <servlet-class>com.masatosan.tmp.Tmp</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>DatabaseTest</servlet-name>
        <url-pattern>/tmp_db_test</url-pattern>
    </servlet-mapping>

    <resource-ref>
      <description>DB Connection</description>
      <res-ref-name>jdbc/MasatoDB</res-ref-name>
      <res-type>javax.sql.DataSource</res-type>
      <res-auth>Container</res-auth>
    </resource-ref>


</web-app>

3.配置tomcat資源工廠。

(CATALINE_HOME / CONF / context.xml中)

<!-- Default set of monitored resources -->
<WatchedResource>WEB-INF/web.xml</WatchedResource>

<!-- Masato added the line below to setup JDBC -->
<Resource 
    name="jdbc/MasatoDB" 
    auth="Container" 
    type="javax.sql.DataSource"
    maxActive="100" 
    maxIdle="30" 
    maxWait="10000"
    username="masato" 
    password="mypass" 
    driverClassName="com.mysql.jdbc.Driver"
    url="jdbc:mysql://localhost:3306/masatosan"/>

4.創建調用servlet的JSP頁面
這只是一個帶有發送POST請求的按鈕的頁面。

 <html>
    <head>
    </head>
    <body>
    <!-- click button to send request to servlet -->
    <form method="POST" action="tmp_db_test">
    <p><input type="submit" value="Submit" name="submit_button"></p>
    </form>
    </body>
    </html> 

5.最后實現嘗試連接到MySQL數據庫的servlet。
(Tmp.java)

package com.masatosan.tmp;

import java.io.IOException;
//import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.sql.DataSource;

import com.masatosan.dateformatter.DateFormatter;
import com.masatosan.logger.Logger;
import com.mysql.jdbc.Connection;


public class Tmp extends HttpServlet {


    private Connection conn;

    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        try {
            Context initCtx = new InitialContext();
            Context envCtx = (Context) initCtx.lookup("java:comp/env");
            DataSource ds = (DataSource)envCtx.lookup("jdbc/MasatoDB");

            conn = (Connection) ds.getConnection();

            String template = "INSERT INTO users(username, email, password, created_date) VALUES (?, ?, ?, ?);";
            PreparedStatement inserter = conn.prepareStatement(template);
            inserter.setString(1, "test_username");
            inserter.setString(2, "test@test.com");
            inserter.setString(3, "test_pass");
            inserter.setString(4, DateFormatter.formatToSqlDate(null));

            inserter.executeUpdate();
        }
        catch(Exception e) {
            Logger.log(e.getMessage());
        }
        finally {
            if(conn != null) {
                try {
                    conn.close();
                } catch (SQLException e) {
                    Logger.log(e.getMessage());
                }
            }
        }
    }
}

我編譯了Tmp.java並放入/WEB-INF/classes/com/masatosan/tmp/Tmp.class

然后重新部署Tomcat服務器並在瀏覽器上進行測試。 單擊提交按鈕時,出現錯誤:

javax.servlet.ServletException: Error instantiating servlet class com.masatosan.tmp.Tmp
    org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
    org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
    org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:852)
    org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588)
    org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
    java.lang.Thread.run(Thread.java:619)

root cause

java.lang.NoClassDefFoundError: Lcom/mysql/jdbc/Connection;
    java.lang.Class.getDeclaredFields0(Native Method)
    java.lang.Class.privateGetDeclaredFields(Class.java:2291)
    java.lang.Class.getDeclaredFields(Class.java:1743)
    org.apache.catalina.util.DefaultAnnotationProcessor.processAnnotations(DefaultAnnotationProcessor.java:181)
    org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
    org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
    org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:852)
    org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588)
    org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
    java.lang.Thread.run(Thread.java:619)

root cause

java.lang.ClassNotFoundException: com.mysql.jdbc.Connection
    org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1516)
    org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1361)
    java.lang.Class.getDeclaredFields0(Native Method)
    java.lang.Class.privateGetDeclaredFields(Class.java:2291)
    java.lang.Class.getDeclaredFields(Class.java:1743)
    org.apache.catalina.util.DefaultAnnotationProcessor.processAnnotations(DefaultAnnotationProcessor.java:181)
    org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
    org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
    org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:852)
    org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588)
    org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
    java.lang.Thread.run(Thread.java:619)

如果需要更多說明,請告訴我。

編輯

根據建議,connectorj jar停留在CATALINA_HOME / lib中

我已經將導入行固定在Tmp.java中,以:

import java.sql.Connection而不是com.mysql.jdbc.Connection

現在,單擊瀏覽器上的“提交”按鈕時出現新錯誤。

Cannot create JDBC driver of class '' for connect URL 'null'

我試圖拖尾日志:

makun /home/makun/tomcat/apache-tomcat-6.0.26/logs-> tail -f localhost.2010-08-30.log

當我單擊“提交”按鈕時,沒有任何反應。 (我認為這是正確的日志,因為其他有錯誤的頁面將在日志中輸出消息)

UPDATE

我不確定為什么,但是當我嘗試將異常stacktrace打印到我的日志時它開始工作。 我已經從管理器頁面重新加載Tomcat了很多次,即使我進行了代碼更改,這可能會導致一些奇怪的問題並得到相同的錯誤頁面(它讓我可以互換地給我404和500。我希望可以提供確切的細節,但是問題部分中描述的我的步驟似乎有效(修復了所建議的一些問題之后)

該異常告訴您在加載/實例化servlet以便收集注釋緩存的任何注釋時,在調查servlet的聲明字段時找不到com.mysql.jdbc.Connection類。

您應該使用java.sql.Connection ,而不是com.mysql.jdbc.Connection 事實上, 所有的JDBC代碼應導入/使用java(x).sql 只有接口/類。 否則,您的JDBC代碼與使用的DB和JDBC驅動程序緊密耦合,並且不能與其他DB和/或驅動程序一起重用,這違反了JDBC的整個抽象思想。


就是說,將Connection聲明為Servlet的實例變量是一個非常糟糕的主意。 Servlet僅實例化一次,並在Webapp的生存期內在所有請求中共享。 您應該在盡可能短的范圍內獲取和關閉連接,即已經在完全相同的方法塊中。 更好的是,將所有JDBC邏輯放在一個可重用的DAO類中,您只需將其導入到servlet中即可。

也可以看看:

找不到“ com.mysql.jdbc.Connection”的類應該在mysql-connector-java-5.1.13-bin.jar中。 我認為tomcat應該可以從$ CATALINE_HOME / lib中獲取它。 所以從您所說的來看,它“應該”起作用了……

也許檢查用戶tomcat是否以對文件的讀取權限運行? jar文件是否可能已損壞-可能是文本模式下的ftp? 您確定CATALINA_HOME是/home/makun/tomcat/apache-tomcat-6.0.26-也許檢查tomcat啟動腳本以查看它是否配置為其他位置?

如果仍然無法正常工作,則可以嘗試將jar文件放入web-inf / lib。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM