无法加载 jdbc 驱动程序类。 ClassNotFoundException

时间:2021-07-14 08:25:24

标签: java database jsp jdbc

我正在使用 eclipse 并且必须开发一个连接到 derby db 的 jsp 应用程序。 设置数据库后,我进入了我的项目并添加了 derbyclient.jar 和 derbyclient.jar 作为参考。 但是,每次我尝试获取 jdbc 类时,都会遇到 ClassNotFoundException。

Class.forName("org.apache.derby.jdbc.ClientDriver");    
<块引用>

jakarta.servlet.ServletException: java.lang.ClassNotFoundException: org.apache.derby.jdbc.ClientDriver org.apache.jasper.runtime.PageContextImpl.handlePageException(PageContextImpl.java:674) org.apache.jsp.index_jsp._jspService(index_jsp.java:179) org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:71) jakarta.servlet.http.HttpServlet.service(HttpServlet.java:770) org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:467) org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:379) org.apache.jasper.servlet.JspServlet.service(JspServlet.java:327) jakarta.servlet.http.HttpServlet.service(HttpServlet.java:770) org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)

我也用 mysql 数据库尝试过,得到了相同的结果,所以我想我的引用方式可能有问题。 References project settings

我打算使用一个业务java类,然后将在jsp中使用,因为我不想在jsp代码中包含db访问代码。 当前的“BusinessManager.java”类看起来像这样(只有需要用数据库代码替换的模拟内容)。

    package com.forum.shared;
import java.sql.*;
import java.time.Instant;
import java.util.*;

public class BusinessManager {

    
    public List<ForumEntity> LoadFromDatabase() throws ClassNotFoundException, SQLException
    {
        //Class.forName("com.mysql.jdbc.Driver");
        //Class.forName("org.apache.derby.jdbc.ClientDriver");                  
          //java.sql.Connection connect = null;
          //String dbName = "D:/Apache/test/forum";
          //String connectionURL="jdbc:derby://localhost:1527/" + dbName + ";create=true";

          //connect = DriverManager.getConnection(connectionURL);
          
          
        List<ForumEntity> result = new ArrayList<ForumEntity>();
        

        ForumEntity mockData = new ForumEntity();
        mockData.setID(1);
        mockData.setAntwortId(0);
        mockData.setAntwort(false);
        mockData.setInhalt("Willkommen im Forum!");
        mockData.setTitle("Willkommen");
        mockData.setName("Admin");
        mockData.setMail("admin@hszg.de");
        mockData.setZeit(java.util.Date.from(Instant.now()));
        
        ForumEntity answerData = new ForumEntity();
        answerData.setID(2);
        answerData.setAntwortId(1);
        answerData.setName("Max Mustermann");
        answerData.setMail("max_mustermann@gmx.com");
        answerData.setInhalt("Das ist eine Antwort");
        answerData.setZeit(java.util.Date.from(Instant.now()));
        mockData.addAnswer(answerData);
        
        result.add(mockData);
        return result;      
    }
    public ForumEntity LoadFromDatabaseById(int id)
    {
        ForumEntity result = new ForumEntity();
        
        result.setID(1);
        result.setAntwortId(0);
        result.setAntwort(false);
        result.setInhalt("Willkommen im Forum!");
        result.setTitle("Willkommen");
        result.setName("Admin");
        result.setMail("admin@hszg.de");
        result.setZeit(java.util.Date.from(Instant.now()));
        ForumEntity answerData = new ForumEntity();
        answerData.setID(2);
        answerData.setAntwortId(1);
        answerData.setName("Max Mustermann");
        answerData.setMail("max_mustermann@gmx.com");
        answerData.setInhalt("Das ist eine Antwort");
        answerData.setZeit(java.util.Date.from(Instant.now()));
        result.addAnswer(answerData);
        return result;      
    }
    
    public boolean CreateAndSafeForumEntity(int antwordId, boolean antwort, String titel, String inhalt, String name, String mail)
    {
        boolean result = false;
        
        
        return result;
    }
    
}

我没有想法。我已经添加了 dbms 和 non can be加载的 jar 文件。有什么想法吗?

编辑:我使用了这个 eclipse 项目模板 project template

编辑:更新 现在它变得有趣了。我决定尝试不同的方法。我保留了库作为参考,但决定尝试在运行时加载它们。

    public List<ForumEntity> LoadFromDatabase() throws ClassNotFoundException, SQLException
{
    
    List<File> jars = Arrays.asList(new File("D:\\Apache\\db-derby-10.15.2.0-bin\\lib").listFiles());
    URL[] urls = new URL[jars.size()];
    for (int i = 0; i < jars.size(); i++) {
        try {
            urls[i] = jars.get(i).toURI().toURL();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    URLClassLoader childClassLoader = new URLClassLoader(urls, ClassLoader.getSystemClassLoader());
    Class.forName("org.apache.derby.jdbc.ClientDriver", true , childClassLoader);

    //Class.forName("com.mysql.jdbc.Driver");
    //Class.forName("org.apache.derby.jdbc.ClientDriver");                  
    //java.sql.Connection connect = null;
    //String dbName = "D:/Apache/test/forum";
    //String connectionURL="jdbc:derby://localhost:1527/" + dbName + ";create=true";

    //connect = DriverManager.getConnection(connectionURL);
      
      
    List<ForumEntity> result = new ArrayList<ForumEntity>();
    

    ForumEntity mockData = new ForumEntity();
    mockData.setID(1);
    mockData.setAntwortId(0);
    mockData.setAntwort(false);
    mockData.setInhalt("Willkommen im Forum!");
    mockData.setTitle("Willkommen");
    mockData.setName("Admin");
    mockData.setMail("admin@hszg.de");
    mockData.setZeit(java.util.Date.from(Instant.now()));
    
    ForumEntity answerData = new ForumEntity();
    answerData.setID(2);
    answerData.setAntwortId(1);
    answerData.setName("Max Mustermann");
    answerData.setMail("max_mustermann@gmx.com");
    answerData.setInhalt("Das ist eine Antwort");
    answerData.setZeit(java.util.Date.from(Instant.now()));
    mockData.addAnswer(answerData);
    
    result.add(mockData);
    return result;      
}

猜猜当我之前到达 Class.forName("org.apache.derby.jdbc.ClientDriver") 时,他总是抛出 ClassNotFoundException。现在使用上面的运行时库加载代码,当我执行 Class.forName("org.apache.derby.jdbc.ClientDriver") 时,我不再得到 ClassNotFoundException。很奇怪。我一定是在设置引用时做错了什么。

0 个答案:

没有答案
相关问题