この記事は同僚の発見した知見を代理でまとめたものです。
文脈
OpenAPI Generator
で生成されるファイルに含まれるjavax.annotation.Generated
アノテーションのせいでJava 17
移行時にコンパイルエラーが発生しました。
この問題は最新バージョンでは恐らく解決されていますが、自分たちのチームでは独自パッチを当てたバージョンを運用している関係で、バージョンアップでの解決はできませんでした。
そこで、なんとかバージョンを変えないままで、javax.annotation.Generated
を生成しない、またはjakarta.annotation.Generated
に置換することを試みました。
自分たちのチームではspring-kotlin
のジェネレータを使っていますが、やり方的に言語を問わず応用可能と思われます。
また、後述するテンプレートのファイル名が同じだったので、Java
に対してはそのまま適用可能だと思っています(確認はしていません)。
やり方
OpenAPI Generator
は、mustache
のテンプレートを置換する形で生成を行います。
このテンプレートは、-t
オプションを使って上書きできます。
つまり、javax.annotation.Generated
アノテーションを生成しているmustache
テンプレートを上書きすれば、javax.annotation.Generated
を生成しない、またはjakarta.annotation.Generated
に置換することができます。
実際に上書きする
javax.annotation.Generated
の生成に関わっているのはgeneratedAnnotation.mustache
という名前のファイルです。
同名のファイルを任意のディレクトリに配置し、-t ${配置先ディレクトリ}
と指定することで、上書きできます。
例えばtemplates
という名前のディレクトリに配置した場合、以下のように指定することになります。
java -jar ${openapi-generator-cliのjarへのパス} generate ${その他オプション} -t templates
以下、上書きに使うテンプレートの例を紹介します。
jakarta.annotation.Generated
に置換する例
以下は生成結果をjakarta.annotation.Generated
に変更する例です。
前述したファイルからアノテーション名を変えただけです。
@jakarta.annotation.Generated(value = ["{{generatorClass}}"]{{^hideGenerationTimestamp}}, date = "{{generatedDate}}"{{/hideGenerationTimestamp}})
生成させない例
以下はGenerated
アノテーションを生成させない例です。
実際には空文字列で生成できますが、挙動を誤解させないようコメントを入れておくと親切かなと思います。
{{! javaxのGeneratedアノテーション生成を抑制するためのテンプレート、空文字列であることに意味があるため消さないこと }}