База данных H2 org.h2.Driver ClassNotFoundException - PullRequest
1 голос
/ 16 февраля 2012

Я пытаюсь запустить тест JUNIT с помощью eclipse и ANT, они оба жалуются на то, что класс org.h2.Driver не найден.

У меня есть h2-1.3.164.jar в моем пути к классам и для доказательства того, чтоэто здесь classpath из системного свойства java.class.path

c:\trasferer\build; C:\Program Files (x86)\IBM\IMShared\plugins\org.junit4_4.3.1\junit.jar; c:\trasferer\lib\ojdbc6.jar; c:\trasferer\lib\sqljdbc4.jar; c:\trasferer\lib-test\h2-1.3.164.jar; c:\trasferer\lib-test\junit-4.8.2.jar; c:\trasferer\lib-test\log4j-1.2.14.jar; c:\trasferer\lib-test\TestUtils.jar; c:\trasferer\lib-test\dbunit-2.4.8.jar; c:\trasferer\lib-test\slf4j-api-1.5.5.jar; c:\trasferer\lib-test\slf4j-log4j12-1.5.5.jar;

, и я могу найти класс org.h2.Driver из h2-1.3.164.jar, когда я открываю его сзатмение.Задача Ant для запуска теста и задачи ANT для "build" classpath

<path id="lib.classpath">
    <fileset dir="./lib" includes="*.jar" />
</path>

<path id="test.classpath">
    <fileset dir="lib" includes="*.jar" />
    <fileset dir="lib-test" includes="*.jar" />
    <pathelement location="${dest}" />
    <pathelement location="${test-dest}" />
</path>

<target name="run-test" depends="init-test,compile,compile-test">
    <property name="classPathToUse" refid="test.classpath" />
    <echo>Using classpath: "${classPathToUse}"</echo>
    <junit failureProperty="test.failure" fork="on" forkmode="once" outputtoformatters="true" printsummary="on" showoutput="true">
        <jvmarg value="-Xmx512m" />
        <jvmarg value="-XX:MaxPermSize=128m" />
        <jvmarg value="-Duser.timezone=GMT" />
        <jvmarg value="-Dexternal-properties=${test.properties}" />
        <classpath refid="test.classpath" />
        <formatter type="brief" usefile="false" />
        <formatter type="xml" />
        <batchtest todir="test-results">
            <fileset dir="${test-dest}" includes="**/*Test.class" />
        </batchtest>
    </junit>
    <fail message="test failed" if="test.failure" />
</target>

, а вот вот stacktrace


    [junit] ------------- Standard Error -----------------
    [junit] log4j:ERROR Could not find value for key log4j.appender.CONSOLE
    [junit] log4j:ERROR Could not instantiate appender named "CONSOLE".
    [junit] log4j:WARN No appenders could be found for logger (org.dbunit.DatabaseTestCase).
    [junit] log4j:WARN Please initialize the log4j system properly.
    [junit] ------------- ---------------- ---------------
    [junit] Testcase: testBuildLiityntapisteSQL(org.xyz.rigistry.manager.XXServiceImplTest):     Caused an ERROR
    [junit] org.h2.Driver
    [junit] java.lang.ClassNotFoundException: org.h2.Driver
    [junit]     at java.lang.Class.forName(Class.java:136)
    [junit]     at org.dbunit.JdbcDatabaseTester.(JdbcDatabaseTester.java:104)
    [junit]     at org.dbunit.PropertiesBasedJdbcDatabaseTester.(PropertiesBasedJdbcDatabaseTester.java:68)
    [junit]     at org.dbunit.DBTestCase.newDatabaseTester(DBTestCase.java:70)
    [junit]     at org.dbunit.DatabaseTestCase.getDatabaseTester(DatabaseTestCase.java:109)
    [junit]     at org.dbunit.DatabaseTestCase.setUp(DatabaseTestCase.java:151)
    [junit]     at fi.transferer.junit.AbstractDatabaseTestCase.setUp(Unknown Source)
    [junit]     at fi.transferer.junit.BasicDatabaseTestCase.setUp(Unknown Source)

Так может кто-нибудь сказать мне, что происходит, пожалуйста?

Ответы [ 2 ]

3 голосов
/ 16 февраля 2012

Я думаю, вы должны просто добавить эти jar-файлы в путь сборки проекта в Eclipse.

2 голосов
/ 17 февраля 2012

Не могли бы вы опубликовать раздел файла сборки ANT, который запускает junit?Существуют опции, которые отключают использование переменной среды CLASSPATH ....


Использование переменных среды делает вашу сборку менее переносимой, и, по моему опыту, это очень негибкий способ управления зависимостями Java.Я заметил, что вы уже столкнулись с проблемой нескольких версий одной и той же библиотеки (две копии junit и log4j).

Я бы предложил изменить вашу сборку так, чтобы она объявляла classpath вверху сборки .Файл .xml выглядит следующим образом:

<path id="compile.path">
    <fileset dir="c:\trasferer\lib" includes="*.jar"/>
</path>

<path id="test.path">
    <path refid="compile.path"/>
    <fileset dir="c:\trasferer\lib-test" includes="*.jar"/>
</path>

Затем эти пути к классам можно использовать в различных задачах ant, используя атрибут classpathref :

<javac srcdir="${src}"
         destdir="${build}"
         classpathref="compile.path"
         debug="on"
         source="1.4"
  />

И у junit есть возможность вложенного classpath (полезно для добавления каталога скомпилированных классов):

<junit printsummary="yes" haltonfailure="yes">
  <classpath>
    <pathelement location="${build.tests}"/>
    <path refid="test.path"/>
  </classpath>

  <formatter type="plain"/>

  <test name="my.test.TestCase" haltonfailure="no" outfile="result">
    <formatter type="xml"/>
  </test>

  <batchtest fork="yes" todir="${reports.tests}">
    <fileset dir="${src.tests}">
      <include name="**/*Test*.java"/>
      <exclude name="**/AllTests.java"/>
    </fileset>
  </batchtest>
</junit>
...