The English version of quarkus.io is the official project site. Translated sites are community supported on a best-effort basis.

JReleaser によるパッケージングとリリース

このガイドでは、JReleaser ツールを使ったCLIアプリケーションのパッケージングとリリースについて説明します。

1. 前提条件

このガイドを完成させるには、以下が必要です:

  • 約15分

  • IDE

  • JDK 11+ がインストールされ、 JAVA_HOME が適切に設定されていること

  • Apache Maven 3.8.1+

  • 使用したい場合、 Quarkus CLI

  • ネイティブ実行可能ファイルをビルドしたい場合、MandrelまたはGraalVM(あるいはネイティブなコンテナビルドを使用する場合はDocker)をインストールし、 適切に設定していること

  • GitHubアカウントとGitHubパーソナルアクセストークン

2. プロジェクトのブートストラップ

まず,CLIアプリケーションを定義したプロジェクトが必要です。 PicoCLIエクステンションの使用をお勧めします。これは以下のコマンドで行うことができます。

CLI
quarkus create cli org.acme:app
cd app

To create a Gradle project, add the --gradle or --gradle-kotlin-dsl option.

For more information about how to install the Quarkus CLI and use it, please refer to the Quarkus CLI guide.

Maven
mvn io.quarkus.platform:quarkus-maven-plugin:2.11.1.Final:create \
    -DprojectGroupId=org.acme \
    -DprojectArtifactId=app \
    -Dextensions="picocli"
cd app

To create a Gradle project, add the -DbuildTool=gradle or -DbuildTool=gradle-kotlin-dsl option.

このコマンドは、プロジェクトのファイル構造と最低限必要なファイルのセットを初期化します。

.
├── README.md
├── mvnw
├── mvnw.cmd
├── pom.xml
└── src
    └── main
        ├── docker
        │   ├── Dockerfile.jvm
        │   ├── Dockerfile.legacy-jar
        │   └── Dockerfile.native
        ├── java
        │   └── org
        │       └── acme
        │           └── GreetingCommand.java
        └── resources
            └── application.properties

また、このコマンドは pom.xml にpicocli エクステンションを設定します。

    <dependency>
      <groupId>io.quarkus</groupId>
      <artifactId>quarkus-picocli</artifactId>
    </dependency>

3. GitHub リリース用のプロジェクトの準備

この作業を続ける前に、プロジェクトをGitHubリポジトリでホストする必要があります。この作業は、GitHub アカウントにログインし、新しいリポジトリを作成して、新しく作成したソースをそのリポジトリに追加することで完了します。 main ブランチをデフォルトとして選択すると、規約を利用して pom.xml で設定を少なくすることが可能です。

また、作成したリポジトリにリリースを投稿するためには、GitHub パーソナルアクセストークンが必要です。 パーソナルアクセストークンの作成方法は、公式ドキュメントに従ってください。作成したトークンは、今後のために安全な場所に保管しておきましょう。次に、トークンを環境変数 JRELEASER_GITHUB_TOKEN として設定し、ツールに読み込ませる方法があります。あるいは、 .yml.toml.json.properties のいずれかのファイルを使用して、トークンを安全な場所に保存することもできます。デフォルトの場所は ~/.jreleaser/config[format] です。例えば、 .yml のフォーマットを使用した場合、このファイルは次のようになります。

~/.jreleaser/config.yml
JRELEASER_GITHUB_TOKEN: <github-token-value>

さてさて。すべてのソースを追加し、最初のコミットを作成します。コミットメッセージの規約は自由ですが、 Conventional Commits 仕様に従った方が、JReleaserをより効果的に使うことができます。最初のコミットでは、"build:Add initial sources" というメッセージで最初のコミットを行います。

4. ネイティブイメージでの配布

Quarkus already knows how to create a native executable using GraalVM Native Image. The default setup will create a single executable file following a naming convention. However, the JReleaser tool expects a distribution that is, a conventional file structure packaged as a Zip or Tar file. The file structure must follow this layout:

