Eclipse Transformerのご紹介と、javaxパッケージ名前空間からjakartaパッケージ名前空間への変換例(Part 2)~Mavenプラグインを利用~
富士通技術者ブログ~Javaミドルウェア~

2024年6月19日 初版
岡田 崚佑

Eclipse Transformerのご紹介(Part1)では、Jakarta EE 8からJakarta EE 10への移行の課題と、その解決策となるEclipse Transformerの紹介、およびCLIでの変換例を説明しました。CLIによる変換は、ソースをまとめて変換できるため、Jakarta EE 10移行後も継続的に機能追加や修正を加えていく場合に有効です。
一方、今後アプリケーションの修正や機能追加の予定がなく、Jakarta EE 8以前の規約に準拠したアプリケーションでもJakarta EE 10準拠のアプリケーションサーバー上で動くのかを確認したい場合、 ビルドツールで変換をできたほうが都合がいいこともあります。 そこで今回は、JavaのビルドツールのひとつであるMavenのプラグインを利用した変換例をご紹介します。
Mavenプラグインを利用することで、ソースコードは変えずに、生成物だけJakarta EE 10に対応させることができます。 本記事では、Eclipse Transformer(Eclipse Foundationのページへ)のプラグインを使った生成物の変換例をご紹介します。
なお、本記事の内容は、Fujitsu Software Enterprise Application Platform V1.2.0 に適用することができます。

MavenとMaven-プラグイン

まずはじめに、Mavenについて簡単にご説明します。 MavenはApache Foundationのプロジェクトのひとつであり、Javaのビルドツールとして知られています。 Project Object Model(POM)の概念に基づいて、プロジェクトのビルドやテスト、ドキュメンテーション、成果物の配備などを管理できます。
またMavenには、ビルドライフサイクルの特定のフェーズに結びつけて実行できるプラグインがあります。 今回は、Transformerが提供している名前空間を変換するプラグインの使い方をご紹介します。

Eclipse Transformer Maven プラグインの使用方法

MavenでEclipse Transforer使用したい場合は、プロジェクトのpom.xmlのpluginsタグ配下に以下を記述してください。

<plugin>
    <groupId>org.eclipse.transformer</groupId>
    <artifactId>transformer-maven-plugin</artifactId>
    <version>0.5.0</version>
    <configuration>
        <rules>
            <jakartaDefaults>true</jakartaDefaults>
        </rules>
    </configuration>
    <executions>
        <execution>
            <id>default-transform</id>
            <goals>
                <goal>transform</goal>
            </goals>
        </execution>
    </executions>
</plugin>

Eclipse Transformer Maven pluginの使用例

Jakarta EE 8以前のアプリケーションのPOMファイルに、使用方法で示したプラグインの記述を追加し、
Jakarta EE 10準拠のGlassFish 7.0.11上で動作させる例をご紹介します。 なお、ここで紹介するプログラムの完全なソースコードや手順は以下で参照できます。

ここでは、Jakarta EE 8の実装としてGlassFish 5.1を、Jakarta EE 10の実装としてGlassFish 7.0.11を使います。
それぞれの実装を以下のリンクからダウンロードし、任意のディレクトリに展開してください。

また、GlassFish 5.1ではJDK8が、GlassFish 7.0.11ではJDK11以降がそれぞれ必要になるため、適宜用意してください。 用意したJDKのパスを、glassfish5/glassfish/config/asenv.confとglassfish7/glassfish/config/asenv.confのAS_JAVAに設定してください。 以下はGlassFish 5.1の設定例です。

...
AS_JAVA="/work/jdk8u302-b08"
AS_IMQ_LIB="../../mq/lib"
...

GlassFish 5.1にアプリケーションを配備するには、以下のコマンドを実行してください。

$ $PATH_TO_GF5/glassfish5/glassfish/bin/asadmin start-domain
$ $PATH_TO_GF5/glassfish5/glassfish/bin/asadmin deploy --contextroot=ee8 --name=ee8app sample-app-ee8-1.0.war       

