【令和6年最新版】JBoss EAP 7.4からJBoss EAP 8.0への移行

画像提供:もりわかさん

OpenShift SSA の瀬戸です。

JBoss EAP 8がリリースされてから4ヶ月がたちました。8.0.1パッチも提供され、そろそろ移行をお考えの方もいらっしゃるのではないでしょうか。

以前、JBoss EAP 7.x から JBoss EAP 8-Beta への移行方法という翻訳記事でベータバージョンでの移行方法を紹介しましたが、1年以上の時間が経ち、状況が変わってきてしまっているのであらためて移行方法をまとめたいと思います。

この時に使用したMigration Toolkit for Runtimes(以下MTR)の廃止が決まっており、更新がされなくなってしまっており、最新のアップストリームの更新がとりこまれていません。そのため、最新の情報を扱えなくなっています。 そこで、今回はアップストリームのWindupを使用して修正個所の特定をしていきます。

windup.github.io

さらに、JBoss EAPは標準のJakarta EE仕様に準拠しているため、Red Hatが関与していないOSSを使う事でも移行を行うことができます。今回は、Eclipse Transformer を使って、ユーザーアプリケーションを移行します。

projects.eclipse.org

この記事では以下の順番で移行の説明をしていきます。

  1. JBoss EAP 7.4環境のセットアップ
  2. JBoss サーバー移行ツール(JBoss Server Migration Tool)を使ってのサーバー構成の移行
  3. Windupを使用しての移行箇所の特定
  4. Eclipse Transformerを使ってのユーザーアプリケーションの修正

この記事では以下のツールを使用しています。

また、Red Hatアカウントを必要とします。Red Hatアカウントを持っていない場合は、Red Hat Developer Programに参加することで作成できますので、先に参加してください。

rheb.hatenablog.com

注意: Red HatではアップストリームのOSSの直接のサポートは行っておりません。ただし、今回の内容で移行した後の本番環境でのサポートなどは承っています。また、移行に対するご不明点がある場合は弊社営業もしくはパートナー企業にお問い合わせください。

JBoss EAP 7.4環境のセットアップ

サーバー構成(standalone.xmlなど)の移行についてはベータ版から変更はありません。引き続き同じ方法が使用できます。ここでは、古いEAP7.4用のサンプルアプリケーションのデプロイも兼ねてEAP7.4のサーバーをセットアップし、その内容をそのままEAP 8.0へ移行します。

PostgreSQL のセットアップ

今回のアプリケーションではPostgreSQLを使用しているので、PodmanでPosgtreSQLを実行します。

コマンドプロンプトを開いて以下のコマンドを入力します。

podman image pull docker.io/postgres
podman run --name postgres -e POSTGRES_PASSWORD=postgres -p 5432:5432 -d postgres

※PostgreSQLのユーザー名、パスワードとしてそれぞれpostgresを、待ち受けポートとして5432が使用されています。

※今回起動したPostgreSQLは最後で削除します。削除しない場合はリソースを消費し続けます。

また、PostgreSQLのJDBCドライバをダウンロードして、ローカルに保存しておきます。 以下からダウンロードできる最新版を使用してください。

jdbc.postgresql.org

JBoss EAPサーバーのセットアップ

JBoss EAP 7.4 zip ディストリビューションをダウンロードします。ディストリビューションをローカルフォルダー(例: C:\apps\jboss\jboss-eap-7.4) に解凍します。

developers.redhat.com

EAP 7.4ダウンロード

コマンドプロンプトからEAP_HOME 環境変数を設定して、JBoss EAP 7.4を起動します。サーバー構成ファイルとしてはstandalone-full.xmlを指定します。

set EAP_HOME=C:\apps\jboss\jboss-eap-7.4
%EAP_HOME%\bin\standalone.bat --server-config=standalone-full.xml

十分なCPU、メモリが積まれている場合は10秒以内に起動します。 このあと、このコマンドプロンプトは開きっぱなしにしておいてください。

もう一つコマンドプロンプトを開いて、管理CLI (jboss-cli)を起動します。

set EAP_HOME=C:\apps\jboss\jboss-eap-7.4
%EAP_HOME%\bin\jboss-cli --connect

管理CLI からtopicの追加とJDBCドライバのインストールを行います。

※<PATH_TO_JDBC_DRIVER>\postgresql-XX.X.X.jar はpostgresの設定時にダウンロードしたpostgresqlのドライバを指定してください。

jms-topic add --topic-address=orders --entries=[/topic/orders]

module add --name=org.postgres --resources=<PATH_TO_JDBC_DRIVER>\postgresql-XX.X.X.jar --dependencies=javax.api,javax.transaction.api
/subsystem=datasources/jdbc-driver=postgres:add(driver-module-name=org.postgres, driver-name=postgres)

data-source add --name=postgresDS --jndi-name=java:jboss/datasources/CoolstoreDS \
--driver-name=postgres \
--connection-url=jdbc:postgresql://localhost:5432/postgres \
--user-name=postgres --password=postgres

これでサーバーの設定が終わったので、アプリケーションのデプロイを行います。 以下のリポジトリからソースコードをダウンロードします。

github.com