.
├── LICENSE
├── README
└── bin
    └── executable

この構造では、設定ファイル、シェル補完スクリプト、マンページ、ライセンス、Readmeなど、実行ファイルに必要なあらゆる種類のサポートファイルを追加することができます。

5. ディストリビューションの作成

maven-assembly-pluginを利用して、このようなディストリビューションを作成することができます。また、 os-maven-plugin を利用して、この実行ファイルが実行可能なプラットフォームを適切に識別し、ディストリビューションのファイル名にそのプラットフォームを追加します。

まず、 pom.xml に os-maven-plugin を追加しましょう。このプラグインは、Maven のエクステンションとして動作するため、ファイルの <build> セクションに追加する必要があります。

  <build>
    <extensions>
      <extension>
        <groupId>kr.motd.maven</groupId>
        <artifactId>os-maven-plugin</artifactId>
        <version>1.7.0</version>
      </extension>
    </extensions>
    <!-- ... -->

次に,Linux や macOS プラットフォーム上のネイティブ実行可能ファイルには通常拡張子がありませんが,Windows の実行ファイルには拡張子がありますので,生成された実行ファイルの名前を変更する際にはこの点に注意する必要があります.また,生成されたディストリビューションを独自のディレクトリに配置することで, target ディレクトリが散らかるのを防ぐことができます.そこで、 pom.xml の既存の <properties> セクションに、いくつかのプロパティを追加してみましょう。

<executable-suffix/>
<distribution.directory>${project.build.directory}/distributions</distribution.directory>

次に、maven-assembly-plugin を設定して、実行可能ファイルと、そのジョブを実行するために必要になる可能性のあるサポートファイルを含む Zip ファイルと Tar ファイルを作成します。ディストリビューションの名前に特に注意してください。ここで、os-maven-plugin によって検出されたプラットフォームのプロパティーを利用します。このプラグインは、package フェーズにバインドされた single ゴールを使用して独自のプロファイルで設定されます。これは、リリースの準備ができたときにのみ必要になるため、ビルドが呼び出されるたびにディストリビューションを再ビルドすることを回避するためにこのように行われます。

    <profile>
      <id>dist</id>
      <build>
        <plugins>
          <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-assembly-plugin</artifactId>
            <version>3.3.0</version>
            <configuration>
              <attach>false</attach>
              <appendAssemblyId>false</appendAssemblyId>
              <finalName>${project.artifactId}-${project.version}-${os.detected.classifier}</finalName>
              <outputDirectory>${distribution.directory}</outputDirectory>
              <workDirectory>${project.build.directory}/assembly/work</workDirectory>
              <descriptors>
                <descriptor>src/main/assembly/assembly.xml</descriptor>
              </descriptors>
            </configuration>
            <executions>
              <execution>
                <id>make-distribution</id>
                <phase>package</phase>
                <goals>
                  <goal>single</goal>
                </goals>
              </execution>
            </executions>
          </plugin>
        </plugins>
      </build>
    </profile>
    <profile>
      <id>dist-windows</id>
      <activation>
        <os>
          <family>windows</family>
        </os>
      </activation>
      <properties>
        <executable-suffix>.exe</executable-suffix>
      </properties>
    </profile>

2 つのプロファイルが設定されていることに注意してください。dist プロファイルはアセンブリプラグインを設定し、コマンドフラグとして -Pdist を渡すことによって明示的にアクティブ化する必要があるように設定されています。一方、ビルドが Windows プラットフォームで実行されると、dist-windows プロファイルが自動的にアクティブになります。この 2 番目のプロファイルは、次に示すように、アセンブリ記述子に必要な executable-suffix プロパティーの値の設定を処理します。

