У меня есть простой 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 сконфигурирован в пути сборки проекта. Есть ли способ достичь результата?
ли 'ojdbc.jar'available на' CLASSPATH' тоже? –
Что делает класс свойств? Вставьте это также – djames
Класс @djames Properties - стандартный java.util.Properties. – narduz