このリポジトリにはRed Hatがワークショップで使用するcoolstoreというアプリケーションをJBoss EAP 7.4とJBoss EAP 8.0で動作できるように変更したものが含まれています。 今回はそのうちJBoss EAP 7.4で動作するものを使用します。

コマンドプロンプトを使用して mtr-example-eap7.4to8.0\eap7.4\coolstoreに移動してMavenを使用してコンパイル、デプロイを行います。

mvn package
mvn wildfly:deploy

※コンパイルに失敗する場合は、インターネットにつながっているか、OpenJDKのバージョンは17を使用しているかを確認してみてください。

※デプロイに失敗する場合はPostgreSQLが起動しているか、topic、jdbcドライバの設定を行っているかを確認してください。

デプロイに成功すると、 http://localhost:8080/ にアクセスすることで、以下のような画面を表示することができます。

EAP7.4 coolstore

これでEAP7.4上で動くアプリケーションのセットアップは終了です。

管理CLIを起動していたコマンドプロンプトを閉じます。

JBoss EAP 7.4を起動した最初のコマンドプロンプトでCTRL+Cを押してサーバーを停止します。そのあとバッチジョブを終了するか聞かれるのでYを押してください。

JBoss EAPを起動していたコマンドプロンプトとコンパイルを行ったコマンドプロンプトはこの後も使用するため、そのままにしておきます。

JBoss サーバー移行ツール(JBoss Server Migration Tool)を使ってのサーバー構成の移行

最初にJBoss EAP 8.0本体とJBoss サーバー移行ツール(JBoss Server Migration Tool)をダウンロードしてきます。

JBoss EAP 8.0.0 zip ディストリビューションをダウンロードします。ディストリビューションをローカルフォルダー(例: C:\apps\jboss\jboss-eap-8.0) に解凍します。

jboss-eap-8.0.0-server-migration zip ファイルをダウンロードします。ファイルをローカルフォルダー(例: C:\apps\jboss\jboss-eap-8.0\jboss-server-migration) に解凍します。Server Migration と書かれたリンクからダウンロードすることが可能です。

developers.redhat.com

JBoss EAP 8.0ダウンロード

※注意: JBoss Server Migration Toolは以前においてはJBoss EAP本体と一緒に配布されていましたが、このバージョンから別個に配布されるようになりました。

移行を始めるために、移行前の環境と移行後の環境がわかるように環境変数を設定します。

前の手順で設定したEAP7.4のフォルダをEAP_PREVIOUS_HOMEにし、EAP_HOME にEAP8.0のフォルダを設定します。

# set EAP_HOME=C:\apps\jboss\jboss-eap-7.4
set EAP_PREVIOUS_HOME=%EAP_HOME%
set EAP_HOME=C:\apps\jboss\jboss-eap-8.0

JBoss Server Migration Toolを使って先ほどstandalone-full.xmlを使って起動したJBoss EAP7.4の設定を移行します。設定した内容はstandalone-full.xmlに含まれています。これを使う事でデータベース用のドライバや、topicの設定などが移行されます。

※JBoss Server Migration ToolはEAP 7.4にも同梱されていますが、EAP 8.0のものを使用してください。EAP 7.4に同梱されているものはEAP 8.0への移行がサポートされていません。

※今回はJDBCドライバをそのまま移行していますが、実運用環境ではデータベースの移行を伴う場合があり、その場合はJDBCドライバのバージョンアップが必要になります。

%EAP_HOME%\jboss-server-migration\jboss-server-migration -s %EAP_PREVIOUS_HOME% -t %EAP_HOME%

サーバー移行ツールは、移行プロセス中にいくつかの質問をします。

----------------------------------------------------------
----  JBoss Server Migration Tool  -----------------------
----------------------------------------------------------

Retrieving servers...
 INFO  SOURCE server name: JBoss EAP, version: 7.4.0.GA.
 INFO  TARGET server name: JBoss EAP, version: 8.0.0.GA.

----------------------------------------------------------
----------------------------------------------------------

Server migration starting...

 INFO  --- Migrating modules requested by environment...

 INFO  No modules to migrate.

Migrate the source's standalone server?
yes/no?

standalone-full.xmlはstandalone serverに含まれるので[yes]を指定します。

 INFO  --- Migrating standalone server...

 INFO  Source's standalone content migrated.

 INFO  Source's standalone configurations found: [standalone-full-ha.xml, standalone-full.xml, standalone-ha.xml, standalone-load-balancer.xml, standalone.xml]

Migrate all configurations?
yes/no?

standalone-full.xmlのみを移行したいので[no]を指定します。

Migrate configuration standalone-full-ha.xml ?
yes/no?

standalone-full.xmlのみを移行したいので[no]を指定します。

Migrate configuration standalone-full.xml ?
yes/no?

