Java 从OSGI包调用JDBC和UCP连接

Java 从OSGI包调用JDBC和UCP连接,java,osgi,apache-felix,osgi-bundle,Java,Osgi,Apache Felix,Osgi Bundle,关于将初始化JDBC和UCP连接调用到byndle activator中,我有一个特定的问题。我创建了这个激活器: public class Activator implements BundleActivator { @Override public void start(BundleContext bc) throws Exception { testOracleUCP(); System.out.println("Started

关于将初始化JDBC和UCP连接调用到byndle activator中,我有一个特定的问题。我创建了这个激活器:

public class Activator implements BundleActivator
{

    @Override
    public void start(BundleContext bc) throws Exception
    {

        testOracleUCP();
        System.out.println("Started module");
    }

    @Override
    public void stop(BundleContext bc) throws Exception
    {

    }

    public void testOracleUCP() throws Exception
    {
        System.out.println("Test Oracle UCP");
        Connection conn = null;
        try
        {
            conn = OracleDS_UCP.getConnection();
            OracleDS_UCP.getPoolDataSourceStatus();
        }
        catch (SQLException e)
        {
            throw e;
        }
        finally
        {
            if (conn != null)
                conn.close();
        }

    }
}
我使用这个Java类调用初始化连接:

public class OracleDS_UCP
{
    protected static final PoolDataSource pds;

    static
    {
        pds = initPoolDataSource();
    }

    public static Connection getConnection() throws SQLException
    {
        if (pds == null)
            return null;
        Connection conn = pds.getConnection();
        conn.setAutoCommit(false);
        return conn;
    }

    private static PoolDataSource initPoolDataSource()
    {
        try
        {
            System.out.println("\nStarting Oracle UCP Connection");
            PoolDataSource pool = PoolDataSourceFactory.getPoolDataSource();
            pool.setConnectionFactoryClassName("oracle.jdbc.pool.OracleDataSource");

            pool.setURL("jdbc:oracle:thin:@146.185.142.243:1521:XE");
            pool.setUser("SYSTEM");
            pool.setPassword("4r3e2w1q");

            //Setting pool properties (can be retrieved from config file)
            pool.setMaxStatements(10); // the maximum number of statements that may be pooled or cached on a connection.
            pool.setInitialPoolSize(2);
            pool.setMinPoolSize(1);
            pool.setMaxPoolSize(50);
            pool.setLoginTimeout(60); // one minute
            pool.setConnectionWaitTimeout(60); // one minute
            pool.setAbandonedConnectionTimeout(30 * 60); // thirty minutes
            pool.setMaxIdleTime(60 * 60); // one hour and kill inactive or idle connections
            pool.setInactiveConnectionTimeout(60 * 60); // one hour and kill inactive or idle connections
            pool.setConnectionWaitTimeout(0); // do not wait for a used connection to be released by a client.
            pool.setConnectionHarvestTriggerCount(40);
            pool.setConnectionHarvestMaxCount(10);

            return pool;
        }
        catch (SQLException ex)
        {
            Logger.getLogger(OracleDS_UCP.class.getName()).log(Level.SEVERE, null, ex);
        }

        return null;
    }
}
我将JDBC驱动程序和ucp驱动程序嵌入到包中:

<Embed-Dependency>ucp,ojdbc6;scope=compile|runtime</Embed-Dependency> 
Manifest-Version: 1.0
Bnd-LastModified: 1387484566727
Build-Jdk: 1.8.0-ea
Built-By: developer
Bundle-Activator: org.project.osgi.SQLEngine.activator.Activator
Bundle-ClassPath: .,junit-4.11.jar,org.osgi.core-1.4.0.jar,org.osgi.comp
 endium-5.0.0.jar,ojdbc6-11.2.0.3.jar,ucp-11.2.0.3.jar,SQL_Exchanges-1.0
 .jar,Agents_Manager_api-2.0.jar
Bundle-ManifestVersion: 2
Bundle-Name: SQL_Engine
Bundle-SymbolicName: SQL_Engine
Bundle-Vendor: Corporation Name
Bundle-Version: 1.0.0
Created-By: Apache Maven Bundle Plugin
Embed-Dependency: *;scope=compile|runtime
Embedded-Artifacts: junit-4.11.jar;g="junit";a="junit";v="4.11",org.osgi
 .core-1.4.0.jar;g="org.apache.felix";a="org.osgi.core";v="1.4.0",org.os
 gi.compendium-5.0.0.jar;g="org.osgi";a="org.osgi.compendium";v="5.0.0",
 ojdbc6-11.2.0.3.jar;g="com.oracle";a="ojdbc6";v="11.2.0.3",ucp-11.2.0.3
 .jar;g="com.oracle";a="ucp";v="11.2.0.3",SQL_Exchanges-1.0.jar;g="SQL_E
 xchanges";a="SQL_Exchanges";v="1.0",Agents_Manager_api-2.0.jar;g="DX-57
 -Kernel";a="Agents_Manager_api";v="2.0"
Export-Package: org.project.osgi.SQLEngine.api;version="1.0.0"
Import-Package: org.osgi.framework;version="[1.5,2)",javax.sql.DataSourc
 e
Tool: Bnd-2.1.0.20130426-122213
我得到了这个错误:

Caused by: java.lang.ClassNotFoundException: javax.sql.DataSource not found by S
QL_Engine [1147]

你知道如何解决这个问题吗?

问题是在
导入包中:
header
javax.sql.DataSource
,但这实际上是一个类,而不是一个包。应该是
javax.sql
。这不是由maven插件完成的,对吗?

导入包
指定捆绑包使用的Java包,以便OSGi框架知道如何在运行时连接捆绑包。因此,应该在此处提及捆绑包使用但未提供的所有包(java.*除外)。通常,maven bnd插件会自动生成这些导入,因为您的清单表明它是由bnd/maven生成的,所以我觉得您使用了maven。但我绝对不相信插件添加了javax.sql.DataSource(当然,除非您有一个具有该名称的包,但这不太可能)。