倭マン's BLOG

くだらない日々の日記書いてます。 たまにプログラミング関連の記事書いてます。 書いてます。

Maven から GitHub Packages にライブラリを公開する、ライブラリを使う

いつの間にか 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 の設定

アクセストークンを取得したら、それを使って MavenGitHub にアクセスできるように 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.xmlMaven のグローバル設定が完了すれば、後はプロジェクトごとの設定を 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

を実行すると、ライブラリがダウンロードされて使用可能になります。

*1:GitHub サイト内からこのページに行くには、右上アイコンのプルダウンメニュー「Settings」 → 左のメニュー「Developer Settings」 → 左のメニュー「Personal access tokens」 → 「Generate new token」と進みます。

*2:Windows では「C:\Users\《ユーザ名》」。 念のため。

*3:ライブラリを公開する場合に必要な「write:packages」は「read:packages」を含んでいるので、ライブラリを公開する設定を行っているならそれで充分です。

*4:もしかしたら何かしらのプラグインがあったりするかも?