いつの間にか GitHub に「GitHub Packages」という機能がついて、自作のライブラリ等を公開できるようになっていたので、Java のプロジェクト管理ツール Apache Maven からの使い方を試してみました。
Maven から GitHub Packages を使う方法は公式のドキュメントに書かれていて日本語訳もあるので単なる"やってみました"記事ですが、Scala のビルドツール sbt で同様のことをしてみる準備でもあります。
GitHub Packages にライブラリを公開する
Maven から GitHub Packages にライブラリを公開するには、Maven プロジェクト的には POM ファイルのdistributionManagement
要素で GitHub のリポジトリを指定して「mvn deploy
」コマンドを実行するだけですが、Maven から GitHub にアクセスするために GitHub のアクセストークンを取得して setting.xml に少々の設定が必要です。 この設定は Maven のグローバル設定なので、一度行えば別の Maven プロジェクトで同様のことを行う際に再設定の必要はありません。GitHub のアクセストークンを取得する
GitHub のアクセストークンは GitHub の「New personal access token」ページから新規作成できます*1。 このページで「Note」に適当な説明を入力、「write:packages」にチェックを入れて、下部の「Generate Token」をクリックします:
生成されたトークンをコピーして下記の setting.xml に使用します。 ページ遷移をするとアクセストークンを再表示できなくなるので注意。
setting.xml の設定
アクセストークンを取得したら、それを使って Maven が GitHub にアクセスできるように setting.xml を設定します。 setting.xml はユーザホーム・ディレクトリ*2下の .m2 ディレクトリにあります(なければ作成してください)。 setting.xml の設定はservers
要素下の server
要素で、サーバの id、GitHub のユーザ名、上記のアクセストークン(パスワード)を指定するだけです。また、必須ではありませんが、ついでに成果物の SNAPSHOT バージョンを有効にする設定もしておきましょう。 これには activeProfiles
要素と profiles
要素で設定を行いますが詳細は下記のサンプルコードを参照(「Configuring Apache Maven for use with GitHub Packages」サイトのサンプルのコピペ)。
これらの設定を行った setting.xml ファイルは以下のようになります。 ただし
GitHub のユーザ名 | $GITHUB_USER |
---|---|
アクセストークン | $GITHUB_TOKEN |
としています:
~/.m2/settings.xml
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd"> <servers> <server> <id>github</id> <username>$GITHUB_USER</username> <password>$GITHUB_TOKEN</password> </server> </servers> <activeProfiles> <activeProfile>github</activeProfile> </activeProfiles> <profiles> <profile> <id>github</id> <repositories> <repository> <id>central</id> <url>https://repo1.maven.org/maven2</url> </repository> <repository> <id>github</id> <url>https://maven.pkg.github.com/$GITHUB_USER/*</url> <snapshots> <enabled>true</enabled> </snapshots> </repository> </repositories> </profile> </profiles> </settings>
$GITHUB_USER, $GITHUB_TOKEN の値以外はコピペでいいと思います。
pom.xml の設定
setting.xml で Maven のグローバル設定が完了すれば、後はプロジェクトごとの設定を POM ファイル (pom.xml) で行うだけです。 POM ファイルに必要な追加設定は、成果物をアップロードする GitHub のリポジトリで、これはdistributionManagement
要素下の repository
要素で id
, name
, url
を指定して行います。 id
, name
要素の値は適当な文字列でいいですが、url
の値は、GitHub アカウントのユーザ名、リポジトリ名を使って
- https://maven.pkg.github.com/《ユーザ名》/《リポジトリ名》
とします。
これらの設定を施した POM ファイルは以下のようになります。 ただし
プロジェクトのグループ名 | org.example |
---|---|
成果物の名前 | github-packages-maven-example |
成果物のバージョン | 0.1-SNAPSHOT |
GitHub のユーザ名 | $GITHUB_USER |
成果物をアップロードする GitHub のリポジトリ |
github-packages-maven-example |
としています。 成果物の名前は GitHub のリポジトリ名と同じでいいでしょう。 自分のコピペの簡易化のため、distributionManagement
要素以外にもあれこれ設定していますが、不必要なら無視してください。
pom.xml
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>org.example</groupId> <artifactId>github-packages-maven-example</artifactId> <version>0.1-SNAPSHOT</version> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.source>11</maven.compiler.source> <maven.compiler.target>11</maven.compiler.target> </properties> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.13.1</version> <scope>test</scope> </dependency> </dependencies> <distributionManagement> <!-- 成果物をディプロイする GitHub Packages リポジトリを登録 --> <repository> <id>github</id> <name>GitHub $GITHUB_USER Apache Maven Packages</name> <url>https://maven.pkg.github.com/$GITHUB_USER/github-packages-maven-example</url> </repository> </distributionManagement> </project>
成果物のディプロイ
以上で設定は完了です。 プロダクションコード、テストコードが書けて成果物を GitHub Packages にディプロイするためには、コマンドラインでプロジェクト・ルートに移動し、コマンドmvn deploy
を実行します。 コンパイル、テスト、パッケージング等が実行された後、指定したリポジトリに成果物がアップロードされれば成功です。 アップロードされた成果物は GitHub リポジトリ・ページの右方で確認できます:

