« 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

    TrackBack URL for this entry:
    http://app.cocolog-nifty.com/t/trackback/3959/14368474

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

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

    Tracked on 2007.10.18 at 14:27

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