standalone-full.xmlを移行したいので[yes]を指定します。

 INFO  Migrating standalone configuration standalone-full.xml...
 WARN  Management Interface http-interface is secured by legacy security realm ManagementRealm, and its configuration will be changed to use the target's server Elytron matching functionally configured by default, which may require additional Elytron manual configuration.
 INFO  Legacy security XML configuration retrieved.
 INFO  Unsupported extensions removed: [org.jboss.as.jsr77, org.jboss.as.security]
 INFO  Unsupported subsystems removed: [urn:jboss:domain:jsr77:1.0, urn:jboss:domain:security:2.0]
 INFO  Referenced paths migrated.
 INFO  Legacy security realms removed from XML configuration.
 WARN  Migrated Remoting subsystem's http connector resource /subsystem/remoting/http-connector/http-remoting-connector using a legacy security-realm, to Elytron's default application SASL Authentication Factory migration-defaultApplicationSaslAuthenticationFactory. Please note that further manual Elytron configuration may be needed if the legacy security realm being used was not the source server's default Application Realm configuration!
 WARN  Migrated Undertow subsystem https-listener resource /subsystem/undertow/server/default-server/https-listener/https using a legacy security-realm, to Elytron's default TLS ServerSSLContext migration-defaultTLSServerSSLContext. Please note that further manual Elytron configuration may be needed if the legacy security realm being used was not the source server's default Application Realm configuration!
 WARN  Migrated Undertow subsystem http-invoker resource /subsystem/undertow/server/default-server/host/default-host/setting/http-invoker using a legacy security-realm, to Elytron's default Application HTTP AuthenticationFactory migration-defaultApplicationHttpAuthenticationFactory. Please note that further manual Elytron configuration may be needed if the legacy security realm being used was not the source server's default Application Realm configuration!
 INFO  Legacy security realms migrated to Elytron.
 WARN  Migrated management interface http-interface secured by a legacy security-realm, to Elytron's default Management HTTP AuthenticationFactory migration-defaultManagementHttpAuthenticationFactory. Please note that further manual Elytron configuration may be needed if the legacy security realm being used was not the source server's default Application Realm configuration!
 WARN  Migrated ejb3 subsystem resource /subsystem/ejb3/application-security-domain/other using legacy security domain other, to Elytron's default application Security Domain. Please note that further manual Elytron configuration may be needed if the legacy security domain being used was not the source server's default Application Domain configuration!
 WARN  Migrated undertow subsystem resource /subsystem/undertow/application-security-domain/other using legacy security domain other, to Elytron's default application Security Domain. Please note that further manual Elytron configuration may be needed if the legacy security domain being used was not the source server's default Application Domain configuration!
 WARN  Migrated messaging-activemq subsystem server resource /subsystem/messaging-activemq/server/default, to Elytron's default application Security Domain. Please note that further manual Elytron configuration may be needed if the legacy security domain being used was not the source server's default Application Domain configuration!
 WARN  Migrated iiop-openjdk subsystem resource using legacy security domain to Elytron defaults. Please note that further manual Elytron configuration should be needed!
 INFO  Persistent deployments found: [ROOT.war]

This tool is not able to assert if persistent deployments found are compatible with the target server, skip persistent deployments migration?
yes/no?

永続化のデプロイメント(persistent deployments)の互換性が確認できないと表示されますが、今回は[no]を指定して無理やり移行します。これに関しては後程アプリケーションの修正時に解消します。

 INFO  Persistent deployment ROOT.war migrated.

Migrate configuration standalone-ha.xml ?
yes/no?

standalone-full.xmlのみを移行したいので[no]を指定します。

Migrate configuration standalone-load-balancer.xml ?
yes/no?

standalone-full.xmlのみを移行したいので[no]を指定します。

Migrate configuration standalone.xml ?
yes/no?

standalone-full.xmlのみを移行したいので[no]を指定します。

Migrate the source's managed domain?
yes/no?

standalone-full.xmlのみを移行したいので[no]を指定します。

Server migration done.

 INFO
----------------------------------------------------------------------------------------------------------
 Task Summary
----------------------------------------------------------------------------------------------------------

 server .......................................................................................... SUCCESS
  standalone ..................................................................................... SUCCESS
   contents.standalone.migrate-content-dir ....................................................... SUCCESS
    contents.standalone.migrate-content(path=8a\f9d271e002eb6e298dffb3aace5d40bf8a0395\content) .. SUCCESS
   standalone-configurations ..................................................................... SUCCESS
    standalone-configuration(source=standalone-full.xml) ......................................... SUCCESS

----------------------------------------------------------------------------------------------------------
 Migration Result: SUCCESS
----------------------------------------------------------------------------------------------------------

続行するには何かキーを押してください . . .

SUCCESSが表示されたら、サーバー構成の移行は完了です。JBoss EAP 8.0のサーバーを起動します。

%EAP_HOME%\bin\standalone.bat --server-config=standalone-full.xml

※EAP_HOMEにはJBoss EAP 8.0のフォルダが入っているはずです。

起動中にいくつかのスタックトレースが表示されたのが確認できると思います。 実際にアプリケーションにアクセスするとエラーになります。

現時点ではエラー

※リロードをしてもエラーにならない場合はJBoss EAP 7.4のサーバーが正しくシャットダウンされていることと、JBoss EAP 8.0のサーバーを起動していることを確認してください。

ちなみに、このサーバーマイグレーションツールでは、keycloakサブシステムの置き換えも行ってくれます。

