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文件在项目的构建路径中配置。有没有办法来完成结果?

+0

是'ojdbc.jar'available的'CLASSPATH'吗? –

+0

什么是Properties类在做什么?请粘贴,以及 – djames

+0

@djames属性类是标准的java.util.Properties。 – narduz

的问题显示在厚望消息:

异常在线程 “主” 抛出java.lang.ClassNotFoundException:“oracle.jdbc.driver.OracleDriver”

如果我写

Class.forName("HelloWorld"); 

我得到以下异常消息:

线程“主”java.lang中的异常。ClassNotFoundException的:的HelloWorld

不知您的属性文件包含不是类名,但用引号括起来的类名。

这些引号和你的代码的地带将工作。

+0

明显的事情是最糟糕的!非常感谢,我疯了:) – narduz

查看ojdbc.jar中是否有oracle.jdbc.driver.OracleDriver类。

以简单的方式,它是具有完全限定名oracle.jdbc.driver.OracleDriver的类的导入,看它是否在您的eclipse中报告错误。

双引号。 您不必在属性值中加双引号。

所以它的: DBCLASS=oracle.jdbc.driver.OracleDriver

,而不是 DBCLASS="oracle.jdbc.driver.OracleDriver"