src/main/assembly/assembly.xml
<assembly
        xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0 http://maven.apache.org/xsd/assembly-1.1.0.xsd">
    <id>dist</id>
    <formats>
        <format>tar.gz</format>
        <format>zip</format>
        <format>dir</format>
    </formats>
    <files>
        <file>
            <source>${project.build.directory}/${project.artifactId}-${project.version}-runner${executable-suffix}</source>
            <outputDirectory>./bin</outputDirectory>
            <destName>${project.artifactId}${executable-suffix}</destName>
        </file>
    </files>
</assembly>

これらのファイルは、macOS上で ./mvnw -Pdist package を起動したときに、assembly プラグインによって作成されるファイルです。

$ tree target/distributions/
target/distributions/
├── app-1.0.0-SNAPSHOT-osx-x86_64
│   └── app-1.0.0-SNAPSHOT-osx-x86_64
│       └── bin
│           └── app
├── app-1.0.0-SNAPSHOT-osx-x86_64.tar.gz
└── app-1.0.0-SNAPSHOT-osx-x86_64.zip

アセンブリ記述子を自由に更新して、LICENSE、readme、または実行可能ファイルのコンシューマーが必要とするその他のファイルを追加してください。ここでビルド: ディストリビューションアセンブリの設定を使用して別のコミットを行います。

これで、次の段階であるリリースの設定に進むことができます。

6. JReleaser の追加

JReleaser ツールは、CLI ツール、Docker イメージ、または Maven プラグインなどのさまざまな方法で呼び出すことができます。最後のオプションは、すでに Maven を使用していることを考えると、非常に便利です。リリース設定を含むさらに別のプロファイルを追加しましょう。リリースを投稿する準備ができている場合にのみ、この動作を常にアクティブにする必要はありません。

    <profile>
      <id>release</id>
      <build>
        <plugins>
          <plugin>
            <groupId>org.jreleaser</groupId>
            <artifactId>jreleaser-maven-plugin</artifactId>
            <version>0.9.1</version>
          </plugin>
        </plugins>
      </build>
    </profile>

この時点で呼び出すことができるいくつかの目標があります。たとえば、./mvnw -Prelease jreleaser:config コマンドを呼び出すことにより、JReleaser に現在の設定を出力するように依頼できます。ツールは、プロジェクトについて知っているすべてのものを出力します。./mvnw -Prelease jreleaser:changelog を呼び出して変更ログを生成することもできます。変更ログを含むファイルは target/jreleaser/release/CHANGELOG.md に配置され、この時点では次のようになります。

target/jreleaser/release/CHANGELOG.md
## 変更ログ

8ef3307 ビルド: ディストリビューションアセンブリを設定します
5215200 ビルド: 初期ソースを追加します

Not very exciting, but we can change this by instructing JReleaser to format the changelog according to our own conventions. You can manually specify patterns to categorize commits however if you chose to follow Conventional Commits we can instruct JReleaser to do the same. Add the following to the JReleaser plugin configuration section:

            <configuration>
              <jreleaser>
                <release>
                  <github>
                    <changelog>
                      <formatted>ALWAYS</formatted>
                      <preset>conventional-commits</preset>
                    </changelog>
                  </github>
                </release>
              </jreleaser>
            </configuration>

前述のMavenコマンドをもう一度実行し、生成されたチェンジログを確認してください、以下のようになるはずです。

target/jreleaser/release/CHANGELOG.md
## 変更ログ

##🛠ビルド
- 8ef3307 配布アセンブリの設定 (Andres Almiray)
- 5215200 初期ソースを追加 (Andres Almiray)


## コントリビューター
以下の方々のご協力に感謝いたします。
Andres Almiray

適用できるフォーマットオプションは他にもありますが、今のところはこれらで十分です。ビルド: JReleaser プラグインの設定をコミットメッセージとして使用して、今すぐさらに別のコミットを行いましょう。必要に応じて、変更ログをもう一度生成して、この最新のコミットがファイルに追加されていることを確認できます。

7. リリースへのディストリビューションの追加