EAP 7.4までは実はこのサーバーマイグレーションツールを使うだけで移行が完了してしまう場合もありました。しかし、EAP 7.4からEAP 8.0のアップデートではそれだけで移行できることはほぼありません。

EAP 7.4からEAP 8.0の間でパッケージ名の変更が行われています。Java EE仕様のOracleからEclipse Foundationへの移管に伴う影響です。

そのためアプリケーションの変更が必要になります。 このあとはアプリケーションの変更をしていきます。

最後にEAP 8.0 を起動しているコマンドプロンプト上でCTRL-Cを押して、サーバーをシャットダウンします。

Windupを使用しての移行箇所の特定

EAP 7.4からEAP 8.0に移行する際にアプリケーションで変更するべき点については、広く知られています。

Red Hatにおいても記事を作成しており、どういう修正をすればいいのかを見つけ出すのは容易です。また、この後使用するEclipse Transformerは多くの修正点を自動的に直してしまうこともできます。 しかしながら、自動的には直せない修正点があったり、作業前にどれくらいの作業が必要なのかを見積もる必要がある場合があったりする場合もあります。

そのようなときにRed Hatでは Migration Toolkit for Applications を用意しています。 しかし、実は現時点ではMigration Toolkit for Applicationsは現在大きく改修中で、最新版の状況が取り込まれていません。*1

そのため、今回はUpstreamであるWindupを使用して修正個所の洗い出しを行います。

※単純に移行をしたいだけの場合はこの手順は必須ではありません。

WindupのCLI(windup-cli-X.X.X.Final-offline.zip)をダウンロードします。

https://windup.github.io/downloads/

Windupダウンロード

zipファイルを解凍したら、binの下にある windup-cli.bat に3つの引数を付けて起動します。

  • --input ソースコードのおかれたフォルダ
  • --output 修正個所の洗い出し結果を保存するフォルダ
  • --target 移行する対象のアーキテクチャとバージョン(今回はeap:8固定)

例): windup-cli --input C:\Users\megas\git\mtr-example-eap7.4to8.0\eap7.4\coolstore --output C:\Users\megas\git\mtr-example-eap7.4to8.0\output --target eap:8

実行すると少し時間がかかった後に修正個所の一覧が出力されたURLが表示されます。

windup実行結果

URLを開くことで、修正が必要な個所の一覧が表示されます。

Windup画面

アプリケーションの名前(今回はcoolstore) → Issuesを順に選択することで修正が必要な個所の詳細を一覧表示することもできます。

修正が必要な個所の一覧

ここでは具体的にどのような修正が必要なのかの詳細については説明しません。ほとんどの修正はこの後のEclipse Transformerの実行で解決できてしまうからです。

現時点ではすべての修正個所を漏れなく検出、移行してくれるツールは存在しないので、いくつかの移行ツールを併用することをお勧めします。 その中で、Windup(もしくはMTA)は検出のみを行い、対象への変更をしないようにすることもできるため、併用がしやすくなっています。

Eclipse Transformerを使ってのユーザーアプリケーションの修正

ここからユーザーアプリケーションの修正を行っていきます。EAP 7.4からEAP8.0への移行はサードパーティの依存ライブラリを使用していない場合は一部を除いて自動的に行えるようになっています。

ここでは、Eclipse Transformerを使ってほとんどの修正を行った後に、移行できなかった場所を個別で変更していきます。

Eclipse TransformerはEAP 7.4が準拠しているJakarta EE 8からEAP 8.0が準拠しているJakarta EE 10の間に発生したパッケージ名、ネームスペースの変更に対応してくれます。すべてのケースに対応できるわけではありませんが、おおよそ変換してくれます。 1から全部を対応するよりはずっと楽になりますので、こういったツールを使うようにしてください。なお、パッケージ名の変更としてjavax->jakartaへの変更が行われたことはよく知られていますが、変更が必要ないパッケージを変更してしまう可能性があるので、手動で対応するのはお勧めできません。

JBoss EAPが準拠しているJakarta EE(Java EE)は多くのベンダー製アプリケーションサーバーが準拠しており、多くのサードパーティ製ツールが存在します。それらをうまく組み合わせていくことで、やりたいことが簡単に出来るようになります。

Eclipse Transformerをダウンロードします。現在の最新版は0.5.0です。

projects.eclipse.org

Downloadsから追っていくことでダウンロードできますが、複雑なので、mavenリポジトリから直接ファイルをダウンロードします。

https://repo.maven.apache.org/maven2/org/eclipse/transformer/org.eclipse.transformer.cli/0.5.0/org.eclipse.transformer.cli-0.5.0-distribution.jar

これは拡張子がjarとなっていますが、実態はzipファイルで、一度解凍する必要があります。*2

解凍すると次のようなフォルダ構成になっています。

eclipse transformerのフォルダ構成

org.eclipse.transformer.cli-0.5.0.jarに移行するプロジェクトのフォルダと変換されたファイルの出力先を引数として渡して実行します。

java -jar <PATH_TO_CLI>\org.eclipse.transformer.cli-0.5.0.jar <INPUT> <OUTPUT>

例)

