【问题标题】:Error using DBunit to export a DB "java.lang.NoClassDefFoundError: org/dbunit/database/IDatabaseConnection"使用 DBunit 导出数据库时出错“java.lang.NoClassDefFoundError: org/dbunit/database/IDatabaseConnection”
【发布时间】:2010-12-06 21:24:17
【问题描述】:

我有以下 java 代码,它给出了以下错误:

import java.io.File;
import java.io.FileOutputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

import org.dbunit.database.DatabaseConnection;
import org.dbunit.database.IDatabaseConnection;
import org.dbunit.dataset.IDataSet;
import org.dbunit.dataset.xml.FlatXmlDataSet;

public class export {
    public static void main(String[] args) throws Exception {
        // database connection
        Class.forName("net.sourceforge.jtds.jdbc.Driver");
        Connection jdbcConnection = DriverManager.getConnection(
            "jdbc:jtds:sqlserver://localhost:1433/exampleDB", "sa", "vista1");
        IDatabaseConnection connection = new DatabaseConnection(jdbcConnection);

        // full database export
        IDataSet fullDataSet = connection.createDataSet();
        FlatXmlDataSet.write(fullDataSet, new FileOutputStream("full.xml"));
    }
}

错误:

$java 导出

Exception in thread "main" java.lang.NoClassDefFoundError: org/dbunit/database/IDatabaseConnection
Caused by: java.lang.ClassNotFoundException: org.dbunit.database.IDatabaseConnection
        at java.net.URLClassLoader$1.run(Unknown Source)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
Could not find the main class: export.  Program will exit.

正在编译的java文件名是export.java,编译后的文件名是export.class,我把dbunit-2.4.8.jarjtds-1.2.5.jar文件放到了export.java同一个文件夹下和export.class;我正在使用以下 cmd 编译 export.java:

$ javac -cp "dbunit-2.4.8.jar;jtds-1.2.5.jar" export.java

知道我做错了什么吗?

【问题讨论】:

  • 目标是使用 dbunit 将简单的 mssql DB 导出为平面 xml 文件。
  • 还尝试了DriverManager.registerDriver(new net.sourceforge.jtds.jdbc.Driver());,而不是我在其他示例中看到的Class.forName("net.sourceforge.jtds.jdbc.Driver");,但这不会改变产生的错误。

标签: java jdbc export dbunit jtds


【解决方案1】:

我遇到了这个问题,但是使用 maven (m2eclipse) 并从 Eclipse 内部运行它。当我从 dbunit 依赖项中删除 scope=test 时,我的问题得到了解决。

我也尝试从控制台运行,使用 javac 和 java,就像你一样,但得到了同样的错误。一定是因为我们忘记在类路径中包含一些依赖项。我们只需要dbunit.jar来编译,但是dbunit类需要依赖其他东西才能真正运行,所以我们需要在运行的时候把其他jar放到classpath下(比如slf4j)。

从 Eclispe 内部成功运行时,以下是我的依赖项: slf4j-api-1.6.1.jar slf4j-log4j12-1.6.1.jar log4j-1.2.16.jar ojdbc6-11.1.0.6.0.jar(使用oracle) dbunit-2.4.8.jar junit-3.8.2.jar commons-collections-3.2.1.jar

尝试将它们全部放在类路径中,看看是否有效。

关于错误消息.. 尽管它说'找不到主类:导出。程序将退出。',这不是真的。它确实找到了主类,我可以在第二个之后注释掉所有行后调试执行。仅当我导入 org.dbunit.database.DatabaseConnection 时才会出现问题。我相信,当导入此类时,主类会尝试加载 DatabaseConnection,它会尝试加载不在类路径中的内容。所以java给出了一个误导性的错误信息。

【讨论】:

    【解决方案2】:

    我在 oracle 数据库上使用它,它工作正常^^

    IDatabaseConnection connection = new DatabaseConnection(jdbcConnection, "SCHEMA_OF_YOUR_DB");
    

    【讨论】:

      【解决方案3】:

      运行java 命令行时需要包含-cp 参数。像这样:

      java -cp "dbunit-2.4.8.jar;jtds-1.2.5.jar" export

      【讨论】:

      • 刚试过javac -cp "dbunit-2.4.8.jar;jtds-1.2.5.jar;export.class" export.java 然后java -cp "dbunit-2.4.8.jar;jtds-1.2.5.jar;export.class" export 并没有什么不同。
      【解决方案4】:

      您的堆栈跟踪以

      结尾

      “找不到主类:导出。程序将退出。”

      这告诉我“导出”在执行时不在您的类路径中。您的类路径必须包含“export.class”。仅仅因为它与 JAR 位于同一文件夹中并不意味着它会自动位于类路径中。

      【讨论】:

      • 刚试过javac -cp "dbunit-2.4.8.jar;jtds-1.2.5.jar;export.class" export.java 然后java -cp "dbunit-2.4.8.jar;jtds-1.2.5.jar;export.class" export 并没有什么不同。
      猜你喜欢
      • 1970-01-01
      • 2013-06-10
      • 1970-01-01
      • 1970-01-01
      • 2012-12-30
      • 1970-01-01
      • 2015-09-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多