Quarkus 3 の Alpha 版がリリースされていたので、既存の Quarkus 2 のプロジェクトをマイグレーションしてみました。
この記事は現時点(3.0.0.Alpha4)で確認した内容です。Final リリース時には変更される可能性があります。
Quarkus 3 の目玉機能はいくつかありますが、とりあえず Jakarta EE 10 対応が入ったのでマイグレーションが必要です。 javax
から jakarta
に import 文を書き換えてあげる必要があります。
書き換えを自動で行うレシピを用意してくれているので、下記の記事を参考にコマンド実行すれば大丈夫・・・のはずだったのですが、ちょうど移行作業中だったようなので少し調整が必要でした。
上記記事に記載されていたコマンドを修正したものです。
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)