java -jar C:\apps\org.eclipse.transformer.cli-0.5.0-distribution\org.eclipse.transformer.cli-0.5.0.jar C:\Users\megas\git\mtr-example-eap7.4to8.0\eap7.4\coolstore C:\Users\megas\git\mtr-example-eap7.4to8.0\output

実行すると変換が行われ、すぐに終了します。

Copyright (c) Contributors to the Eclipse Foundation
org.eclipse.transformer.cli.JakartaTransformerCLI Version [ 0.5.0 ]

[main] INFO Transformer - Input [ C:\Users\megas\git\mtr-example-eap7.4to8.0\eap7.4\coolstore ]
[main] INFO Transformer - Output [ C:\Users\megas\git\mtr-example-eap7.4to8.0\output ]
[main] INFO Transformer - Properties [ RULES_SELECTIONS ] URL [ jar:file:/C:/apps/org.eclipse.transformer.cli-0.5.0-distribution/libs/org.eclipse.transformer.jakarta-0.5.0.jar!/org/eclipse/transformer/jakarta/jakarta-selection.properties ]
[main] INFO Transformer - Properties [ RULES_RENAMES ] URL [ jar:file:/C:/apps/org.eclipse.transformer.cli-0.5.0-distribution/libs/org.eclipse.transformer.jakarta-0.5.0.jar!/org/eclipse/transformer/jakarta/jakarta-renames.properties ]
[main] INFO Transformer - Properties [ RULES_VERSIONS ] URL [ jar:file:/C:/apps/org.eclipse.transformer.cli-0.5.0-distribution/libs/org.eclipse.transformer.jakarta-0.5.0.jar!/org/eclipse/transformer/jakarta/jakarta-versions.properties ]
[main] INFO Transformer - Properties [ RULES_BUNDLES ] URL [ jar:file:/C:/apps/org.eclipse.transformer.cli-0.5.0-distribution/libs/org.eclipse.transformer.jakarta-0.5.0.jar!/org/eclipse/transformer/jakarta/jakarta-bundles.properties ]
[main] INFO Transformer - Properties [ RULES_DIRECT ] URL [ jar:file:/C:/apps/org.eclipse.transformer.cli-0.5.0-distribution/libs/org.eclipse.transformer.jakarta-0.5.0.jar!/org/eclipse/transformer/jakarta/jakarta-direct.properties ]
[main] INFO Transformer - Properties [ RULES_MASTER_TEXT ] URL [ jar:file:/C:/apps/org.eclipse.transformer.cli-0.5.0-distribution/libs/org.eclipse.transformer.jakarta-0.5.0.jar!/org/eclipse/transformer/jakarta/jakarta-text-master.properties ]
[main] INFO Transformer - Package renames are in use
[main] INFO Transformer - Package versions will be updated
[main] INFO Transformer - Bundle identities will be updated
[main] INFO Transformer - Properties [ Substitutions matching [ application-client.xml ] ] URL [ jar:file:/C:/apps/org.eclipse.transformer.cli-0.5.0-distribution/libs/org.eclipse.transformer.jakarta-0.5.0.jar!/org/eclipse/transformer/jakarta/jakarta-application-xml.properties ]
[main] INFO Transformer - Properties [ Substitutions matching [ application-client.xml ] ] URL [ jar:file:/C:/apps/org.eclipse.transformer.cli-0.5.0-distribution/libs/org.eclipse.transformer.jakarta-0.5.0.jar!/org/eclipse/transformer/jakarta/jakarta-direct.properties ]
[main] INFO Transformer - Properties [ Substitutions matching [ application-client.xml ] ] URL [ jar:file:/C:/apps/org.eclipse.transformer.cli-0.5.0-distribution/libs/org.eclipse.transformer.jakarta-0.5.0.jar!/org/eclipse/transformer/jakarta/jakarta-renames.properties ]
[main] INFO Transformer - Properties [ Substitutions matching [ persistence.xml ] ] URL [ jar:file:/C:/apps/org.eclipse.transformer.cli-0.5.0-distribution/libs/org.eclipse.transformer.jakarta-0.5.0.jar!/org/eclipse/transformer/jakarta/jakarta-persistence-xml.properties ]
[main] INFO Transformer - Properties [ Substitutions matching [ persistence.xml ] ] URL [ jar:file:/C:/apps/org.eclipse.transformer.cli-0.5.0-distribution/libs/org.eclipse.transformer.jakarta-0.5.0.jar!/org/eclipse/transformer/jakarta/jakarta-direct.properties ]
[main] INFO Transformer - Properties [ Substitutions matching [ persistence.xml ] ] URL [ jar:file:/C:/apps/org.eclipse.transformer.cli-0.5.0-distribution/libs/org.eclipse.transformer.jakarta-0.5.0.jar!/org/eclipse/transformer/jakarta/jakarta-renames.properties ]
[main] INFO Transformer - Properties [ Substitutions matching [ web.xml ] ] URL [ jar:file:/C:/apps/org.eclipse.transformer.cli-0.5.0-distribution/libs/org.eclipse.transformer.jakarta-0.5.0.jar!/org/eclipse/transformer/jakarta/jakarta-web-xml.properties ]
[main] INFO Transformer - Properties [ Substitutions matching [ web.xml ] ] URL [ jar:file:/C:/apps/org.eclipse.transformer.cli-0.5.0-distribution/libs/org.eclipse.transformer.jakarta-0.5.0.jar!/org/eclipse/transformer/jakarta/jakarta-direct.properties ]
[main] INFO Transformer - Properties [ Substitutions matching [ web.xml ] ] URL [ jar:file:/C:/apps/org.eclipse.transformer.cli-0.5.0-distribution/libs/org.eclipse.transformer.jakarta-0.5.0.jar!/org/eclipse/transformer/jakarta/jakarta-renames.properties ]
[main] INFO Transformer - Properties [ Substitutions matching [ beans.xml ] ] URL [ jar:file:/C:/apps/org.eclipse.transformer.cli-0.5.0-distribution/libs/org.eclipse.transformer.jakarta-0.5.0.jar!/org/eclipse/transformer/jakarta/jakarta-beans-xml.properties ]
[main] INFO Transformer - Properties [ Substitutions matching [ beans.xml ] ] URL [ jar:file:/C:/apps/org.eclipse.transformer.cli-0.5.0-distribution/libs/org.eclipse.transformer.jakarta-0.5.0.jar!/org/eclipse/transformer/jakarta/jakarta-direct.properties ]
[main] INFO Transformer - Properties [ Substitutions matching [ beans.xml ] ] URL [ jar:file:/C:/apps/org.eclipse.transformer.cli-0.5.0-distribution/libs/org.eclipse.transformer.jakarta-0.5.0.jar!/org/eclipse/transformer/jakarta/jakarta-renames.properties ]
[main] INFO Transformer - Properties [ Substitutions matching [ *.faces-config.xml ] ] URL [ jar:file:/C:/apps/org.eclipse.transformer.cli-0.5.0-distribution/libs/org.eclipse.transformer.jakarta-0.5.0.jar!/org/eclipse/transformer/jakarta/jakarta-faces-config-xml.properties ]
[main] INFO Transformer - Properties [ Substitutions matching [ *.faces-config.xml ] ] URL [ jar:file:/C:/apps/org.eclipse.transformer.cli-0.5.0-distribution/libs/org.eclipse.transformer.jakarta-0.5.0.jar!/org/eclipse/transformer/jakarta/jakarta-direct.properties ]
[main] INFO Transformer - Properties [ Substitutions matching [ *.faces-config.xml ] ] URL [ jar:file:/C:/apps/org.eclipse.transformer.cli-0.5.0-distribution/libs/org.eclipse.transformer.jakarta-0.5.0.jar!/org/eclipse/transformer/jakarta/jakarta-renames.properties ]
[main] INFO Transformer - Properties [ Substitutions matching [ *.taglib.xml ] ] URL [ jar:file:/C:/apps/org.eclipse.transformer.cli-0.5.0-distribution/libs/org.eclipse.transformer.jakarta-0.5.0.jar!/org/eclipse/transformer/jakarta/jakarta-renames.properties ]
[main] INFO Transformer - Properties [ Substitutions matching [ application.xml ] ] URL [ jar:file:/C:/apps/org.eclipse.transformer.cli-0.5.0-distribution/libs/org.eclipse.transformer.jakarta-0.5.0.jar!/org/eclipse/transformer/jakarta/jakarta-application-xml.properties ]
[main] INFO Transformer - Properties [ Substitutions matching [ application.xml ] ] URL [ jar:file:/C:/apps/org.eclipse.transformer.cli-0.5.0-distribution/libs/org.eclipse.transformer.jakarta-0.5.0.jar!/org/eclipse/transformer/jakarta/jakarta-direct.properties ]
[main] INFO Transformer - Properties [ Substitutions matching [ application.xml ] ] URL [ jar:file:/C:/apps/org.eclipse.transformer.cli-0.5.0-distribution/libs/org.eclipse.transformer.jakarta-0.5.0.jar!/org/eclipse/transformer/jakarta/jakarta-renames.properties ]
[main] INFO Transformer - Properties [ Substitutions matching [ *.tld ] ] URL [ jar:file:/C:/apps/org.eclipse.transformer.cli-0.5.0-distribution/libs/org.eclipse.transformer.jakarta-0.5.0.jar!/org/eclipse/transformer/jakarta/jakarta-direct.properties ]
[main] INFO Transformer - Properties [ Substitutions matching [ *.tld ] ] URL [ jar:file:/C:/apps/org.eclipse.transformer.cli-0.5.0-distribution/libs/org.eclipse.transformer.jakarta-0.5.0.jar!/org/eclipse/transformer/jakarta/jakarta-renames.properties ]
[main] INFO Transformer - Properties [ Substitutions matching [ ra.xml ] ] URL [ jar:file:/C:/apps/org.eclipse.transformer.cli-0.5.0-distribution/libs/org.eclipse.transformer.jakarta-0.5.0.jar!/org/eclipse/transformer/jakarta/jakarta-ra-xml.properties ]
[main] INFO Transformer - Properties [ Substitutions matching [ ra.xml ] ] URL [ jar:file:/C:/apps/org.eclipse.transformer.cli-0.5.0-distribution/libs/org.eclipse.transformer.jakarta-0.5.0.jar!/org/eclipse/transformer/jakarta/jakarta-direct.properties ]
[main] INFO Transformer - Properties [ Substitutions matching [ ra.xml ] ] URL [ jar:file:/C:/apps/org.eclipse.transformer.cli-0.5.0-distribution/libs/org.eclipse.transformer.jakarta-0.5.0.jar!/org/eclipse/transformer/jakarta/jakarta-renames.properties ]
[main] INFO Transformer - Properties [ Substitutions matching [ *.tag ] ] URL [ jar:file:/C:/apps/org.eclipse.transformer.cli-0.5.0-distribution/libs/org.eclipse.transformer.jakarta-0.5.0.jar!/org/eclipse/transformer/jakarta/jakarta-direct.properties ]
[main] INFO Transformer - Properties [ Substitutions matching [ *.tag ] ] URL [ jar:file:/C:/apps/org.eclipse.transformer.cli-0.5.0-distribution/libs/org.eclipse.transformer.jakarta-0.5.0.jar!/org/eclipse/transformer/jakarta/jakarta-renames.properties ]
[main] INFO Transformer - Properties [ Substitutions matching [ faces-config.xml ] ] URL [ jar:file:/C:/apps/org.eclipse.transformer.cli-0.5.0-distribution/libs/org.eclipse.transformer.jakarta-0.5.0.jar!/org/eclipse/transformer/jakarta/jakarta-faces-config-xml.properties ]
[main] INFO Transformer - Properties [ Substitutions matching [ faces-config.xml ] ] URL [ jar:file:/C:/apps/org.eclipse.transformer.cli-0.5.0-distribution/libs/org.eclipse.transformer.jakarta-0.5.0.jar!/org/eclipse/transformer/jakarta/jakarta-direct.properties ]
[main] INFO Transformer - Properties [ Substitutions matching [ faces-config.xml ] ] URL [ jar:file:/C:/apps/org.eclipse.transformer.cli-0.5.0-distribution/libs/org.eclipse.transformer.jakarta-0.5.0.jar!/org/eclipse/transformer/jakarta/jakarta-renames.properties ]
[main] INFO Transformer - Properties [ Substitutions matching [ ejb-jar.xml ] ] URL [ jar:file:/C:/apps/org.eclipse.transformer.cli-0.5.0-distribution/libs/org.eclipse.transformer.jakarta-0.5.0.jar!/org/eclipse/transformer/jakarta/jakarta-ejb-jar-xml.properties ]
[main] INFO Transformer - Properties [ Substitutions matching [ ejb-jar.xml ] ] URL [ jar:file:/C:/apps/org.eclipse.transformer.cli-0.5.0-distribution/libs/org.eclipse.transformer.jakarta-0.5.0.jar!/org/eclipse/transformer/jakarta/jakarta-direct.properties ]
[main] INFO Transformer - Properties [ Substitutions matching [ ejb-jar.xml ] ] URL [ jar:file:/C:/apps/org.eclipse.transformer.cli-0.5.0-distribution/libs/org.eclipse.transformer.jakarta-0.5.0.jar!/org/eclipse/transformer/jakarta/jakarta-renames.properties ]
[main] INFO Transformer - Properties [ Substitutions matching [ web-fragment.xml ] ] URL [ jar:file:/C:/apps/org.eclipse.transformer.cli-0.5.0-distribution/libs/org.eclipse.transformer.jakarta-0.5.0.jar!/org/eclipse/transformer/jakarta/jakarta-web-xml.properties ]
[main] INFO Transformer - Properties [ Substitutions matching [ web-fragment.xml ] ] URL [ jar:file:/C:/apps/org.eclipse.transformer.cli-0.5.0-distribution/libs/org.eclipse.transformer.jakarta-0.5.0.jar!/org/eclipse/transformer/jakarta/jakarta-direct.properties ]
[main] INFO Transformer - Properties [ Substitutions matching [ web-fragment.xml ] ] URL [ jar:file:/C:/apps/org.eclipse.transformer.cli-0.5.0-distribution/libs/org.eclipse.transformer.jakarta-0.5.0.jar!/org/eclipse/transformer/jakarta/jakarta-renames.properties ]
[main] INFO Transformer - Properties [ Substitutions matching [ permissions.xml ] ] URL [ jar:file:/C:/apps/org.eclipse.transformer.cli-0.5.0-distribution/libs/org.eclipse.transformer.jakarta-0.5.0.jar!/org/eclipse/transformer/jakarta/jakarta-permissions-xml.properties ]
[main] INFO Transformer - Properties [ Substitutions matching [ permissions.xml ] ] URL [ jar:file:/C:/apps/org.eclipse.transformer.cli-0.5.0-distribution/libs/org.eclipse.transformer.jakarta-0.5.0.jar!/org/eclipse/transformer/jakarta/jakarta-direct.properties ]
[main] INFO Transformer - Properties [ Substitutions matching [ permissions.xml ] ] URL [ jar:file:/C:/apps/org.eclipse.transformer.cli-0.5.0-distribution/libs/org.eclipse.transformer.jakarta-0.5.0.jar!/org/eclipse/transformer/jakarta/jakarta-renames.properties ]
[main] INFO Transformer - Text files will be updated
[main] INFO Transformer - Java direct string updates will be performed
[main] INFO Transformer - All resources will be selected
[main] INFO Transformer - Action selected for input [ C:/Users/megas/git/mtr-example-eap7.4to8.0/eap7.4/coolstore ]: Directory Action
[main] INFO Transformer - Input  [ C:/Users/megas/git/mtr-example-eap7.4to8.0/eap7.4/coolstore ] as [ C:\Users\megas\git\mtr-example-eap7.4to8.0\eap7.4\coolstore ]
[main] INFO Transformer - Output [ C:/Users/megas/git/mtr-example-eap7.4to8.0/output ] as [ C:\Users\megas\git\mtr-example-eap7.4to8.0\output ]
[main] INFO Transformer - [  All Resources ] [   8593 ] Unaccepted [      0 ]   Accepted [   8593 ]
[main] INFO Transformer - [  All Unchanged ] [   8497 ]     Failed [      0 ] Duplicated [      0 ]
[main] INFO Transformer - [    All Changed ] [     96 ]    Renamed [      0 ]    Content [     96 ]
[main] INFO Transformer - Transformer Return Code [ 0 ] [ Success ]

