2017-02-21 2 views
0

У меня есть простой Java-проект в Eclipse, который может подключаться к нескольким базам данных и пытаюсь изменить его, чтобы разрешить настройку параметров подключения из файла свойств.Java Class.forName() не работает, строка класса, загружаемая из файла свойств

На текущем этапе у меня есть рабочий класс DBHelper, который предоставляет метод getDatabaseConnection(), возвращающий элемент Connection, созданный с использованием жестко закодированных параметров.

Я пытаюсь создать аналогичный класс, который делает то же самое, но читает параметры из файла свойств.

Это называется PropertyParser и предоставляет метод getDBConnection().

Дело в том, что Class.forName() метод не работает, если вызывается из этого последнего, даже если все данные соединения сохраняются в файле свойств являются точно тот же жесткий закодировано в DBHelper классе, и оба относятся к имени полного класса (oracle.jdbc.driver.OracleDriver).

Здесь следует мой код.

Старый рабочий класс:

package mypath.helpers; 
import java.sql.Connection; 
import java.sql.DriverManager; 

public class DBHelper { 
    public static Connection getDatabaseConnection(){ 

     String dbClass = "oracle.jdbc.driver.OracleDriver"; 
     String dbUrl = "jdbc:oracle:thin:@host:port/service"; 
     String dbUser = "user"; 
     String dbPass = "pass"; 

     // connect to DB 
     try { 
      Class.forName(dbClass); 
      Connection con = DriverManager.getConnection(dbUrl, dbUser, dbPass); 
      con.setAutoCommit(false); 
      return con; 

     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
     return null; 
    } 
} 

Новый не рабочий класс:

package mypath.helpers; 

import java.io.FileInputStream; 
import java.io.FileNotFoundException; 
import java.io.IOException; 
import java.sql.Connection; 
import java.sql.DriverManager; 
import java.sql.SQLException; 
import java.util.Properties; 

public class PropertyParser extends Properties{ 

    // variables 
    private static String propFile = "conf/myprops.properties"; 
    private static String dbClassProp = "DBCLASS"; 
    private static String dbUrlProp = "DBURL"; 
    private static String dbUserProp = "DBUSER"; 
    private static String dbPassProp = "DBPASS"; 

    // constructor 
    public PropertyParser() throws FileNotFoundException, IOException{ 

     super(); 
     this.load(new FileInputStream(propFile)); 
    } 

    public Connection getDBConnection() throws SQLException, ClassNotFoundException{ 

     // read properties 
     String JDBCClass = this.getProperty(dbClassProp).trim() ; 
     String JDBCUrl = this.getProperty(dbUrlProp).trim(); 
     String JDBCUserId = this.getProperty(dbUserProp).trim(); 
     String JDBCPasswd = this.getProperty(dbPassProp).trim(); 

     Class.forName(JDBCClass); 
     Connection con = DriverManager.getConnection(JDBCUrl, JDBCUserId, JDBCPasswd); 
     con.setAutoCommit(false); 

     return con; 
    } 
} 

И вот главное, ти обоих вызовов:

public static void main(String[] args) throws FileNotFoundException, IOException, ClassNotFoundException, SQLException { 
     // this works fine 
     Connection con = DBHelper.getDatabaseConnection(); 
     System.out.println("Everything works fine till now."); 

     // this does not work 
     PropertyParser pp = new PropertyParser(); 
     Connection con2 = pp.getDBConnection(); 
     System.out.println("I will never reach this point."); 
    } 

И вот вывод я получаю:

Everything works fine till now. 
Exception in thread "main" java.lang.ClassNotFoundException: "oracle.jdbc.driver.OracleDriver" 
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424) 
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357) 
    at java.lang.Class.forName0(Native Method) 
    at java.lang.Class.forName(Class.java:264) 
    at mypath.helpers.PropertyParser.getDBConnection(PropertyParser.java:35) 
    at mypath.GetConnection.main(GetConnection.java:20) 

Файл ojdbc.jar сконфигурирован в пути сборки проекта. Есть ли способ достичь результата?

+0

ли 'ojdbc.jar'available на' CLASSPATH' тоже? –

+0

Что делает класс свойств? Вставьте это также – djames

+0

Класс @djames Properties - стандартный java.util.Properties. – narduz

ответ

1

Проблема показана в сообщении expection:

Исключение в потоке "основной" java.lang.ClassNotFoundException: "oracle.jdbc.driver.OracleDriver"

Если бы я написать

Class.forName("HelloWorld"); 

Я получаю следующее сообщение об исключении:

Исключение в теме "main" java.lang.ClassNotFoundException: HelloWorld

Каких-то файл свойства содержат не имя класса, но имя класса, заключенное в кавычках.

Полоса этих цитат и ваш код будут работать.

+0

Очевидные вещи - это самое худшее! Большое спасибо, я сходил с ума :) – narduz

0

Посмотрите, есть ли класс oracle.jdbc.driver.OracleDriver в ojdbc.jar.

Простым способом, это импорт для класса с полным именем oracle.jdbc.driver.OracleDriver и см., Что он сообщает об ошибке в вашем затмении.

1

Двойные кавычки. Вам не нужно вводить двойные кавычки в значениях свойств.

так его: DBCLASS=oracle.jdbc.driver.OracleDriver

и не DBCLASS="oracle.jdbc.driver.OracleDriver"

Смежные вопросы