我不太熟悉,Java
但我尝试在R
(我的最爱)中完成这项任务!
有这个Java
库叫做 Jackcess
. 我想连接到这个库并在其中打开一个 MS Access 2003.mdb
文件。Jackcess 食谱告诉我使用这个库的第一步是:
Database db = DatabaseBuilder.open(new File("mydb.mdb"));
或者正如@Gord 建议的那样,
File file = new File("C:/Users/Public/jackcessTest.mdb");
DatabaseBuilder dbbo = new DatabaseBuilder();
dbbo.setFile(file);
Database db = dbbo.open();
但我被困在这第一步。
我已经安装了 Java 和 rJava 并设置了有关目录的所有内容。这是我的代码R
library(rJava)
.jinit()
.jaddClassPath("java/jackcess-2.1.2.jar") # there I have put the downloaded jar file of Jackcess
# .jaddClassPath("java/commons-logging-1.2.jar") # this is the commons-logging class that Jackcess depends on, commented to replicate problem 2] in my question.
file.name <- "D:/63.mdb" # some data base .mdb file (containing only tables)
file <- .jnew("java/io/File",file.name)
dbbo <- .jnew("com/healthmarketscience/jackcess/DatabaseBuilder")
[编辑:我发现我有两个问题,一个解决了,一个仍然没有。] 到目前为止一切都很好,但从现在开始我有一些问题:
1]从Jackcess正确调用方法而没有签名不匹配,这些都不起作用:
dbbo <- .jcall(dbbo,"L<DatabaseBuilder>","setFile",file)
dbbo <- .jcall(dbbo,"Lcom/healthmarketscience/jackcess/DatabaseBuilder","setFile",file)
我收到此错误:
Error in .jcall(dbbo, "Lcom/healthmarketscience/jackcess/DatabaseBuilder", :
method setFile with signature (Ljava/io/File;)Lcom/healthmarketscience/jackcess/DatabaseBuilder not found
好吧,我找到了这一步的答案,我只需要;
在类定义字符串的末尾加上一个分号 ( )。
dbbo <- .jcall(dbbo,"Lcom/healthmarketscience/jackcess/DatabaseBuilder;","setFile",file)
2]正确调用open
方法,我的第一轮尝试:
db <- .jcall(dbbo,"Lcom/healthmarketscience/jackcess/Database;","open",evalArray = FALSE,evalString = FALSE)
我得到这个错误:
Error in .jcall(dbbo, "Lcom/healthmarketscience/jackcess/Database;", "open", :
java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory
我用谷歌搜索发现 Jackcess 依赖于一些名为commons-logging 的库,因此下载并将其添加到类路径可以解决该问题
3] 正确调用open
方法,我的第二轮尝试:with commons-logging in classpath
db <- .jcall(dbbo,"Lcom/healthmarketscience/jackcess/Database;","open",evalArray = FALSE,evalString = FALSE)
这给了我这个错误:
Error in .jcall(dbbo, "Lcom/healthmarketscience/jackcess/Database;", "open", :
java.lang.NoClassDefFoundError: Could not initialize class com.healthmarketscience.jackcess.impl.DatabaseImpl
这个错误的任何想法?
[注意]:在我编辑之前建议了一些答案,所以它们现在可能看起来无关紧要,但我已经在上面解释的步骤中使用了它们。