ClassNotFound изключение за h2 база данни class.forname(org.h2.Driver)

Имам проблем с получаването на Class.forname(org.h2.Driver); за да не хвърля изключение. Добавих h2*.jar към файла за компилация и дори получих основен файл за достъп до базата данни (студената ще бъде под кода на проблема. Опитвам се да използвам dbValues ​​в приложение на Vaadin и просто не се приема. Изглежда не мога да импортирам нито един пакет org.h2.samples;или org.h2.*;

Забележка: dbValues ​​се изпълнява чрез проект Vaadin. Не знам дали това помага, но това е единствената значителна разлика, за която се сещам между него (не работи) и dbTest (работи).

package com.example.assignment3;

import java.sql.*;
import java.util.ArrayList;

public class dbValues {

    ArrayList<business> a = new ArrayList<business>();

    public dbValues(){
        
        business b = new business();
        ArrayList<business> a = new ArrayList<business>();
        
        try {
            Class.forName("org.h2.Driver");
        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        try {
            
            Connection conn = DriverManager.getConnection("jdbc:h2:~/test","Lucas","");
            Statement stmt = conn.createStatement();
            ResultSet rs = stmt.executeQuery("SELECT * FROM COMPANIES");
            while(rs.next()){
                b.setID(rs.getInt("ID"));
                b.setName(rs.getString("NAME"));
                b.setSector(rs.getString("SECTOR"));
                b.setAddress(rs.getString("ADDRESS"));
                b.setProvince(rs.getString("PROVINCE"));
                a.add(b);
            }
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        
    }
    
    public ArrayList<business> returnBusinesses(){
        return a;
    }
}

Ето кода, който изглежда работи. Тези двете са в една и съща директория, така че не е това проблемът.

import java.sql.*;
import java.util.ArrayList;

import com.example.assignment3.business;
public class dbtest {
public static void main(String[] a)
throws Exception {

    /**
     * Create variables to iterate through when adding to database.
     */
    String dbname = "COMPANIES";
    int id = 0;
    String name = "";
    String sector = "";
    String address = "";
    String province = "";
    String query = "";
    
    Class.forName("org.h2.Driver");
    Connection conn = DriverManager.getConnection("jdbc:h2:~/test","Lucas","");
    
    /**
     * Create the business objects.
     */
    business boeing = new business(900162738, "Boeing Canada", "Aerospace", "123 Planes St.", "BC");
    business odysseyMoon = new business(900687789, "Odyssey Moon", "Aerospace", "687 The Moon", "NS");
    business vantage = new business(900278382, "Vantage Airport Group", "Aerospace", "77 Smith St.", "NB");
    business canadaBank = new business(900789213, "Bank of Canada", "Financial Services", "2325 Canada blvd.", "ON");
    business montrealBank = new business(900890876, "Bank of Montreal", "Financial Services", "2132 Bonjour Rd.", "QC");
    business rbc = new business(900564738, "Royal Bank of Canada", "Financial Services", "132 Clifton St.", "NB");
    business ubisoft = new business(900547967, "Ubisoft Halifax", "Interactive Media", "2000 Barrington St.", "NS");
    business scotiaBank = new business(900345273, "Scotia Bank", "Financial Services", "Yahmon Rd.", "NS");
    business propaganda = new business(900101928, "Propaganda Games", "Interactive Media", "25 Queen St.", "NT");
    business ea = new business(900162739, "EA Montreal", "Interactive Media", "54 Gagnon St.", "QC");
    
    /**
     * Create the arraylist that will be iterated through when adding
     * to the database and then add them to that list.
     */
    ArrayList<business> businesses = new ArrayList<business>();
    businesses.add(boeing);
    businesses.add(odysseyMoon);
    businesses.add(vantage);
    businesses.add(canadaBank);
    businesses.add(montrealBank);
    businesses.add(rbc);
    businesses.add(ubisoft);
    businesses.add(scotiaBank);
    businesses.add(propaganda);
    businesses.add(ea);
    
    /**
     * Perform the statement that populates the database.
     */
    try {
        Statement stmt = conn.createStatement();
        for(int i = 0; i < businesses.size(); i++){
            id = businesses.get(i).getID();
            name = businesses.get(i).getName();
            sector = businesses.get(i).getSector();
            address = businesses.get(i).getAddress();
            province = businesses.get(i).getProvince();
            query = "INSERT INTO " + dbname + " VALUES("+ id +", '"+ name +"', '"+ sector +"', '"+ address +"', '"+ province +"');";
            System.out.println(query);
            stmt.execute(query);
        }
        //stmt.execute("DELETE FROM COMPANIES;");

    } catch (SQLException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}
}

И така, някакви идеи по проблемите? Имам около 24 часа, за да заработя.

Показва пътеките отстрани


person Lucas Alexander    schedule 28.02.2016    source източник


Отговори (2)


Уверете се, че библиотеката е в classpath. Можете ръчно да включите библиотеката в WEB-INF/lib. Като алтернатива можете да включите H2 jar в папката Tomcat common lib.

person FallAndLearn    schedule 28.02.2016

JDBC драйверите са известни (известни с това?), че трябва да бъдат поставени в контейнера на Servlet, а не в конкретно уеб приложение. Така се избягват различни проблеми. Както този отговор от Reichart обяснява:

JDBC драйверите се регистрират в единичния DriverManager за цялата JVM, който се споделя от всички уеб приложения.

За съжаление преместването на вашия JDBC драйвер в контейнера на Servlet означава, че всичките ви уеб приложения в този контейнер трябва да използват една и съща версия на драйвера и може би база данни.

Все още не съм сигурен какво означава това за H2. Но изглежда, че може би е най-добре да поставите целия H2 буркан в контейнера на Servlet, а не в уеб приложението си.

person Basil Bourque    schedule 05.04.2016