すると、ほとんどの移行が終了しているので、引き続きライブラリのバージョンアップを行っていきます。

mavenの設定ファイル、pom.xmlに記載されているライブラリをJakarta EE 8以前のもの(Java EE/J2EEのもの)から、Jakarta EE 10のものに変更します。

このアプリケーションではjavax.javaee-web-apiとjavax.javaee-apiのバージョン7が定義されているので、整理して変更します。このアプリケーションでは使用していませんが、ほかにユーザーライブラリでJakarta EE 8以前のものがある場合は、すべてJakarta EE 10対応版に更新する必要があります。

        <dependency>
            <groupId>javax</groupId>
            <artifactId>javaee-web-api</artifactId>
            <version>7.0</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>javax</groupId>
            <artifactId>javaee-api</artifactId>
            <version>7.0</version>
            <scope>provided</scope>
        </dependency>

        <dependency>
            <groupId>jakarta.platform</groupId>
            <artifactId>jakarta.jakartaee-api</artifactId>
            <version>10.0.0</version>
            <scope>provided</scope>
        </dependency>

注意: 使用しているライブラリによっては、製造元が更新を止めてしまい、Jakarta EE 10対応版が存在しない場合があります。その場合は、自分たちでライブラリをフォークして、Jakarta EE 10対応版を作成する必要があります。*3 実はEclipse Transformerはjarファイルやclassファイルのバイナリを直接変更してパッケージ名をjakartaに書き換える機能も持っていますが、完全に動作することは保証されませんし、実際によく知られたいくつかのパターンでは動作しません。 また、ライブラリによってはバージョンアップ後に使用方法が変更されており、新しいバージョンに合わせてソースコードを修正する必要がある場合もあります。

