M12i.

学術書・マンガ・アニメ・映画の消費活動とプログラミングについて

Github上に私設Mavenリポジトリをつくる

Mavenは依存性解決やビルド/デプロイ処理のためのツールとして非常に便利なのですが、個人的に作成した各種ライブラリやツールを配布するには、通常中央のリポジトリにものを登録する必要があります。そして中央リポジトリに登録するには、いろいろ準備がいります。

それはまあしかたがないことなのですが、ちょっとしたツールでそうした準備をするのは面倒だという場合には、Github上にリポジトリを私設することもできます。使用するのはGithubから公開されているGithub Maven Pluginsというプラグイン・コレクションです。

こちらのポストで紹介されているものですが、今(2015/06/06)現在サンプルコードの大事なところがすべて読めない状態になってしまっています。さいわいこのポスト自体、stackoverflow.comのこのポストの翻訳なのでそちらを参照しました。

これを読んでつくったプロジェクトのリポジトリこちらです。ブランチmvn-repoMavenリポジトリ用ブランチとして作成されています。

Mavenリポジトリをつくる

Githubリポジトリを作成

何はともあれGithubリポジトリを作成します。そこからクローンして、ローカル・リポジトリを作成し、そこにMavenのプロジェクトを作成します。

以降の説明の前提となる各種サンプル情報を示します:

settings.xmlの変更

まずはsettings.xmlを変更します。配置場所は.m2/settings.xml(mavenのアーカイブ解凍先)/conf/settings.xmlといろいろだとは思います。

serversタグの子要素を追加します:

  <servers>
    ...
    <server>
      <id>github</id>
      <username>mizukyf</username>
      <password>foobar</password>
    </server>
  </servers>

idは任意の値を使用してよいようです。後ほどMavenプロジェクトのpom.xmlでこのサーバ情報を参照するためのキーです。usernamepasswordは言わずもがなですが、Githubの個人ユーザのID・パスワードです。

pom.xmlの変更

先ほど作成したMavenプロジェクトのpom.xmlにいくつかの変更を加えます。

まずはprojectタグ(つまりpom.xmlのドキュメント構造のルートですが)の子要素として、github.global.serverというキーでプロパティを定義します。このプロパティの値は先ほどsettings.xmlで定義したサーバ情報を参照するものです:

<properties>
	<github.global.server>github</github.global.server>
</properties>

次に同じprojectタグの子要素として、内部リポジトリの情報を追加します。これはとくにこだわりのない限り固定文言でよいでしょう:

<distributionManagement>
	<repository>
		<id>internal.repo</id>
		<name>Temporary Staging Repository</name>
		<url>file://${project.build.directory}/mvn-repo</url>
	</repository>
</distributionManagement>

続いて、pluginsタグの子要素としてプラグインとその設定情報を追加します。これは最前追加した内部リポジトリをデプロイ(deployゴール)の向き先として指定するものです。これも先ほどと同様にふつうは上固定文言になるでしょう(先ほど内部リポジトリのパスの/mvn-repoを別のものに変更している場合はここでも同じように変更が必要です):

<plugin>
	<artifactId>maven-deploy-plugin</artifactId>
	<version>2.8.1</version>
	<configuration>
		<altDeploymentRepository>internal.repo::default::file://${project.build.directory}/mvn-repo</altDeploymentRepository>
	</configuration>
</plugin>

さらに、同じくpluginsタグの子要素として、site-maven-pluginの設定を追加します。

このなかでbranchタグにはMavenリポジトリとして利用するGitブランチを指定します。私の場合はここもstackoverflow.comのポストにあるままを指定しました。

repositoryNamerepositoryOwnerは当然ながらプロジェクトごと、開発者個人ごとに異なってきます。以下の例ではsettings.xmlのセクションで提示したサンプル値を指定しています:

<plugin>
	<groupId>com.github.github</groupId>
	<artifactId>site-maven-plugin</artifactId>
	<version>0.12</version>
	<configuration>
		<message>Maven artifacts for ${project.version}</message>  <!-- git commit message -->
		<noJekyll>true</noJekyll>                                  <!-- disable webpage processing -->
		<outputDirectory>${project.build.directory}/mvn-repo</outputDirectory> <!-- matches distribution management repository url above -->
		<branch>refs/heads/mvn-repo</branch>                       <!-- remote branch name -->
		<includes>
			<include>**/*</include>
		</includes>
		<repositoryName>mvnrepo.on.github</repositoryName>      <!-- github repo name -->
		<repositoryOwner>mizukyf</repositoryOwner>    <!-- github username -->
	</configuration>
	<executions>
		<execution>
			<goals>
				<goal>site</goal>
			</goals>
			<phase>deploy</phase>
		</execution>
	</executions>
</plugin>

これでmvn clrean deployコマンドを実行すると、ビルドが行われた後、Github上のリポジトリリポジトリが自動で作成され、そこに成果物がアップロードされます。

mergeタグによるデプロイ方法の変更

なおsite-maven-pluginの設定のなかで、configurationタグの子要素として<merge>true</merge>を指定しないと、リポジトリ上には直近デプロイしたバージョンの成果物しか登録されません。

サンプルのコミット履歴でいうと、
2回目のコミット3d1480dまでがmergeタグにtrueを指定してデプロイを行ったもの。そして
46e5ec9mergeタグをなくしてデプロイしたものです。

Github上の私設リポジトリを参照する

上記の手順でGithub上に私設のMavenリポジトリが作成されました。今度はこのリポジトリ上のMavenプロジェクトに依存するMavenプロジェクトに設定を施します。まずリポジトリ上のMavenプロジェクトに依存するプロジェクトのpom.xmlを変更します。

まずはporojectタグの子要素としてリポジトリ情報を追加します:

<repositories>
    <repository>
        <id>mvnrepo.on.github</id>
        <url>https://raw.github.com/mizukyf/mvnrepo.on.github/mvn-repo/</url>
        <snapshots>
            <enabled>true</enabled>
            <updatePolicy>always</updatePolicy>
        </snapshots>
    </repository>
</repositories>

ここでurlタグに指定するのはhttps://raw.github.com/(Gitユーザ名)/(Gitリポジトリ名)/(Mavenリポジトリ用ブランチ名)/という形式のURLです。

続いてdependenciesタグの子要素として依存性情報を追加します:

<dependency>
	<groupId>org.doogwood</groupId>
	<artifactId>mvnrepo.on.github</artifactId>
	<version>0.0.3-SNAPSHOT</version>
</dependency>

もちろんgroupIdartifactIdversionには、先ほどの手順でMavenリポジトリを作成したプロジェクトの情報を設定します。

以上で、Github上に設けられたMavenリポジトリ(と中央リポジトリ)を使って依存性解決が行われるようになります。