UCanAccess 初始化程序错误(compile/run 没有 IDE)
UCanAccess Initializer Error (compile/run without IDE)
我一直在尝试创建一个新项目来使用 UCanAccess 读取 MS Access 文件。我一直在关注来自@Gord Thompson 的信息和 UCanAccess github 中的示例文件。排除我使用不同名称的事实,一切都是一样的。我不使用任何 GUI IDE。我只是从命令行编译,基本上,我写了一个 Java 程序来进行命令行编译。
参考文献:
Manipulating an Access database from Java without ODBC
https://github.com/andrew-nguyen/ucanaccess/blob/master/example/net/ucanaccess/example/Example.java
我的代码示例如下:
String path = new java.io.File(PATH).getAbsolutePath();
db = "jdbc:ucanaccess://" + path;
Class.forName("net.ucanaccess.jdbc.UcanaccessDriver");
Connection conn = DriverManager.getConnection( db );
Statement s = conn.createStatement();
我的错误信息是:
Exception in thread "main" java.lang.ExceptionInInitializerError
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:264)
at GreatBeyond.<init>(GreatBeyond.java:36)
at GreatBeyond.main(GreatBeyond.java:66)
Caused by: java.lang.RuntimeException: org.hsqldb.jdbc.JDBCDriver
at net.ucanaccess.jdbc.UcanaccessDriver.<clinit>(UcanaccessDriver.java:54)
... 4 more
第 36 行是 "Class.forName",我已经尝试 运行 没有它的程序但它失败了。我已经下载了 UCanAccess 的 zip 文件并将其解压缩到 com 目录,Jackcess 被解压缩到 net 目录。谁能指出哪里出了问题?
如果您没有使用 IDE,那么您需要为 UCanAccess 及其所有依赖项(HSQLDB、Jackcess 等)的 JAR 文件指定 CLASSPATH 条目。一种方法是在 运行 您的代码时使用 java
命令的 -cp
选项。
比如我在"UcaNoIde.java"中编译下面的代码后...
import java.sql.*;
public class UcaNoIde {
public static void main(String[] args) {
String dbFileSpec = "C:/Users/Public/UCanAccessTest.accdb";
String connStr = "jdbc:ucanaccess://" + dbFileSpec;
try (Connection conn = DriverManager.getConnection(connStr)) {
System.out.println("Connection established.");
} catch (Exception e) {
e.printStackTrace(System.err);
}
}
}
... 到 "UcaNoIde.class" 文件中 我可以 运行 它在我的 Windows 命令提示符下使用以下命令:
java -cp .;C:/Users/Public/Downloads/UCanAccess/ucanaccess-3.0.3.jar;C:/Users/Public/Downloads/UCanAccess/lib/commons-lang-2.6.jar;C:/Users/Public/Downloads/UCanAccess/lib/commons-logging-1.1.1.jar;C:/Users/Public/Downloads/UCanAccess/lib/hsqldb.jar;C:/Users/Public/Downloads/UCanAccess/lib/jackcess-2.1.3.jar UcaNoIde
(对于 Linux、 等 ,-cp
条目将用冒号 (:
) 而不是分号 ( ;
) 并且文件路径会有些不同。)
另一种可能性是定义一个 CLASSPATH 环境变量,其中的条目与上面 -cp
选项中的条目相同,这样您就不必每次都使用 -cp
。
我一直在尝试创建一个新项目来使用 UCanAccess 读取 MS Access 文件。我一直在关注来自@Gord Thompson 的信息和 UCanAccess github 中的示例文件。排除我使用不同名称的事实,一切都是一样的。我不使用任何 GUI IDE。我只是从命令行编译,基本上,我写了一个 Java 程序来进行命令行编译。
参考文献:
Manipulating an Access database from Java without ODBC
https://github.com/andrew-nguyen/ucanaccess/blob/master/example/net/ucanaccess/example/Example.java
我的代码示例如下:
String path = new java.io.File(PATH).getAbsolutePath();
db = "jdbc:ucanaccess://" + path;
Class.forName("net.ucanaccess.jdbc.UcanaccessDriver");
Connection conn = DriverManager.getConnection( db );
Statement s = conn.createStatement();
我的错误信息是:
Exception in thread "main" java.lang.ExceptionInInitializerError
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:264)
at GreatBeyond.<init>(GreatBeyond.java:36)
at GreatBeyond.main(GreatBeyond.java:66)
Caused by: java.lang.RuntimeException: org.hsqldb.jdbc.JDBCDriver
at net.ucanaccess.jdbc.UcanaccessDriver.<clinit>(UcanaccessDriver.java:54)
... 4 more
第 36 行是 "Class.forName",我已经尝试 运行 没有它的程序但它失败了。我已经下载了 UCanAccess 的 zip 文件并将其解压缩到 com 目录,Jackcess 被解压缩到 net 目录。谁能指出哪里出了问题?
如果您没有使用 IDE,那么您需要为 UCanAccess 及其所有依赖项(HSQLDB、Jackcess 等)的 JAR 文件指定 CLASSPATH 条目。一种方法是在 运行 您的代码时使用 java
命令的 -cp
选项。
比如我在"UcaNoIde.java"中编译下面的代码后...
import java.sql.*;
public class UcaNoIde {
public static void main(String[] args) {
String dbFileSpec = "C:/Users/Public/UCanAccessTest.accdb";
String connStr = "jdbc:ucanaccess://" + dbFileSpec;
try (Connection conn = DriverManager.getConnection(connStr)) {
System.out.println("Connection established.");
} catch (Exception e) {
e.printStackTrace(System.err);
}
}
}
... 到 "UcaNoIde.class" 文件中 我可以 运行 它在我的 Windows 命令提示符下使用以下命令:
java -cp .;C:/Users/Public/Downloads/UCanAccess/ucanaccess-3.0.3.jar;C:/Users/Public/Downloads/UCanAccess/lib/commons-lang-2.6.jar;C:/Users/Public/Downloads/UCanAccess/lib/commons-logging-1.1.1.jar;C:/Users/Public/Downloads/UCanAccess/lib/hsqldb.jar;C:/Users/Public/Downloads/UCanAccess/lib/jackcess-2.1.3.jar UcaNoIde
(对于 Linux、 等 ,-cp
条目将用冒号 (:
) 而不是分号 ( ;
) 并且文件路径会有些不同。)
另一种可能性是定义一个 CLASSPATH 环境变量,其中的条目与上面 -cp
选项中的条目相同,这样您就不必每次都使用 -cp
。