Java 找不到适合的驱动程序的原因

Java 找不到适合的驱动程序的原因,java,eclipse,spring,junit,hsqldb,Java,Eclipse,Spring,Junit,Hsqldb,我正在尝试对我创建的DAO进行单元测试(JUnit)。我使用Spring作为我的框架,我的DAO(JdbcPackageDAO)扩展了SimpleJDBCDAO支持。测试类(JdbcPackageDAOTest)扩展了AbstractTransactionalDataSourceSpringContextTests。我已覆盖以下配置位置: protected String[] getConfigLocations(){ return new String[] {"classpath:co

我正在尝试对我创建的DAO进行单元测试(JUnit)。我使用Spring作为我的框架,我的DAO(JdbcPackageDAO)扩展了SimpleJDBCDAO支持。测试类(JdbcPackageDAOTest)扩展了AbstractTransactionalDataSourceSpringContextTests。我已覆盖以下配置位置:

protected String[] getConfigLocations(){
    return new String[] {"classpath:company/dc/test-context.xml"};
}
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
        http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">

    <bean id="dataPackageDao" class="company.data.dao.JdbcPackageDAO">
        <property name="dataSource" ref="dataSource" />
    </bean>

    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="org.hsqldb.jdbcDriver"/>
        <property name="url" value="jdbc:hsqldb:hsql://localhost"/>
        <property name="username" value="sa" />
        <property name="password" value="" />
    </bean>

    <bean id="propertyConfigurer" 
          class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="locations">
            <list>
                <value>company/data/dao/jdbc.properties</value>
            </list>
        </property>
    </bean>

    <bean id="transactionManager" 
          class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource" />
    </bean>
</beans>
我的test-context.xml文件定义如下:

protected String[] getConfigLocations(){
    return new String[] {"classpath:company/dc/test-context.xml"};
}
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
        http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">

    <bean id="dataPackageDao" class="company.data.dao.JdbcPackageDAO">
        <property name="dataSource" ref="dataSource" />
    </bean>

    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="org.hsqldb.jdbcDriver"/>
        <property name="url" value="jdbc:hsqldb:hsql://localhost"/>
        <property name="username" value="sa" />
        <property name="password" value="" />
    </bean>

    <bean id="propertyConfigurer" 
          class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="locations">
            <list>
                <value>company/data/dao/jdbc.properties</value>
            </list>
        </property>
    </bean>

    <bean id="transactionManager" 
          class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource" />
    </bean>
</beans>

company/data/dao/jdbc.properties
我使用HSQL作为后端,它以独立模式运行。我选择的IDE是eclipse。当我作为JUnit测试运行该类时,我的错误(如下所示)。我不知道为什么会这样。根据Eclipse,hsql.jar位于我的构建路径上

org.springframework.transaction.CannotCreateTransactionException: Could not open JDBC Connection for transaction; nested exception is java.sql.SQLException: No suitable driver found for jdbc:hsqldb:hsql://localhost at org.springframework.jdbc.datasource.DataSourceTransactionManager.doBegin(DataSourceTransactionManager.java:219) at org.springframework.transaction.support.AbstractPlatformTransactionManager.getTransaction(AbstractPlatformTransactionManager.java:377) at org.springframework.test.AbstractTransactionalSpringContextTests.startNewTransaction(AbstractTransactionalSpringContextTests.java:387) at org.springframework.test.AbstractTransactionalSpringContextTests.onSetUp(AbstractTransactionalSpringContextTests.java:217) at org.springframework.test.AbstractSingleSpringContextTests.setUp(AbstractSingleSpringContextTests.java:101) at junit.framework.TestCase.runBare(TestCase.java:128) at org.springframework.test.ConditionalTestCase.runBare(ConditionalTestCase.java:76) at junit.framework.TestResult$1.protect(TestResult.java:106) at junit.framework.TestResult.runProtected(TestResult.java:124) at junit.framework.TestResult.run(TestResult.java:109) at junit.framework.TestCase.run(TestCase.java:120) at junit.framework.TestSuite.runTest(TestSuite.java:230) at junit.framework.TestSuite.run(TestSuite.java:225) at org.eclipse.jdt.internal.junit.runner.junit3.JUnit3TestReference.run(JUnit3TestReference.java:130) at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:460) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:673) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:386) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:196) Caused by: java.sql.SQLException: No suitable driver found for jdbc:hsqldb:hsql://localhost at java.sql.DriverManager.getConnection(Unknown Source) at java.sql.DriverManager.getConnection(Unknown Source) at org.springframework.jdbc.datasource.DriverManagerDataSource.getConnectionFromDriverManager(DriverManagerDataSource.java:291) at org.springframework.jdbc.datasource.DriverManagerDataSource.getConnectionFromDriverManager(DriverManagerDataSource.java:277) at org.springframework.jdbc.datasource.DriverManagerDataSource.getConnectionFromDriverManager(DriverManagerDataSource.java:259) at org.springframework.jdbc.datasource.DriverManagerDataSource.getConnection(DriverManagerDataSource.java:241) at org.springframework.jdbc.datasource.DataSourceTransactionManager.doBegin(DataSourceTransactionManager.java:182) ... 18 more org.springframework.transaction.CannotCreateTransactionException:无法为事务打开JDBC连接;嵌套异常为java.sql.SQLException:未找到适合jdbc:hsqldb的驱动程序:hsql://localhost 位于org.springframework.jdbc.datasource.DataSourceTransactionManager.doBegin(DataSourceTransactionManager.java:219) 位于org.springframework.transaction.support.AbstractPlatformTransactionManager.getTransaction(AbstractPlatformTransactionManager.java:377) 位于org.springframework.test.AbstractTransactionalSpringContextTests.startNewTransaction(AbstractTransactionalSpringContextTests.java:387) 位于org.springframework.test.AbstractTransactionalSpringContextTests.onSetUp(AbstractTransactionalSpringContextTests.java:217) 位于org.springframework.test.AbstractSingleSpringContextTests.setUp(AbstractSingleSpringContextTests.java:101) 位于junit.framework.TestCase.runBare(TestCase.java:128) 位于org.springframework.test.ConditionalTestCase.runBare(ConditionalTestCase.java:76) 位于junit.framework.TestResult$1.protect(TestResult.java:106) 位于junit.framework.TestResult.runProtected(TestResult.java:124) 运行(TestResult.java:109) 运行(TestCase.java:120) 位于junit.framework.TestSuite.runTest(TestSuite.java:230) 运行(TestSuite.java:225) 位于org.eclipse.jdt.internal.junit.runner.junit3.JUnit3TestReference.run(JUnit3TestReference.java:130) 位于org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) 位于org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:460) 位于org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:673) 位于org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:386) 位于org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:196) 原因:java.sql.SQLException:未找到适合jdbc:hsqldb的驱动程序:hsql://localhost 位于java.sql.DriverManager.getConnection(未知源) 位于java.sql.DriverManager.getConnection(未知源) 位于org.springframework.jdbc.datasource.DriverManager数据源.getConnectionFromDriverManager(DriverManager数据源.java:291) 位于org.springframework.jdbc.datasource.DriverManager数据源.getConnectionFromDriverManager(DriverManager数据源.java:277) 位于org.springframework.jdbc.datasource.DriverManager数据源.getConnectionFromDriverManager(DriverManager数据源.java:259) 位于org.springframework.jdbc.datasource.driverManager数据源.getConnection(driverManager数据源.java:241) 位于org.springframework.jdbc.datasource.DataSourceTransactionManager.doBegin(DataSourceTransactionManager.java:182) ... 还有18个
看起来您没有指定要连接的数据库名称,应该是这样的

jdbc:hsqldb:hsql://serverName:port/DBname
jdbc:hsqldb:hsql://localhost/mydatabase 
能否将驱动程序(org.hsqldb.jdbcDriver)导入到一个源文件中?(测试类是否实际位于类路径上)

如果无法导入,则可以尝试在构建路径中包含它。

可能是这样的

hsql://localhost

无法解析为文件。请看下面的示例程序:

看看是否可以先让它工作,然后看看是否可以获取配置信息并在Springbean配置中使用它


祝你好运

我认为您的HSQL URL是错误的。它还应该包括数据库名称

大概是

jdbc:hsqldb:hsql://serverName:port/DBname
jdbc:hsqldb:hsql://localhost/mydatabase 

如果mydatabase是数据库(文件)的名称。不包括这一点(我不确定这里是否是这样)会混淆URL的解析,这可能会导致DriverManager认为您的驱动程序不合适(它被找到了,但它认为它不是一个好的驱动程序)

好的,下面是解决方案。大多数人都提出了很好的观点,但都没有解决问题(谢谢你的帮助)。这是我找到的解决办法

  • 将JAR从…/web inf/lib移动到项目根/lib
  • 在eclipse中更改构建路径以反映此更改
  • 清理并重建了我的项目
  • 运行了junit测试,它成功了
    我猜想这与Ganymede如何读取/web inf/lib文件夹中的JAR有关。但是谁知道呢。。。现在可以了

    我不确定它是否值得,但我遇到了一个类似的问题,我遇到了一个“java.sql.SQLException:找不到合适的驱动程序”错误。我在研究解决方案时发现了这条线索

    我最终解决问题的方法是放弃使用java.sql.DriverManager来获取连接,而是构建org.hsqldb.jdbc.jdbcDataSource的实例并使用它

    我的问题的根本原因(我相信)与类加载器层次结构以及JRE运行Java5这一事实有关。尽管我可以成功加载jdbcDriver类,但是java.sql.DriverManager后面的类加载器的级别更高,以至于它无法看到我需要的hsqldb.jar

    无论如何,只要把这张便条放在这里,以防其他人遇到类似的问题。

    “没有合适的司机”通常是