2012-06-14 87 views
6

下面的代碼失敗就行:ClassNotFoundException的oracle.jdbc.driver.OracleDriver僅在小服務程序,使用Eclipse

Class.forName("oracle.jdbc.driver.OracleDriver"); 

與錯誤:

java.lang.ClassNotFoundException: oracle.jdbc.driver.OracleDriver

兩個println S打印:

Wed_Jun_22_11:18:51_PDT_2005 
false 

這讓我覺得這個類存在,可以找到。這個完全相同的類也適用於非servlet應用程序。

我已經多次重新啓動所有設備並多次重新生成應用程序/ servlet。所有的值都被硬編碼以使其簡單和簡短。

private static Connection getDBConnection() throws Exception { 
    System.out.println(oracle.jdbc.driver.OracleDriver.BUILD_DATE); 
    System.out.println(Class.class.desiredAssertionStatus()); 
    //load the driver 
    Class.forName("oracle.jdbc.driver.OracleDriver"); 

    return DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orcl", "SYSTEM", "pass"); 
} 

完整的Servlet失敗:

package servletClass_3; 

import java.io.IOException; 
import java.sql.Connection; 
import java.sql.DriverManager; 

import javax.servlet.ServletException; 
import javax.servlet.annotation.WebServlet; 
import javax.servlet.http.HttpServlet; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 

/** 
* Servlet implementation class OneMoreBookStore 
*/ 
@WebServlet("/OneMoreBookStore") 
public class OneMoreBookStore extends HttpServlet { 

    private static final long serialVersionUID = 1L; 

    /** 
    * @see HttpServlet#HttpServlet() 
    */ 
    private static Connection getDBConnection() throws Exception { 

     System.out.println(oracle.jdbc.driver.OracleDriver.BUILD_DATE); 
     System.out.println(Class.class.desiredAssertionStatus()); 

     //load the driver 
     Class.forName("oracle.jdbc.driver.OracleDriver"); 
     return DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orcl", "SYSTEM", "pass"); 
    } 

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
     try 
     { 
      Connection con = getDBConnection(); 
     } 
     catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 

} 

此應用程序的工作原理:

package servletClass_3; 

import java.sql.Connection; 
import java.sql.DriverManager; 

public class DBConnect { 

    private static Connection getDBConnection() throws Exception { 
     System.out.println(oracle.jdbc.driver.OracleDriver.BUILD_DATE); 
     System.out.println(Class.class.desiredAssertionStatus()); 

     //load the driver 
     Class.forName("oracle.jdbc.driver.OracleDriver"); 
     return DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orcl", "SYSTEM", "pass"); 
    } 
    public static void main(String[] args) { 
     try 
     { 
      Connection con = getDBConnection(); 
      System.out.println("connection worked"); 
      con.close(); 
     } 
     catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 

} 

我使用:

  • 的Eclipse 1.4.2的JavaEE
  • 個Tomcat的7
  • jdk1.7
  • 的Oracle 11g R2
  • 64位Windows 7
+2

您確定在您的Web應用程序的/WEB-INF/lib目錄或$ {tomcat.install.dir}/lib目錄中有oracle-xx.jar嗎?這看起來像是類路徑中缺少的oracle驅動程序jar。 –

回答

11

也許你沒有部署與應用程序Oracle驅動程序。

您有幾種選擇:

  • 您可以將驅動程序的jar放到WEB-INF/lib文件夾
  • 您申請導出。 - >右鍵點擊項目 - >Build Path - >Configure Build Path... - >Order and Export - >檢查驅動程序。
  • 將驅動程序jar放入應用程序服務器的共享或庫擴展文件夾中。 (你應該選擇一個或兩個去,雖然。)
+1

將ojdbc14.jar文件放在WEB-INF/lib文件夾中解決了問題! 我仍然不明白爲什麼oracle.jdbc.driver.OracleDriver.BUILD_DATE工作,但在下一行沒有找到類。 謝謝 – Geoff

+0

我想我找出了爲什麼一個調用OracleDriver的工作,另一個沒有。第一個調用被編譯到應用程序中,ojdbc14.jar位於構建路徑中,因此它可以工作。第二次調用是在運行時進行的,因此它在java運行時需要位於路徑中。 – Geoff

0

試試這個,改變oracle.jdbc.driver.OracleTypesoracle.jdbc.OracleTypes

5

必須包含在項目的部署大會的ojdbc6.jar文件...

  1. 選擇包含jsp文件的web項目...

  2. 在Eclipse

  3. 選擇菜單欄中的項目選項卡在下拉菜單中選擇性能

  4. 選擇部署大會

  5. 添加您的ojdbc6.jar文件在裏面。

相關問題