JBoss EAP 8.0ではHibernateのバージョンアップが行われており、いくつかのデフォルト値が変更されているなどの非互換が発生しています。 今回はすでに動いているアプリケーションなので、前のバージョンに動作を合わせる設定を追加します。

persistence.xmlのpropertiesに以下の記述を追加します。

            <property name="hibernate.id.db_structure_naming_strategy" value="single" />

さて、ここまで来たら移行は完了です。EAP 8.0を起動して、修正の終わったアプリケーションをデプロイします。

コマンドプロンプトを開いてEAP 8.0を起動します。起動中に前回のアプリケーションの起動エラーが出ますが、無視してください。

set EAP_HOME=C:\apps\jboss\jboss-eap-8.0
%EAP_HOME%\bin\standalone.bat --server-config=standalone-full.xml

起動が終わったら、修正したアプリケーションをコンパイルしてデプロイします。最初にデプロイした方法と同じです。

mvn package
mvn wildfly:deploy

デプロイが成功し、EAP 8.0上でアプリケーションを実行することができました。

EAP 8.0上のcoolstore

まとめ

JBoss EAP 7.4(Jakarta EE 8)からJBoss EAP 8.0(Jakarta EE 10)への移行を行ってきました。このバージョンではパッケージ名の変更が入っているため、いつもよりも移行が大変になっております。すでにメンテナンスが終了しており、移行のためには使用するライブラリを大幅に変更する必要がある場合もあります。 しかしながら、メンテナンスが終了しているライブラリを使い続けることはセキュリティー上の問題が発生する場合もあります。 少し前にはすでに開発がストップしていたlog4jの脆弱性であるLog4Shellが猛威を振るいました。この機会に刷新するのはいかがでしょうか。

なお、Red Hatでは移行に関する資料を準備しております。必要に応じてそちらを参照してください。

参考資料

*1:近日中に今はやりのアレを取り込んだバージョンが公開される予定なので、こうご期待!

*2:mavenリポジトリの本来の使い方を逸脱している気がする。

*3:この記事を執筆した2024年4月時点ではSeaser 2やApache Velocityなど。

* 各記事は著者の見解によるものでありその所属組織を代表する公式なものではありません。その内容については非公式見解を含みます。