【Java】JSTL(JavaServer Pages Standard Tag Library)のビルドスクリプトの依存関係の指定方法の注意点の紹介

JSTL(JavaServer Pages Standard Tag Library)を使用するとき、ビルドスクリプトの依存関係に指定するときは注意が必要です。指定を誤ると正しく動作しなくなります。

今回は、ビルドスクリプトの依存関係に指定するときの注意点と発生する問題を紹介します。

スポンサーリンク

環境

検証に使用した環境/ライブラリ、バージョンを以下に記載します。

  • Java:11
  • JSTL:1.2
  • Tomcat:8.5.49

ビルドスクリプト

ビルドスクリプトはMavenで例を記載します。他のビルドスクリプトを使用する場合は、Maven Repository を確認してください。

jstl:jstl

Maven Repository:https://mvnrepository.com/artifact/jstl/jstl/1.2

<!-- https://mvnrepository.com/artifact/jstl/jstl -->
<dependency>
    <groupId>jstl</groupId>
    <artifactId>jstl</artifactId>
    <version>1.2</version>
</dependency>

これは、グループIDの指定誤りと言われています。こちらを使用するのではなく javax.servlet:jstl を使用してください。

javax.servlet:jstl

Maven Repository:https://mvnrepository.com/artifact/javax.servlet/jstl/1.2

<!-- https://mvnrepository.com/artifact/javax.servlet/jstl -->
<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>jstl</artifactId>
    <version>1.2</version>
</dependency>

これは、正しく動作します。ただし、Maven Repository を確認すると注意表記として、ライブラリが別の場所に移動したことを示す次の記載があります。

Note: This artifact was moved to:
javax.servlet.jsp.jstl » jstl

この注意表記に従い、リンク先のライブラリである javax.servlet.jsp.jstl:jstl を使用すると問題が発生します。

javax.servlet.jsp.jstl:jstl

Maven Repository:https://mvnrepository.com/artifact/javax.servlet.jsp.jstl/jstl/1.2

<!-- https://mvnrepository.com/artifact/javax.servlet.jsp.jstl/jstl -->
<dependency>
    <groupId>javax.servlet.jsp.jstl</groupId>
    <artifactId>jstl</artifactId>
    <version>1.2</version>
</dependency>

これは、正しく動作せず実行時にクラスが存在しないことを示す java.lang.NoClassDefFoundError 例外が発生します。

org.apache.jasper.JasperException: javax.servlet.ServletException:
java.lang.NoClassDefFoundError: org/apache/taglibs/standard/tag/rt/core/ForEachTag

Note:スタックトレースは、foreachタグを使用したときに発生した内容を例として記載しています。

クラスが存在しないことを示す例外が発生する原因は、ビルドスクリプトによりダウンロードされたライブラリのファイルを確認することで問題を確認することができます。

正しく動作するライブラリのjarファイルは、次のパッケージ階層になっています。

META-INF
javax.servlet.jsp.jstl
org.apache.taglibs.standard

正しく動作しないライブラリのjarファイルは、次のパッケージ階層になっています。

META-INF
classes
  javax.servlet.jsp.jstl
  org.apache.taglibs.standard

classes ディレクトリの下にパッケージが存在している構成のため、実行時にクラスが検索できないことが原因です。

まとめ

JSTL(JavaServer Pages Standard Tag Library)をビルドスクリプトで指定するときの注意点を紹介しました。