Java Class.forName()不起作用,从属性文件加载类字符串

时间:2017-02-21 11:02:26

标签: java eclipse exception jdbc

我在Eclipse中有一个简单的Java项目,它可以连接到多个数据库,并且我试图修改它以允许从属性文件配置连接参数。

在目前阶段,我有一个工作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文件在项目的构建路径中配置。有没有办法完成结果?

3 个答案:

答案 0 :(得分:1)

问题显示在预期信息中:

  

线程“main”中的异常java.lang.ClassNotFoundException:“oracle.jdbc.driver.OracleDriver”

如果我写

    Class.forName("HelloWorld");

我收到以下异常消息:

  

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

不知何故,您的属性文件不包含类名,而是包含在引号中的类名。

删除这些引号并使用您的代码。

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:0)

查看oracle.jdbc.driver.OracleDriver中是否有ojdbc.jar个课程。

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