« Opera for PDAでSSLクライアント証明書 | Main | SVNKit&JavaHL »

2007.03.24

久しぶりにJavaHL

 かなり以前にJavaHLを使ってみましたが、久しぶりに使う機会がありました。
 ちなみに、JavaHLはここからダウンロード可能で、ソース等はここで公開されており(ViewVC)チェックアウト等を行う場合はここから行うことが可能です。

 で、Eclipse3.2(Subclipseプラグイン導入済み)上で-Djava.library.pathでlibsvnjavahl-1.dllを格納しているパスを指定して、ごにょごにょと実行。例えば以下のような感じ。

// ワーキングコピーC:/svn/testrepos以下のフォルダを再帰的にupdateする
SVNClientInterface client = new SVNClient();
long revision = client.update("C:/svn/testrepos", Revision.HEAD, true);
System.out.println("svn update, revision : " + revision);
// ワーキングコピーC:/svn/testrepos以下のファイルにおいて、新規に追加されているファイルすべてをaddし、紛失したファイルをすべてremoveする
SVNClientInterface client = new SVNClient();
Status[] status = client.status("C:/svn/testrepos", true, false, false);
for (int i=0; i'lt;status.length; i++) {
 int s = status[i].getTextStatus();
 if (s == StatusKind.unversioned) {
  String path = status[i].getPath();
  System.out.println("svn add : " + path);
  client.add(path, false);
 } else if (s == StatusKind.missing) {
  String path = status[i].getPath();
  System.out.println("svn remove : " + path);
  client.remove(new String[] { path }, "", false);
 }
}

 んで、Eclipse上から実行したときは問題なく動作したのですが・・・それを別のマシンでコマンドプロンプトから実行した場合、java.lang.UnsatisfiedLinkErrorで動作せず。メッセージを見ると、svnjavahl.dllが見つからないって怒られているっぽい(no svnjavahl in java.library.path)。
 実際にDLLのロードを行っているorg.tigris.subversion.javahl.NativeResourcesのソースを見てみると、プロパティsubversion.native.libraryで指定されたDLL→svnjavahl-1.dlllibsvnjavahl-1.dllsvnjavahl.dllの順番にロードを試みている模様。
 試しに、libsvnjavahl-1.dllのファイル名をsvnjavahl.dllにリネームして実行してみると、同様にUnsatisfiedLinkErrorが発生するも、Can't find dependent librariesとメッセージが変化。

 いろいろと試行錯誤してみた結果、実行している場所から参照可能な場所にSubversion本体のDLL群(binフォルダ内に入っているlibapr.dll・libapriconv.dll・libaprutil.dll・libdb44.dll・libeay32.dll・ssleay32.dll・intl3_svn.dllの7つのDLL)が必要な模様。なお、-Djava.library.pathで指定しているフォルダ(libsvnjavahl-1.dllを格納しているフォルダ)にこれらのライブラリを格納してもNGで、例えば実行時のカレントフォルダに配置するとOKです(Javaが呼び出したDLLが依存しているDLLは、PATHが通っている場所(というかjava.exeから参照可能な場所?)に置いておく必要があるってことですね)。

 ファイル名を変えてエラーメッセージが変わったのは、

  • libsvnjavahl-1.dllを読み込んだときにCan't find dependent librariesとなっていたが、UnsatisfiedLinkErrorでキャッチされ(隠蔽され)、svnjavahl.dllを読み込もうとしたが、svnjavahl.dllは存在しないので、今度は「読み込もうとしたライブラリが存在しない」UnsatisfiedLinkError。
  • svnjavahl.dllにリネームした場合、そのロード処理が最後なので、Can't find dependent librariesのままErrorのログが出力された。

    ってことなんでしょう。

     普段からDLL等を多用するWindowsNativeアプリを開発していればすぐに気付いたのかもしれませんが、これで2時間ほど悩んでしまいました(苦笑)。

  • |

    « Opera for PDAでSSLクライアント証明書 | Main | SVNKit&JavaHL »

    Java」カテゴリの記事

    Subversion・Trac・etc.」カテゴリの記事

    Comments

    Post a comment



    (Not displayed with comment.)


    Comments are moderated, and will not appear on this weblog until the author has approved them.



    TrackBack


    Listed below are links to weblogs that reference 久しぶりにJavaHL:

    » ソースの比較を考える [凪瀬 Blog]
    ソースの比較を考える [Read More]

    Tracked on 2007.10.18 14:27

    « Opera for PDAでSSLクライアント証明書 | Main | SVNKit&JavaHL »