バイナリー配布を設定できるようになりました。./mvnw -Prelease jreleaser:config コマンドを実行すると、前の手順で設定した配布ファイルについての言及がないことに気付くでしょう。これは、ツールに暗黙の知識がないため、リリースするファイルを JReleaser に通知する必要があるためです。これにより、ファイルを自由に追加または削除したい場合に、ディストリビューションの作成がリリースアセットから切り離されます。この特定のケースでは、macOS と Windows の両方に Zip ファイルを設定し、Linux に Tar ファイルを設定します。これらのファイルは、次のように JReleaser プラグイン設定セクションに追加する必要があります。

            <configuration>
              <jreleaser>
                <release>
                  <github>
                    <changelog>
                      <formatted>ALWAYS</formatted>
                      <preset>conventional-commits</preset>
                    </changelog>
                  </github>
                </release>
                <distributions>
                  <app>
                    <type>NATIVE_IMAGE</type>
                    <artifacts>
                      <artifact>
                        <path>${distribution.directory}/{{distributionName}}-{{projectVersion}}-linux-x86_64.tar.gz</path>
                        <platform>linux-x86_64</platform>
                      </artifact>
                      <artifact>
                        <path>${distribution.directory}/{{distributionName}}-{{projectVersion}}-windows-x86_64.zip</path>
                        <platform>windows-x86_64</platform>
                      </artifact>
                      <artifact>
                        <path>${distribution.directory}/{{distributionName}}-{{projectVersion}}-osx-x86_64.zip</path>
                        <platform>osx-x86_64</platform>
                      </artifact>
                    </artifacts>
                  </app>
                </distributions>
              </jreleaser>
            </configuration>

3 つの設定されたアーティファクトを持つ`app`(便宜上プロジェクトの artifactId と同じ) という名前のディストリビューションを評価できます。パスを定義するための Maven プロパティーと Mustache テンプレートの使用に注意してください。設定をパラメーター化するためにプロパティーが必要な場合、またはプロパティーに依存する場合は、明示的な値を使用できます。Maven プロパティーはビルドの検証中に即時に解決されますが、Mustache テンプレートは JReleaser プラグインの目標の実行中に遅延して解決されます。各アーティファクトは、それらを一意に識別する platform プロパティーを定義する必要があります。./mvnw -Prelease jreleaser:config を実行すると、プラグインがプロジェクトによって提供されるメタデータが増えることを期待する設定済みのディストリビューションがあるため、すぐにエラーが発生します。

[WARNING]   [validation] project.copyright must not be blank since 0.4.0. This warning will become an error in a future release.
[ERROR] == JReleaser ==
[ERROR] project.description must not be blank
[ERROR] project.website must not be blank
[ERROR] project.docsUrl must not be blank
[ERROR] project.license must not be blank
[ERROR] project.authors must not be blank

このメタデータは、JReleaser プラグインの設定の一部として、または標準の POM 要素を使用して 2 つの方法で提供できます。前者のオプションを選択した場合、プラグインの設定は次のようになります。

            <configuration>
              <jreleaser>
                <project>
                 <description>app -- Sample Quarkus CLI application</description>
                 <website>https://github.com/aalmiray/app</website>
                 <docsUrl>https://github.com/aalmiray/app</docsUrl>
                 <license>APACHE-2.0</license>
                 <authors>Andres Almiray</authors>
                 <copyright>2021 Kordamp</copyright>
                </project>
                <!-- ... -->

標準の POM 要素を使用することを選択した場合、pom.xml には少なくともこれらのエントリーが含まれている必要があります。もちろん、値を独自のものに適合させます。

  <name>app</name>
  <description>app -- Sample Quarkus CLI application</description>
  <inceptionYear>2021</inceptionYear>
  <url>https://github.com/aalmiray/app</url>
  <developers>
    <developer>
      <id>aalmiray</id>
      <name>Andres Almiray</name>
    </developer>
  </developers>
  <licenses>
    <license>
      <name>Apache-2.0</name>
      <url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
      <distribution>repo</distribution>
    </license>
  </licenses>

