java - 使用 rJava 从 R 中使用 Jackcess

标签 java r rjava jackcess

我不太熟悉Java,但我尝试在R(我最喜欢的)中完成这项任务!

有一个名为 JackcessJava 库。 。我想连接到该库并打开其中的 MS Access 2003 .mdb 文件。 Jackcess cookbook告诉我使用这个库的第一步是这样的:

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 方法,我的第二轮尝试:在类路径中使用 commons-logging

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

对这个错误有什么想法吗?

[注意]:在我编辑之前就建议了一些答案,因此它们现在看起来可能无关紧要,但我已在上面解释的步骤中使用了它们。

最佳答案

以下代码显示了 Java 中使用“真实”DatabaseBuilder 对象的 .setFile.open 方法的替代方法:

File file = new File("C:/Users/Public/jackcessTest.mdb");
DatabaseBuilder dbbo = new DatabaseBuilder();
dbbo.setFile(file);
Database db = dbbo.open();

在 rJava 中尝试类似的操作,看看它是否适合您。

编辑回复:更新的问题

您提到您添加了 Apache commons-logging到您的 CLASSPATH,但 Jackcess 还依赖于 Apache commons-lang v2.x(不是 v3.x),因此请尝试下载它并将其也包含在您的 CLASSPATH 中。

关于java - 使用 rJava 从 R 中使用 Jackcess,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32053273/

相关文章:

java - 在 Java 中使用 Jericho HTML 解析器检索格式良好的 HTML

r - 在 Shiny 的 R 中对齐 fluidPage 上的控件小部件

r - 设置 .libPaths() 以使用 Rscript.exe 从命令行运行 R 脚本

rjava - rJava对JDK的依赖

java - 让 R 从 Java 将数据加载到变量中,而无需 R 将信息发送回 Java

java - 如何在我的通知上获取手势

java - 我正在尝试编写一个快速排序方法作为作业的一部分,但我不断收到 Java 中的 StackOverflow 错误

r stat_contour 多边形填充不正确

r - 在 MAC OS Sierra 中使用 R

java - RESTEasy 返回的集合中的根元素名称