Quarkus 3 にアップグレードしてみる


Quarkus 3 の Alpha 版がリリースされていたので、既存の Quarkus 2 のプロジェクトをマイグレーションしてみました。

この記事は現時点(3.0.0.Alpha4)で確認した内容です。Final リリース時には変更される可能性があります。

Quarkus 3 の目玉機能はいくつかありますが、とりあえず Jakarta EE 10 対応が入ったのでマイグレーションが必要です。 javax から jakarta に import 文を書き換えてあげる必要があります。

書き換えを自動で行うレシピを用意してくれているので、下記の記事を参考にコマンド実行すれば大丈夫・・・のはずだったのですが、ちょうど移行作業中だったようなので少し調整が必要でした。

Starting Quarkus 3 – Quarkus

上記記事に記載されていたコマンドを修正したものです。

curl -o quarkus3.yml "https://raw.githubusercontent.com/quarkusio/quarkus/3.0.0.Alpha4/jakarta/quarkus3.yml"

# Linux の場合
mvn org.openrewrite.maven:rewrite-maven-plugin:4.39.0:run \
  -Drewrite.configLocation=quarkus3.yml \
  -DactiveRecipes=io.quarkus.openrewrite.Quarkus3

# Windows (PowerShell) の場合
mvn org.openrewrite.maven:rewrite-maven-plugin:4.39.0:run `
  "-Drewrite.configLocation=quarkus3.yml" `
  "-DactiveRecipes=io.quarkus.openrewrite.Quarkus3"

Windows 用のコマンドの書き換えについては「ドキュメントに書いてあるコマンドが動かない時(Windows)」も参考にしてみてください。

つまづいたポイントとしては、

  • マルチモジュールの場合は quarkus3.yml をフルパスに置き換えます
  • pom.xml の Quarkus のバージョン指定は 2 のままで実行します

Quarkus 以外で対応したこと

javax から jakarta に変更されたので、他のライブラリもアップデートしなければいけません。

今回アップグレードしたプロジェクトは、 ほぼ Quarkus で作成していたので大きな変更は必要ありませんでした。

対応したのは mapstruct のオプション -Amapstruct.defaultComponentModel=cdi-Amapstruct.defaultComponentModel=jakarta に変更したのと、 フォーマッタの import の順序指定を変更したくらいです。

  <plugin>
    <artifactId>maven-compiler-plugin</artifactId>
    <!-- ... -->
    <configuration>
      <!-- ... -->
      <compilerArgs>
        <!-- ... -->
-       <arg>-Amapstruct.defaultComponentModel=cdi</arg>
+       <arg>-Amapstruct.defaultComponentModel=jakarta</arg>
      </compilerArgs>
    </configuration>
  </plugin>
  <plugin>
    <groupId>com.diffplug.spotless</groupId>
    <artifactId>spotless-maven-plugin</artifactId>
    <!-- ... -->
    <configuration>
      <!-- ... -->
      <java>
        <importOrder>
          <wildcardsLast>false</wildcardsLast>
-         <order>java,javax,io.quarkus,com.zu_min,</order>
+         <order>java,jakarta,io.quarkus,com.zu_min,</order>
        </importOrder>
      </java>
    </configuration>
  </plugin>

Panache まわりの変更

@ReactiveTransactional が非推奨となり、 @WithTransaction, @WithSession, @WithSessionOnDemand追加されました。Uni を返すメソッドのみ使用可能なアノテーションです。使い方についてはドキュメントに書かれています。

他に CDI による Hibernate Reactive の Session 注入について、 @Inject Mutiny.Session session; のような書き方で動いていた1もしかしたら間違った書き方だったのかもしれないのですが、これができなくなりました 。@Inject Uni<Mutiny.Session> session; と書く必要があります。2.7 のドキュメントの時点でそう書かれていました2今回はバージョン 2.5 から一気に上げました。または Panache の Panache.getSession() を利用できます。

Hibernate Reactive で .subscribe().withSubscriber(UniAssertSubscriber.create()) のようなブロッキングするテストが動かなくなっていました。 UniAsserter を使って、 Vertx コンテキスト上で動作するように書き換える必要があるようです。UniAsserter@TestReactiveTransaction または @RunOnVertxContext アノテーションを付けたテストメソッドで使用可能です。

私のプロジェクトでの変更内容は以下のリンクから確認できます。

Quarkus3 を導入してみる by zu-min-g · Pull Request #103 · zu-min-g/playground-quarkus (github.com)


コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください