SubversionをJavaから扱う方法のメモ

SubversionJavaから扱うには以下の3つがあります。

しかし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という問題が出てきたりします。

だいたいこんな感じかな。