(画像の成果物のバージョンが違ってますが)ちなみに、一度ディプロイした成果物はプライベートリポジトリでないかぎり削除できないので注意。 リポジトリ自体を削除することはできますが。
GitHub Packages に公開されているライブラリを使う
GitHub Packages に公開されているライブラリを使うには POM ファイルにそのライブラリに関する依存性をdependencies
要素に書けばいいのですが、Maven Central に公開されているライブラリの場合と違って(加えて) GitHub Packages を Maven リポジトリとして登録する必要があります。また、GitHub にアクセスする必要があるので、上記のライブラリを公開する方法の説明で行った「GitHub のアクセストークンを取得する」と「setting.xml の設定」を行う必要があります。 少々異なるのは、ライブラリを使うのに必要なアクセストークンは「read:packages」だけであること*3と、setting.xml の SNAPSHOT バージョンの設定は必要ないので servers
要素の設定だけでいいことです。 これらの設定は「GitHub Packages にライブラリを公開する」で設定していれば再度行う必要はありません。
~/.m2/settings.xml
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd"> <servers> <server> <id>github</id> <username>$GITHUB_USER</username> <password>$GITHUB_TOKEN</password> </server> </servers> </settings>
$GITHUB_USER, $GITHUB_TOKEN は適切な値に変更してください。
これらの設定の後、Maven プロジェクトからライブラリを使うために POM ファイルに設定を行います。 必要なのは dependencies
要素に書く通常の依存性と、そのライブラリが公開されている GitHub Packages リポジトリの登録です。 リポジトリの登録は repositories
要素下の repository
要素で id
, name
, url
を指定して行います。 これらは「ライブラリを公開する」場合の distributionManagement
要素の repository
要素と同様のものですが、複数の GitHub Packages リポジトリのライブラリを使う際に id
が一致しないようにする必要があります。
これを踏まえて POM ファイルは以下のようになります(またいくらか余計な設定を追加していますが):
pom.xml:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>my.example</groupId> <artifactId>myproject</artifactId> <version>0.1-SNAPSHOT</version> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.source>11</maven.compiler.source> <maven.compiler.target>11</maven.compiler.target> </properties> <dependencies> <!-- GitHub Packages で公開されているライブラリの依存性 --> <dependency> <groupId>org.example</groupId> <artifactId>github-packages-maven-example</artifactId> <version>0.1-SNAPSHOT</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.13.1</version> <scope>test</scope> </dependency> </dependencies> <repositories> <!-- ライブラリを公開している GitHub Packages リポジトリを登録 --> <repository> <id>github-packages-maven-example</id> <name>GitHub $GITHUB_USER Apache Maven Packages</name> <url>https://maven.pkg.github.com/$GITHUB_USER/github-packages-maven-example</url> </repository> </repositories> </project>
1つの GitHub Packages リポジトリごとに repository
要素を追加する必要があるのが少々面倒くさいですが仕方ないでしょう*4。 POM ファイルの設定が済めば、コマンドラインで Maven プロジェクトのルートディレクトリに移動して以下のコマンド
mvn install
を実行すると、ライブラリがダウンロードされて使用可能になります。