それでも、./mvnw -Prelease jreleaser:config をもう一度呼び出すと、別のエラーが発生するため、まだトラブルを脱していません。今回の失敗は、アーティファクトの欠落に関連しています。これは、必要なすべてのアーティファクトをアセンブルしなかったためですが、プラグインはそれらがすぐに利用できることを期待しています。ここでは、他のノードで必要なアーティファクトをビルドし、それらを予想される場所にコピーすることを選択できます。これは、複数のノードで GitHub Actions ワークフローを実行できるタスクです。または、一部のアーティファクトを無視して、現在のプラットフォームに一致するアーティファクトのみを選択するように JReleaser に指示することもできます。macOS で作成したときにディストリビューションがどのように表示されるかを前述しましたが、そのプラットフォーム上にまだ正しいアーティファクトがあると仮定しています。

追加のフラグ ./mvnw-Prelease jreleaser:config -Djreleaser.select.current.platform を指定して jreleaser:config ゴールを呼び出すことにより、この時点で macOS に一致するアーティファクトのみを選択するように JReleaser に指示できます。今回はコマンドが成功し、モデルが出力されます。macOS アーティファクトのパスのみが完全に解決されており、他の 2 つのパスは変更されていないことに注意してください。

ここで、ビルド: 配布アーティファクトの設定をメッセージとしてもう 1 つコミットしてみましょう。別のゴール ./mvnw -Prelease jreleaser:release -Djreleaser.select.current.platform を呼び出すことで、今すぐリリースを作成できます。これにより、選択したリポジトリーに Git リリースが作成されます。これには、リポジトリーのタグ付け、変更ログのアップロード、すべての配布アーティファクト、およびそれらのチェックサムがリリースアセットとして含まれます。

しかし、その前に、もう 1 つの機能を追加して、macOS ユーザーがバイナリーディストリビューションを簡単に利用できるようにする Homebrew 式を作成しましょう。

8. パッケージャーとしての Homebrew の設定

Homebrew は、バイナリーをインストールおよび管理するための macOS ユーザーの間で人気のある選択肢です。Homebrew パッケージは、特定のバイナリーをインストールまたはアップグレードするためにターゲット環境で実行される Ruby ファイル (フォーミュラと呼ばれる) をコアにしています。JReleaser は、すでに設定したようなバイナリー分布から数式を作成できます。

これを機能させるには、次のように JReleaser プラグイン設定で Homebrew を有効にする必要があります。

                <distributions>
                  <app>
                    <type>NATIVE_IMAGE</type>
                    <brew>
                      <active>ALWAYS</active>
                    </brew>
                    <artifacts>
                      <artifact>
                        <path>${distribution.directory}/{{distributionName}}-{{projectVersion}}-linux-x86_64.tar.gz</path>
                        <platform>linux-x86_64</platform>
                      </artifact>
                      <artifact>
                        <path>${distribution.directory}/{{distributionName}}-{{projectVersion}}-windows-x86_64.zip</path>
                        <platform>windows-x86_64</platform>
                      </artifact>
                      <artifact>
                        <path>${distribution.directory}/{{distributionName}}-{{projectVersion}}-osx-x86_64.zip</path>
                        <platform>osx-x86_64</platform>
                      </artifact>
                    </artifacts>
                  </app>
                </distributions>

One last thing: it’s a good practice to publish Homebrew formulae for non-snapshot releases thus change the project’s version from 1.0.0-SNAPSHOT to say 1.0.0.Alpha1 or go directly with 1.0.0 as you feel like doing. One last commit, and we’re done: say feat: Add Homebrew packager configuration as commit message. Alright, we’re finally ready, let’s post a release!

9. リリースの作成

