2016-02-28 1 views
0

У меня возникли проблемы с получением Class.forname ("org.h2.Driver"); не бросать исключение. Я добавил файл h2 * .jar в файл сборки, и у меня даже появился основной файл для доступа к базе данных (холод будет под кодом проблемы. Я пытаюсь использовать dbValues ​​в приложении Vaadin, и он просто не принимает. Я не могу импортировать какой-либо пакет org.h2.samples или org.h2. *;Исключение класса ClassNotFound для базы данных h2 class.forname ("org.h2.Driver")

Примечание: 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 часов, чтобы заставить это работать.

Shows the paths on the side

ответ

0

Убедитесь, что библиотека находится в пути к классам. Вы можете вручную включить библиотеку на WEB-INF/lib. В качестве альтернативы вы могли бы включить банку H2 в общей папке lib Tomcat.

0

Драйверы JDBC известны (новизна для?), Которые необходимо разместить в контейнере Servlet, а не в определенном веб-приложении. Это позволяет избежать множества проблем. Как this Answer by Reichart объясняет:

Драйверы JDBC регистрируются в однодисковом DriverManager JVM, который используется всеми веб-приложениями.

К сожалению, перенос драйвера JDBC на контейнер Servlet означает, что все ваши веб-приложения на этом контейнере должны использовать ту же версию драйвера и, возможно, базу данных.

Не уверен, что это означает для H2. Но, похоже, лучше всего помещать всю банку H2 в контейнер Servlet, а не в ваше веб-приложение.