Postgresql OSGI&;Apache Commons DBCP类加载问题

Postgresql OSGI&;Apache Commons DBCP类加载问题,postgresql,jdbc,osgi,apache-commons-dbcp,Postgresql,Jdbc,Osgi,Apache Commons Dbcp,我继承了一些在OSGi包中使用Apache commons dbcp连接池的代码。此代码适用于Eclipse/Equinox OSGi版本3.4.3(R34x_v20081215)、commons dbcp 1.2.2和springsource.org上的postgres jdbc3 8.3.603捆绑包 我想现代化,也许这是我的第一个错误 当我将新版本的Felix或Equinox OSGI内核与新的postgresql JDBC3或JDBC4捆绑包以及最新版本的commons dbcp(1.4

我继承了一些在OSGi包中使用Apache commons dbcp连接池的代码。此代码适用于Eclipse/Equinox OSGi版本3.4.3(R34x_v20081215)、commons dbcp 1.2.2和springsource.org上的postgres jdbc3 8.3.603捆绑包

我想现代化,也许这是我的第一个错误

当我将新版本的Felix或Equinox OSGI内核与新的postgresql JDBC3或JDBC4捆绑包以及最新版本的commons dbcp(1.4.1)一起使用时,我遇到了类加载问题。我做了很多搜索,发现commons dbcp代码应该有一个修复程序,但它似乎仍然失败

我曾尝试将org.postgresql放在commons dbcp MANIFEST.MF导入包行中,但也没有成功

我在activator中编写了一个简单的测试,它首先执行一个基本类.forName()和DriverManager.getConnection(),这很好,但是当我添加BasicDataSource()并使用BasicDataSource.getConnection()设置连接时,我得到了ClassNotFoundException。请参见下面的代码示例

提前感谢您的帮助、建议


这是因为commons dbcp包无法查看实际的驱动程序类,因为osgi类装入器。解决方案是使用Dynamic Import*将一个片段附加到commons dbcp类。清单中需要的实际标题如下所示:

片段宿主:org.apache.commons.dbcp DynamicImport包:*

在这之后,您提到的代码起作用了。希望这不会来得太晚

// This one fails with an exception
public void dsTest() {
    BasicDataSource bds = new BasicDataSource();
    ClassLoader cl;

    try {
        logger.debug("ContextClassLoader: {}", 
        Thread.currentThread().getContextClassLoader().toString());
        cl = this.getClass().getClassLoader();
        logger.debug("ClassLoader: {}", cl); 

        if (bds.getDriverClassLoader() != null) {
            logger.debug(bds.getDriverClassLoader().toString());
        }
        // The failure is the same with and with the setDriverClassLoader() line
        bds.setDriverClassLoader(cl);
        bds.setDriverClassName("org.postgresql.Driver");
        bds.setUrl("jdbc:postgresql://127.0.0.1/dbname");
        bds.setUsername("user");
        bds.setPassword("pword");
        Class.forName("org.postgresql.Driver").newInstance();
        conn = bds.getConnection();
        Statement st = conn.createStatement();
        ResultSet rs = st.executeQuery("SELECT COUNT(*) FROM table");
        conn.close();
        logger.debug("Closed DataSource Test");
    } catch (Exception ex) {
        ex.printStackTrace();
        logger.debug("Exception: {} ", ex.getMessage());
    }
}

// This one works
public void managerTest() {
    ClassLoader cl;
    try {
        cl = this.getClass().getClassLoader();
        logger.debug("ClassLoader: {}", cl);
        Class.forName("org.postgresql.Driver").newInstance();
        String url = "jdbc:postgresql://127.0.0.1/dbname";
        conn = DriverManager.getConnection(url, "user", "pword");

        Statement st = conn.createStatement();
        ResultSet rs = st.executeQuery("SELECT COUNT(*) FROM table");
        conn.close();
        logger.debug("Closed Manger Test");
    } catch (Exception ex) {
        ex.printStackTrace();
        logger.debug("Exception: {} ", ex.getMessage());
    }
}