Java Class.forName()不起作用,从属性文件加载类字符串
我在Eclipse中有一个简单的Java项目,它可以连接到多个数据库,并试图修改它以允许从属性文件配置连接参数。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文件在项目的构建路径中配置。有没有办法来完成结果?
的问题显示在厚望消息:
异常在线程 “主” 抛出java.lang.ClassNotFoundException:“oracle.jdbc.driver.OracleDriver”
如果我写
Class.forName("HelloWorld");
我得到以下异常消息:
线程“主”java.lang中的异常。ClassNotFoundException的:的HelloWorld
不知您的属性文件包含不是类名,但用引号括起来的类名。
这些引号和你的代码的地带将工作。
明显的事情是最糟糕的!非常感谢,我疯了:) – narduz
查看ojdbc.jar
中是否有oracle.jdbc.driver.OracleDriver
类。
以简单的方式,它是具有完全限定名oracle.jdbc.driver.OracleDriver
的类的导入,看它是否在您的eclipse中报告错误。
双引号。 您不必在属性值中加双引号。
所以它的: DBCLASS=oracle.jdbc.driver.OracleDriver
,而不是 DBCLASS="oracle.jdbc.driver.OracleDriver"
是'ojdbc.jar'available的'CLASSPATH'吗? –
什么是Properties类在做什么?请粘贴,以及 – djames
@djames属性类是标准的java.util.Properties。 – narduz