apache + WebDAV でMaven2リポジトリを構成するメモ

最近はJenkinsCIが自然に使われるようになり、Javaのビルド環境もMavenで統一しておくと便利です。ですが、Mavenは結構癖が強くて使いこなすのは意外と大変で、deploy周りは結構面倒です。社内や個人的に配布したいプロジェクトをリポジトリに配布する手順をメモしておきます。尚、Sakura VPS + CentOS5.5あたりをベースにしてます。

mvn deploy

Mavenを使ってプロジェクトをリポジトリにdeploy(配備)するには、「mvn deploy」コマンドを使います。deploy時には、コンパイルからテストまで行われ、最後にプロジェクトの成果物がリポジトリにdeployされます。deploy方法としては以下の方法がとれますが、ローカルファイルシステムにdeployする事はサポートされていません。

問題となるのは、deploy後のパーミッションであり、リポジトリとして公開するならば公開できる場所・パーミッションに置く必要があると言うことです。apacheで公開するならば、CentOSの場合、apacheユーザで転送したい所です。しかし、ftpsshで転送するときにapacheユーザとして転送するのは少々手間なので、webdavを使うのが楽です。

apacheの設定

apachemavenリポジトリの設定を行い、webdavを有効にします。最近のapacheではデフォルトで組み込まれているので、confを変更するだけで良いようです。
VirtualHostを使っている場合は、こんな感じになります。

# http://maven.deathmarch.jp/

ServerName maven.deathmarch.jp
Alias /maven2 /var/maven2/repository

Options Indexes FollowSymLinks
DAV On
AuthType Digest
AuthName WebDAV
AuthUserFile /xxxx/xxx/.htdigest

require valid-user


/var/maven2/repository をリポジトリとしています*1。また、そのままwebdavとしてアクセスできるように、「DAV On」を指定します。また、誰でも書き込めるのは不味いので、Digest認証で制限をかけておきます。webdavはhttp経由でアクセスするインターフェイスですので、GET等を除いて認証を必要としておけば良いでしょう。
リポジトリの設定はこれだけで完了です。

pom.xmlの設定

pom.xml には2カ所設定する必要があります。
1つ目はプロジェクトのdeploy先の設定です。distributionManagementタグにリポジトリを指定します。ここで、idとurlを指定しておきます。

  <distributionManagement>
    <repository>
      <id>maven.deathmarch.jp</id>
      <name>deathmarch.jp Repository</name>
      <url>dav:http://maven.deathmarch.jp/maven2</url>
    </repository>
  </distributionManagement>

もう1つは、deployの時に使用するwagonモジュールの設定です。

<build>
    ...
    <extensions>
      <extension>
        <groupId>org.apache.maven.wagon</groupId>
        <artifactId>wagon-webdav-jackrabbit</artifactId>
      </extension>
    </extensions>
</build>

buildタグの最後にextensionsタグを追加してください。ここではまりやすいポイントですが、extensions/extension となっているか、wagon-webdav-jackrabbitがwagon-webdavになっていないかを確認してください。古い情報で間違った紹介となっているサイトがあります。

settings.xmlの設定

webdavにアクセスするユーザとパスワードは、デプロイを行うマシンの.m2/settings.xmlで指定します。ここでリポジトリのIDを対応させてください。

<settings>
  <servers>
    <server>
      <id>maven.deathmarch.jp</id>
      <username>USER_NAME</username>
      <password>PASSWORD</password>
    </server>
</settings>

Jenkinsで自動deployする

JenkinsCIで自動deployするには、settings.xmlをJenkinsCIのジョブ設定で与えてやればOKです。もしくは、JENINS_HOME/.m2/settings.xmlを探して設定してください。

*1:所有者をapacheにする