OpenAPI Generatorを利用して自動生成したJavaのAPIクライアントをローカルリポジトリに保存する

こんにちは、エキサイト株式会社の平石です。

今回は、OpenAPI Generatorを利用して自動生成したJavaAPIクライアントを独自のローカルリポジトリに保存する方法をご紹介します。

なお、今回の方法は例として「OpenAPI Generatorを利用して自動生成したJavaAPIクライアント」を挙げているだけで、それ以外の自作のライブラリ等でも利用できます。

はじめに

OpenAPI Generatorを利用してJavaAPIクライアントを自動生成する基礎については、以下のブログ記事でまとめていますので、こちらをご覧ください。

tech.excite.co.jp

実際のサーバー環境上で運用する際の問題点

上で紹介したブログ記事では、生成したクライアントをローカルのMaven Repositoryにインストールし、利用したいプロジェクトで依存関係を追加して利用しました。

ローカルのMaven Repositoryはデフォルトでは、$USER/.m2/repositoryに存在しています。
ローカルで開発している間は良いのですが、サーバー環境上にデプロイした際にはこのRepositoryをそのまま使うことはできませんので、何か策を講じなければなりません。

ここからは、上記の問題を解決していきます。

独自のMaven Repositoryを利用する

この問題の解決方法としては、独自のMaven Repositoryを利用するように設定することが挙げられます。

そもそも、Maven Repositoryは以下のような構成になっていれば、どこに配置していても利用することが可能です。

/{repository_root}/{group ID}/{artifact ID}/{version}/

group ID, artifact ID, versionは、pom.xmlを利用して設定や依存関係を記述している人なら馴染み深いでしょう。
例えば、OpenAPIをSpring Bootで利用するための、Springdocというライブラリを追加する際には、pom.xmlに以下のように記述します。

<dependency>
    <groupId>org.springdoc</groupId>
    <artifactId>springdoc-openapi-starter-webmvc-ui</artifactId>
    <version>2.3.0</version>
</dependency>

つまり、この設定はMaven Repositoryの

/{repository_root}/org/springdoc/springdoc-openapi-starter-webmvc-ui/2.3.0

配下にあるライブラリを依存関係として追加するということを表しているのです。

そして、この配下に主に以下の4つのファイルが配置されています。

  • {artifact ID}-{version}.pom
  • {artifact ID}-{version}.jar
  • {artifact ID}-{version}-sources.jar
  • {artifact ID}-{version}-javadoc.jar

逆に言えば、この構成を好きな場所に再現して利用すれば良いのです。

この「好きな場所」は、別のサーバー上やAWSのS3のようなオブジェクトストレージでも可能です。

build.gradleから参照する際には、以下のように記述しておけば、ライブラリを探すときにこの中を見てくれるようになります。

repositories {
        mavenCentral()

        maven {
            url {利用したいMaven RepositoryのURL}
        }
}

なお、ライブラリを探す際には、repositoriesで指定した順番で探しに行くようです。
したがって、mavenCentral()から取得するライブラリが多い場合には、こちらを上に記述することで、ビルド時間を短縮することが可能です。

独自のライブラリを多く利用する必要がある場合には、別のサーバー上やS3でMaven Repositoryを管理するメリットがあります。
しかし、当分今回作成したAPIクライアントしか利用する予定がないような場合には、サーバーやS3に保存しておく方法は作成や管理の手間がかかってしまいます。
そのような場合には、Maven Repositoryをプロジェクト内に含めて、まとめてデプロイしてしまう方法も選択肢に入ります。
JARファイルは圧縮されているため、ファイルサイズ的には問題にはならないでしょう。

今回は、こちらの方法をご紹介します。
といっても、やることは簡単です。

基礎編では、以下のコマンドでLocal RepositoryにAPIクライアントをインストールしていました。

mvn clean install

先ほど述べたように、このままではデフォルトのローカルリポジトリである$USER/.m2/repository配下にインストールされてしまいます。

そこで、-Dmaven.repo.localオプションを付与することで、一時的にLocal Repositoryの場所を変更することができます。

mvn clean install -Dmaven.repo.local=./{path_to_local_repository}

{path_to_local_repository}の部分にご自身が設定したいlocal_repositoryの場所を指定してあげることで、その場所にAPIクライアントがインストールされます。

ただし、このままでは生成したAPIクライアント以外にも不要なライブラリもインストールされてしまいます。 (このAPIクライアントのpom.xmlで設定されているライブラリか?)

これらは、実際にAPIクライアントを利用する上では不要なので、APIクライアントを含んだディレクトリだけをコピーして適当なディレクトリにペーストしておきます。

例えば、以下のようなディレクトリ構成となっていおり、clientgenディレクトリにAPIクライアントが自動生成されているとします。

この場合には、以下のようなコマンドを実行することで、local_repositoryにプロジェクトで利用するAPIクライアントのみを含んだMaven Repositoryを構成することができます。
あらかじめ、local_repository配下にcom/exampleという空ディレクトリを作成しておいてください。 (現在、プロジェクトルートにいるとします。)

cd clientgen
mvn clean install -Dmaven.repo.local=./local_repository_temp
cp -rf ./local_repository_temp/com/example/openapi-java-client ./../local_repository/com/example

次に、ライブラリを取得する先のMaven Repositoryを設定します。

repositories {
    mavenCentral()
    maven {
        url "$rootDir/local_repository"
    }
}

依存関係を追加します。

dependencies {
    〜〜 略 〜〜

    implementation "com.example:openapi-java-client:0.0.1-SNAPSHOT"
}

これで、プロジェクト内でAPIクライアントを利用できるようになりました。
自動生成したAPIクライアントそのもの(clientgen配下)やlocal_repository_tempディレクトリは.gitignoreに記述する(Gitを利用している場合)か、削除しておくと良いでしょう。

おわりに

今回は、自動生成したAPIクライアントをプロジェクト内の自作のMaven Repositoryに保存してサーバー環境上でも利用できるようにするための設定方法をご紹介しました。

では、また次回。