1

私はあまり慣れていませんが、 (私のお気に入り)Javaでこのタスクを達成しようとしています!R

Javaというライブラリ がありJackcessます。.mdbこのライブラリに接続して、その中の MS Access 2003ファイルを開きたいです。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")

[編集: 2 つの問題があり、1 つは解決済みで、もう 1 つはまだ解決していないことがわかりました。] この部分まではすべて問題ありませんが、これからいくつかの問題が発生します。

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、私の2回目の試行:クラスパスに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

このエラーのアイデアはありますか?

[注]: 編集前にいくつかの回答が提案されたため、現在は無関係に見えるかもしれませんが、上記で説明した手順でそれらを使用しました。

4

2 に答える 2

0

次のコードは、「実際の」オブジェクトの メソッド.setFileとメソッドを使用した Java の代替アプローチを示しています。.openDatabaseBuilder

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 にも含めてみてください。

于 2015-08-18T16:35:19.417 に答える