SubversionをJavaから扱う方法のメモ
SubversionをJavaから扱うには以下の3つがあります。
- SVNKit(Pure JavaなSubversion実装)
- JavaHL(JNIベースなSubversionライブラリ)
- コマンドラインのsvn.exeを外部プロセスとして使う
しかしSvnClientAdapterを使えば、これらの違いをあまり意識することなく高レベルなAPIを使うことができます。
SvnClientAdapterのソースは下記にあります。ユーザ名:guest パスワードは空でアクセスできます。
http://subclipse.tigris.org/svn/subclipse/trunk/svnClientAdapter/
ポイントになるのは抽象ファクトリークラスであるSVNClientAdapterFactoryとSVNクライアントを表現するISVNClientAdapterインターフェースです。
Abstract Factoryパターンですね。
上記3つを表現する具象ファクトリークラスとして以下の3つがあります。
- SvnKitClientAdapterFactory
- JhlClientAdapterFactory
- CmdLineClientAdapterFactory
使い方は
http://subclipse.tigris.org/svn/subclipse/trunk/svnClientAdapter/src/samples/org/tigris/subversion/svnclientadapter/samples/Sample.java
を実行したり眺めてみればイメージはつかめると思いますが、ポイントは以下のところですね。ファクトリークラスのsetupメソッドを呼んで準備してからISVNClientAdapterを作っています。
public void setup() { try { JhlClientAdapterFactory.setup(); } catch (SVNClientException e) { // can't register this factory } try { CmdLineClientAdapterFactory.setup(); } catch (SVNClientException e1) { // can't register this factory } } public void run() { // register the factories setup(); // first create the SVNClient from factory // SVNClientAdapterFactory.JAVAHL_CLIENT to use JNI client (recommanded) // SVNClientAdapterFactory.COMMANDLINE_CLIENT to use command line client // You can also get the best client type interface using getBestSVNClientType ISVNClientAdapter svnClient; try { String bestClientType = SVNClientAdapterFactory.getPreferredSVNClientType(); System.out.println("Using "+bestClientType+" factory"); svnClient = SVNClientAdapterFactory.createSVNClient(bestClientType); } catch (SVNClientException e) { System.out.println(e.getMessage()); return; }
SvnClientAdapterを使う際にコンパイルに必要なjarはsvnClientAdapter.jarとsvnjavahl.jarです。
svnkit.jarをクラスパスに通してSvnKitClientAdapterFactory.setup()を呼び出せばSVNKitも利用できます。
Subversion本体をインストールしてsvn.exeをPATHに通してCmdLineClientAdapterFactory.setup()を呼び出せばコマンドラインのsvn.exeを外部プロセスとして使うことになります。
今はVer1.6.6が最新ですね。
http://subversion.tigris.org/files/documents/15/46880/svn-win32-1.6.6.zip
JavaHLを使う場合は以下をダウンロードしてlibsvnjavahl-1.dllをjava.library.pathに追加してからJhlClientAdapterFactory.setup()を呼び出します。注意点としてはSubversion本体のbinディレクトリもPATHに追加する必要があります(libapr-1.dll等も必要なため)。
http://subversion.tigris.org/files/documents/15/46886/svn-win32-1.6.6_javahl.zip
JavaHLのソースはこちら↓
http://svn.collab.net/repos/svn/trunk/subversion/bindings/javahl/
Mac 10.6の場合はSubversionは入っているので
sudo port install subversion-javahlbindings
としてsubversion-javahlbindingsをインストールすればJavaHLが使えます。
実際の利用例としてはSubclipse(たぶんSubversiveも)やSvnAntがあります。HudsonのSubversionプラグインはSVNKitを直に使っています。
Subclipseの場合はCmdLineClientAdapterFactoryは使っていないのでSVNKitとJavaHLの2本立てです。
Windows環境の場合はSubclipseがDLLを用意しているのでSubversionをインストールしなくてもJavaHLを利用することができます。デフォルトではJavaHLを使います。
Macの場合はJavaHLは使えずSVNKitを使うことになります。プリファレンス画面でもJavaHL(JNI) Not Availableと表示されます。
JavaHLを使おうにも#20983 (On 10.6, subversion-javahlbindings do not work with Eclipse and Subversive) – MacPortsという問題が出てきたりします。
だいたいこんな感じかな。