これは pom.xml に設定を追加する慌ただしいツアーでしたが、これはプロジェクトの最初のリリースを準備するためのもので、それ以降のリリースでは設定に手を加える必要はありません。Git リリースと Homebrew 式を jreleaser:full-release というゴールで作成しますが、もしまだどうなるかわからないという場合は、ドライランモードでゴールを起動することができます。つまり、Git リポジトリなどのリモートリソースに影響を与えることなく、必要に応じてすべてのローカル操作を JReleaser に実行させます。以下のようになります。

# プロジェクトのバージョンを変更したため
./mvnw -Pnative,dist package
./mvnw -Prelease jreleaser:full-release -Djreleaser.select.current.platform -Djreleaser.dryrun

[INFO] --- jreleaser-maven-plugin:0.9.1:full-release (default-cli) @ app ---
[INFO] JReleaser 0.9.1
[INFO]   - basedir set to /tmp/app
[WARNING] Platform selection is in effect
[WARNING] Artifacts will be filtered by platform matching: [osx-x86_64]
[INFO] Loading variables from /Users/aalmiray/.jreleaser/config.toml
[INFO] Validating configuration
[INFO] Project version set to 1.0.0.Alpha1
[INFO] Release is not snapshot
[INFO] Timestamp is 2021-12-16T13:31:12.163687+01:00
[INFO] HEAD is at a21f3f2
[INFO] Platform is osx-x86_64
[INFO] dryrun set to true
[INFO] Generating changelog: target/jreleaser/release/CHANGELOG.md
[INFO] Calculating checksums
[INFO]   [checksum] target/distributions/app-1.0.0.Alpha1-osx-x86_64.zip.sha256
[INFO] Signing files
[INFO] Signing is not enabled. Skipping
[INFO] Uploading is not enabled. Skipping
[INFO] Releasing to https://github.com/aalmiray/app
[INFO]  - uploading app-1.0.0.Alpha1-osx-x86_64.zip
[INFO]  - uploading checksums_sha256.txt
[INFO] Preparing distributions
[INFO]   - Preparing app distribution
[INFO]     [brew] preparing app distribution
[INFO] Packaging distributions
[INFO]   - Packaging app distribution
[INFO]     [brew] packaging app distribution
[INFO] Publishing distributions
[INFO]   - Publishing app distribution
[INFO]     [brew] publishing app distribution
[INFO]     [brew] setting up repository aalmiray/homebrew-tap
[INFO] Announcing release
[INFO] Announcing is not enabled. Skipping
[INFO] Writing output properties to target/jreleaser/output.properties
[INFO] JReleaser succeeded after 1.335 s

JReleaserが以下の作業を代行します。

  • 最後のタグ(もしあれば)から最新のコミットまでのすべてのコミットを基にして、チェンジログを生成します。

  • すべての入力ファイルに対してSHA256(デフォルト)のチェックサムを計算します。

  • すべてのファイルにGPGで署名します。ここでは、このステップを設定していないので、スキップされます。

  • JFrog ArtifactoryまたはAWS S3にアセットをアップロードします。このステップは設定しないのでこれも省略します。

  • 選択したリポジトリーに Git リリースを作成し、タグを付けます。

  • チェックサムを含むすべてのアセットをアップロードします。

  • Create a Homebrew formula, publishing to https://github.com/aalmiray/homebrew-tap.

もちろん、-Djreleaser.dryrun プロパティーが有効であることがわかるため、リモートリポジトリーは影響を受けませんでした。気になる場合は、公開する Homebrew 式を定義する target/jreleaser/package/app/brew/Formula/app.rb の内容を調べてください。次のようになります。

app.rb
class App < Formula
  desc "app -- Sample Quarkus CLI application"
  homepage "https://github.com/aalmiray/app"
  url "https://github.com/aalmiray/app/releases/download/v1.0.0.Alpha1/app-1.0.0.Alpha1-osx-x86_64.zip"
  version "1.0.0.Alpha1"
  sha256 "a7e8df6eef3c4c5df7357e678b3c4bc6945b926cec4178a0239660de5dba0fc4"
  license "Apache-2.0"


  def install
    libexec.install Dir["*"]
    bin.install_symlink "#{libexec}/bin/app"
  end

  test do
    output = shell_output("#{bin}/app --version")
    assert_match "1.0.0.Alpha1", output
  end
