プライベートなMavenリポジトリを立てる

Mavenは、複数のリポジトリから依存ライブラリをかき集めてBuildすることができますが、もちろん自身が開発した物件をプロジェクト内だけで使うプライベートなMavenリポジトリでホストしてプロジェクトチーム内で共有することができます。


リビジョン管理とこのようなリリースBuildのコントロールによって、テストなどのレポート、解析を効率よく進めることができます。
立てる方法もやってみるとすごく簡単。

  • 必要なもの
    • Maven
    • scp でファイルを受けとってくれるサーバ (ftpとかでもいい)
    • Nexus か HTTPサーバ


1. リポジトリとなるサーバを立てる
まずリポジトリサーバを立てます。
今回は、クライアントからリリース物件の転送を scp を使う方法で作ってみるので、Linuxで立てるのが楽です。
まず、リポジトリのメンテナンスユーザを作ります。
自分は、プロジェクト名のユーザを大体作ります。

# sudo useradd necomimi

次に、scp をするためにリポジトリとなるディレクトリを作成します。

necomimi# mkdir /project/maven

次に、Nexus を上げます。
Nexus は、Mavenリポジトリのプロキシとしての役割りを果たしてくれて、外部のMavenリポジトリをキャッシュしてくれたりするのですごく便利です。
今回のテーマであるプライベートリポジトリを立てるのに必須ではないのだけど、Mavenをがっつり使うのであればマストと言っていいツールです。
NexusHudson は、マスト。
といっても、これは Nexus の war を Tomcat などの JEE サーバに配備するだけなので割愛。
今使ってるプロジェクトでは、Jetty で運用しています。


Nexus を立てて基本的な設定が済んだら、リポジトリの Add で Hosted Repository を追加します。
この辺の画面見てください。
これは、自前のプライベートリポジトリを立てる機能です。
いくつか設定がありますが、ほとんどデフォルトでよくて、IDやNameは適当なものを入れて、Override Local Storage Location のところに上で作ったリポジトリ用のディレクトリを入力します。
上の例だと、/project/maven
これで保存したら終了。


2. クライアントを設定する

リリース作業を行なうクライアントの設定をします。
リリース作業は、各開発者よりはリリースを管理するリリース担当者がやるので、その人の端末の設定になります。


まずは、Mavenの設定にリポジトリサーバの認証情報などを設定します。
いろいろやりかたはあるのですが、今回はssh-keyベースの認証で scp するようにします。
まず、ssh-keyを作ります。
既に作成済なら、それを使えばよいです。

someone# ssh-keygen


これで、~/.ssh に id_dsa (秘密鍵), id_dsa.pub (公開鍵)ができるので、id_dsa.pub の内容を1で作ったリポジトリサーバのリポジトリのメンテナンスユーザのホームの .ssh/authorized_keys に追記します。
上の例だったら necomimi ユーザのファイルです。
なければ作成してください。
これは、パーミッションを600 にして勝手に書き替えられないようにしておいてください。


次は、Mavenの設定にリポジトリサーバの情報を設定します。
以下のように設定ファイルを書きます。

  • ~/.m2/settings.xml
<servers>
  ...
  <server>
    <id>necomimi-repository</id>
    <username>necomimi</username> <!-- リポジトリのメンテナンスユーザ -->
    <privateKey>/home/someone/.ssh/id_dsa</privateKey> <!-- 秘密鍵 -->
    <filePermissions>664</filePermissions>
    <directoryPermissions>775</directoryPermissions>
    <configuration>
      <sshExecutable>/usr/bin/ssh</sshExecutable> <!-- sshコマンド -->
      <scpExecutable>/usr/bin/scp</scpExecutable> <!-- scpコマンド -->
      <sshArgs></sshArgs>
    </configuration>
  </server>
</servers>


これでクライアントの設定は完了。


3. プロジェクトのpom.xmlの設定

最後に、リリース対象となるプロジェクトのpom.xmlを設定します。
設定すべきことは、リポジトリサーバの指定と、scp を実行してくれる拡張機能の設定です。
拡張機能には ftp などもあるので、サーバの環境に合わせて変更してください。
ここでは、詳しくは書きません。

<project>
  ...
  <distributionManagement>
    <repository>
      <id>necomimi-repository</id>
      <!-- example.com の /project/maven にリリース -->
      <url>scpexe://example.com/project/maven</url>
    </repository>
  </distributionManagement>

  <build>
    <extensions>
      <extension>
        <groupId>org.apache.maven.wagon</groupId>
         <artifactId>wagon-ssh-external</artifactId>
         <version>1.0-beta-6</version>
      </extension>
    </extensions>
  </build>
  ..
</project>

これで設定は完了。
リリース作業は、

someone# mvn deploy

だけです。
これで、リポジトリサーバの /project/maven 以下に、Mavenリポジトリにおなじみのディレクトリ構成とリリース物件である jar や チェックサムファイルなどが配備されているはずです。
これを、Nexus の Hosted Repository 経由で参照できるので、プライベートなMavenリポジトリとして利用できます。
Nexus を使わないのであれば、ApacheHTTPなどを立てて、リポジトリディレクトリを公開するだけでもOKです。


この辺、大した時間かからないけど、方法を調べたりしてると意外に面倒でなかなか実行しないことが多いので、まとめてみました。