GlassFishはデフォルトで8080ポートを使用しますので、このWebアプリケーションにアクセスするには、curlコマンドなどで以下のように実行します。

$ curl http://localhost:8080/ee8/hello
Hello !
java.version : 1.8.0_302
glassfish.version : GlassFish Server Open Source Edition  5.1.0  (build default-private)        

GlassFish 5.1上に配備されたアプリケーションにアクセスすると、JDKのバージョンと、GlassFishのバージョンが出力されることが確認できました。
続いて、同じアプリケーションをGlassFish 7.0.11で実行してみます。GlassFish 5.1の停止、およびGlassFish 7.0.11にアプリケーションを配備するには、以下のコマンドを実行してください。

$ $PATH_TO_GF5/glassfish5/glassfish/bin/asadmin stop-domain
$ $PATH_TO_GF7/glassfish7/glassfish/bin/asadmin start-domain
$ $PATH_TO_GF7/glassfish7/glassfish/bin/asadmin deploy --contextroot=ee8 --name=ee8app sample-app-ee8-1.0.war

GlassFish 5.1の時と同様に、curlコマンドなどで以下のようにアクセスします。

$ curl http://localhost:8080/ee8app/hello
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><title>Eclipse GlassFish 7.0.11 - Error report</title><style type="text/css"><!--H1 {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;font-size:22px;} H2 {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;font-size:16px;} H3 {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;font-size:14px;} BODY {font-family:Tahoma,Arial,sans-serif;color:black;background-color:white;} B {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;} P {font-family:Tahoma,Arial,sans-serif;background:white;color:black;font-size:12px;}A {color : black;}HR {color : #525D76;}--></style> </head><body><h1>HTTP Status 500 - Internal Server Error</h1><hr/><p><b>type</b> Exception report</p><p><b>message</b>Internal Server Error</p><p><b>description</b>The server encountered an internal error that prevented it from fulfilling this request.</p><p><b>exception</b> <pre>jakarta.servlet.ServletException: Error allocating a servlet instance</pre></p><p><b>root cause</b> <pre>java.lang.NoClassDefFoundError: javax/servlet/http/HttpServlet</pre></p><p><b>root cause</b> <pre>java.lang.ClassNotFoundException: javax.servlet.http.HttpServlet</pre></p><p><b>note</b> <u>The full stack traces of the exception and its root causes are available in the Eclipse GlassFish 7.0.11 logs.</u></p><hr/><h3>Eclipse GlassFish 7.0.11</h3></body></html>

GlassFish 7.0.11では、ClassNotFoundExceptionが出力され、エラーページが返ってきます。
これは、Jakarta EE 10では、javaxパッケージ名前空間のクラスを使用できないため発生するエラーです。これを解決するために、Eclipse TransformerのMaven プラグインによって、アプリケーション内のjavaxパッケージ名前空間をjakartaパッケージ名前空間に書き換えます。 https://github.com/fujitsu/app_blog/tree/master/maven-plugin-202406 のsample-appディレクトリ配下のpom.xmlに以下を書き足すか、 ビルド時に [-f] オプションでpom-transformer.xmlを指定してください。

  <plugins>
      <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-war-plugin</artifactId>
          <version>3.3.2</version>
          <configuration>
              <failOnMissingWebXml>false</failOnMissingWebXml>
          </configuration>
      </plugin>
+     <plugin>
+         <groupId>org.eclipse.transformer</groupId>
+         <artifactId>transformer-maven-plugin</artifactId>
+         <version>0.5.0</version>
+         <configuration>
+             <rules>
+                 <jakartaDefaults>true</jakartaDefaults>
+             </rules>
+         </configuration>
+         <executions>
+             <execution>
+                 <id>default-transform</id>
+                 <goals>
+                     <goal>transform</goal>
+                 </goals>
+             </execution>
+         </executions>
+     </plugin>
  </plugins>

再度ビルドしたアプリケーションを用いて、GlassFish 5.1、GlassFish 7.0.11で動作確認します。 まずは、GlassFish 5.1にアプリケーションを配備し、curlコマンドでアクセスします。

$ $PATH_TO_GF5/glassfish7/glassfish/bin/asadmin stop-domain
$ $PATH_TO_GF5/glassfish5/glassfish/bin/asadmin start-domain
$ $PATH_TO_GF5/glassfish5/glassfish/bin/asadmin undeploy ee8app
$ $PATH_TO_GF5/glassfish5/glassfish/bin/asadmin deploy --contextroot=ee10 --name=ee10app sample-app-ee10-1.0.war
$ curl http://localhost:8080/ee10/hello
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><title>GlassFish Server Open Source Edition  5.1.0  - Error report</title><style type="text/css"><!--H1 {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;font-size:22px;} H2 {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;font-size:16px;} H3 {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;font-size:14px;} BODY {font-family:Tahoma,Arial,sans-serif;color:black;background-color:white;} B {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;} P {font-family:Tahoma,Arial,sans-serif;background:white;color:black;font-size:12px;}A {color : black;}HR {color : #525D76;}--></style> </head><body><h1>HTTP Status 500 - Internal Server Error</h1><hr/><p><b>type</b> Exception report</p><p><b>message</b>Internal Server Error</p><p><b>description</b>The server encountered an internal error that prevented it from fulfilling this request.</p><p><b>exception</b> <pre>javax.servlet.ServletException: Error allocating a servlet instance</pre></p><p><b>root cause</b> <pre>java.lang.NoClassDefFoundError: jakarta/servlet/http/HttpServlet</pre></p><p><b>root cause</b> <pre>java.lang.ClassNotFoundException: jakarta.servlet.http.HttpServlet</pre></p><p><b>note</b> <u>The full stack traces of the exception and its root causes are available in the GlassFish Server Open Source Edition  5.1.0  logs.</u></p><hr/><h3>GlassFish Server Open Source Edition  5.1.0 </h3></body></html>

先ほどとは違い、GlassFish 5.1でClassNotFoundExceptionが出力され、エラーページが返ってきました。今度はGlassFish 7.0.11で同様の操作をします。

$ $PATH_TO_GF5/glassfish5/glassfish/bin/asadmin stop-domain
$ $PATH_TO_GF7/glassfish7/glassfish/bin/asadmin start-domain
$ $PATH_TO_GF7/glassfish7/glassfish/bin/asadmin undeploy ee8app
$ $PATH_TO_GF7/glassfish7/glassfish/bin/asadmin deploy --contextroot=ee10 --name=ee10app sample-app-ee10-1.0.war
$ curl http://localhost:8080/ee10/hello
Hello !
java.version : 17.0.2
glassfish.version : Eclipse GlassFish 7.0.11 (commit: ad98c44e896c7a78cb4eb2a84ca9fac450fb3a10)

今度は、GlassFish 7.0.11に配備したアプリケーションでJDKのバージョンと、GlassFishのバージョンが出力されることが確認できました。 このように、ソースファイルを書き換えずにアプリケーションのjavaxパッケージ名前空間をjakartaパッケージ名前空間に変換することができました。

最後に

本投稿では、Jakarta EE 8以前で使用されていたjavaxパッケージ名前空間を含むアプリを、Jakarta EE 10以降で使用されるjakartaパッケージ名前空間に変換する、Eclipse TransformerのMaven プラグインについて、 その使い方を説明しました。 Eclipse Transformerプロジェクトには、富士通のエンジニアもコミッターとして参加しており、品質向上に努めています。既存のアプリケーションをjakartaパッケージ名前空間に移行する際には、ぜひお試しください。

本コンテンツに関するお問い合わせ

お電話でのお問い合わせ

富士通コンタクトライン(総合窓口)

0120-933-200

受付時間:9時~12時および13時~17時30分
(土曜日・日曜日・祝日・当社指定の休業日を除く)

Webでのお問い合わせ

当社はセキュリティ保護の観点からSSL技術を使用しております。