end

準備ができたら、コマンドラインから -Djreleaser.dryrun フラグを削除するだけで、今回は実際のリリースを作成し、リポジトリーを参照して、新しく作成されたリリースを確認します。

10. さらに詳しく

11. 参考

参考までに、 pom.xml の全内容は以下の通りです。

<?xml version="1.0"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <modelVersion>4.0.0</modelVersion>
  <groupId>org.acme</groupId>
  <artifactId>app</artifactId>
  <version>1.0.0.Alpha1</version>
  <name>app</name>
  <description>app -- Sample Quarkus CLI application</description>
  <inceptionYear>2021</inceptionYear>
  <url>https://github.com/aalmiray/app</url>
  <developers>
    <developer>
      <id>aalmiray</id>
      <name>Andres Almiray</name>
    </developer>
  </developers>
  <licenses>
    <license>
      <name>Apache-2.0</name>
      <url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
      <distribution>repo</distribution>
    </license>
  </licenses>
  <properties>
    <executable-suffix/>
    <distribution.directory>${project.build.directory}/distributions</distribution.directory>
    <compiler-plugin.version>3.8.1</compiler-plugin.version>
    <maven.compiler.parameters>true</maven.compiler.parameters>
    <maven.compiler.source>11</maven.compiler.source>
    <maven.compiler.target>11</maven.compiler.target>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    <quarkus.platform.artifact-id>quarkus-bom</quarkus.platform.artifact-id>
    <quarkus.platform.group-id>io.quarkus.platform</quarkus.platform.group-id>
    <quarkus.platform.version>2.11.1.Final</quarkus.platform.version>
    <surefire-plugin.version>3.0.0-M7</surefire-plugin.version>
  </properties>
  <dependencyManagement>
    <dependencies>
      <dependency>
        <groupId>${quarkus.platform.group-id}</groupId>
        <artifactId>${quarkus.platform.artifact-id}</artifactId>
        <version>${quarkus.platform.version}</version>
        <type>pom</type>
        <scope>import</scope>
      </dependency>
    </dependencies>
  </dependencyManagement>
  <dependencies>
    <dependency>
      <groupId>io.quarkus</groupId>
      <artifactId>quarkus-picocli</artifactId>
    </dependency>
    <dependency>
      <groupId>io.quarkus</groupId>
      <artifactId>quarkus-arc</artifactId>
    </dependency>
    <dependency>
      <groupId>io.quarkus</groupId>
      <artifactId>quarkus-junit5</artifactId>
      <scope>test</scope>
    </dependency>
  </dependencies>
  <build>
    <extensions>
      <extension>
        <groupId>kr.motd.maven</groupId>
        <artifactId>os-maven-plugin</artifactId>
        <version>1.7.0</version>
      </extension>
    </extensions>
    <plugins>
      <plugin>
        <groupId>${quarkus.platform.group-id}</groupId>
        <artifactId>quarkus-maven-plugin</artifactId>
        <version>${quarkus.platform.version}</version>
        <extensions>true</extensions>
        <executions>
          <execution>
            <goals>
              <goal>build</goal>
              <goal>generate-code</goal>
              <goal>generate-code-tests</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
      <plugin>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>${compiler-plugin.version}</version>
        <configuration>
          <parameters>${maven.compiler.parameters}</parameters>
        </configuration>
      </plugin>
      <plugin>
        <artifactId>maven-surefire-plugin</artifactId>
        <version>${surefire-plugin.version}</version>
        <configuration>
          <systemPropertyVariables>
            <java.util.logging.manager>org.jboss.logmanager.LogManager</java.util.logging.manager>
            <maven.home>${maven.home}</maven.home>
          </systemPropertyVariables>
        </configuration>
      </plugin>
    </plugins>
  </build>
  <profiles>
    <profile>
      <id>native</id>
      <activation>
        <property>
          <name>native</name>
        </property>
      </activation>
      <build>
        <plugins>
          <plugin>
            <artifactId>maven-failsafe-plugin</artifactId>
            <version>${surefire-plugin.version}</version>
            <executions>
              <execution>
                <goals>
                  <goal>integration-test</goal>
                  <goal>verify</goal>
                </goals>
                <configuration>
                  <systemPropertyVariables>
                    <native.image.path>${project.build.directory}/${project.build.finalName}-runner</native.image.path>
                    <java.util.logging.manager>org.jboss.logmanager.LogManager</java.util.logging.manager>
                    <maven.home>${maven.home}</maven.home>
                  </systemPropertyVariables>
                </configuration>
              </execution>
            </executions>
          </plugin>
        </plugins>
      </build>
      <properties>
        <quarkus.package.type>native</quarkus.package.type>
      </properties>
    </profile>
    <profile>
      <id>dist</id>
      <build>
        <plugins>
          <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-assembly-plugin</artifactId>
            <version>3.3.0</version>
            <configuration>
              <attach>false</attach>
              <appendAssemblyId>false</appendAssemblyId>
              <finalName>${project.artifactId}-${project.version}-${os.detected.classifier}</finalName>
              <outputDirectory>${distribution.directory}</outputDirectory>
              <workDirectory>${project.build.directory}/assembly/work</workDirectory>
              <descriptors>
                <descriptor>src/main/assembly/assembly.xml</descriptor>
              </descriptors>
            </configuration>
            <executions>
              <execution>
                <id>make-distribution</id>
                <phase>package</phase>
                <goals>
                  <goal>single</goal>
                </goals>
              </execution>
            </executions>
          </plugin>
        </plugins>
      </build>
    </profile>
    <profile>
      <id>dist-windows</id>
      <activation>
        <os>
          <family>windows</family>
        </os>
      </activation>
      <properties>
        <executable-suffix>.exe</executable-suffix>
      </properties>
    </profile>
    <profile>
      <id>release</id>
      <build>
        <plugins>
          <plugin>
            <groupId>org.jreleaser</groupId>
            <artifactId>jreleaser-maven-plugin</artifactId>
            <version>0.9.1</version>
            <configuration>
              <jreleaser>
                <!--project>
                 <description>app - Sample Quarkus CLI application</description>
                 <website>https://github.com/aalmiray/app</website>
                 <docsUrl>https://github.com/aalmiray/app</docsUrl>
                 <license>APACHE-2.0</license>
                 <authors>Andres Almiray</authors>
                 <copyright>2021 Kordamp</copyright>
                </project-->
                <release>
                  <github>
                    <changelog>
                      <formatted>ALWAYS</formatted>
                      <preset>conventional-commits</preset>
                    </changelog>
                  </github>
                </release>
                <distributions>
                  <app>
                    <type>NATIVE_IMAGE</type>
                    <brew>
                      <active>ALWAYS</active>
                    </brew>
                    <artifacts>
                      <artifact>
                        <path>${distribution.directory}/{{distributionName}}-{{projectVersion}}-linux-x86_64.tar.gz</path>
                        <platform>linux-x86_64</platform>
                      </artifact>
                      <artifact>
                        <path>${distribution.directory}/{{distributionName}}-{{projectVersion}}-windows-x86_64.zip</path>
                        <platform>windows-x86_64</platform>
                      </artifact>
                      <artifact>
                        <path>${distribution.directory}/{{distributionName}}-{{projectVersion}}-osx-x86_64.zip</path>
                        <platform>osx-x86_64</platform>
                      </artifact>
                    </artifacts>
                  </app>
                </distributions>
              </jreleaser>
            </configuration>
          </plugin>
        </plugins>
      </build>
    </profile>
  </profiles>
</project>