EclipseでJSF2アプリケーションを実行すると、TLDがすでに次のように定義されているためにスキップされたという情報ログがいくつか表示されます。
Jan 3, 2012 7:24:45 PM org.Apache.catalina.startup.TaglibUriRule body
INFO: TLD skipped. URI: http://www.springframework.org/tags/form is already defined
Jan 3, 2012 7:24:45 PM org.Apache.catalina.startup.TaglibUriRule body
INFO: TLD skipped. URI: http://www.springframework.org/tags is already defined
Jan 3, 2012 7:24:45 PM org.Apache.catalina.startup.TaglibUriRule body
INFO: TLD skipped. URI: http://Java.Sun.com/jstl/core_rt is already defined
Jan 3, 2012 7:24:45 PM org.Apache.catalina.startup.TaglibUriRule body
INFO: TLD skipped. URI: http://Java.Sun.com/jstl/core is already defined
Jan 3, 2012 7:24:45 PM org.Apache.catalina.startup.TaglibUriRule body
INFO: TLD skipped. URI: http://Java.Sun.com/jsp/jstl/core is already defined
Jan 3, 2012 7:24:45 PM org.Apache.catalina.startup.TaglibUriRule body
INFO: TLD skipped. URI: http://Java.Sun.com/jstl/fmt_rt is already defined
Jan 3, 2012 7:24:45 PM org.Apache.catalina.startup.TaglibUriRule body
INFO: TLD skipped. URI: http://Java.Sun.com/jstl/fmt is already defined
Jan 3, 2012 7:24:45 PM org.Apache.catalina.startup.TaglibUriRule body
INFO: TLD skipped. URI: http://Java.Sun.com/jsp/jstl/fmt is already defined
Jan 3, 2012 7:24:45 PM org.Apache.catalina.startup.TaglibUriRule body
INFO: TLD skipped. URI: http://Java.Sun.com/jsp/jstl/functions is already defined
Jan 3, 2012 7:24:45 PM org.Apache.catalina.startup.TaglibUriRule body
INFO: TLD skipped. URI: http://jakarta.Apache.org/taglibs/standard/permittedTaglibs is already defined
Jan 3, 2012 7:24:45 PM org.Apache.catalina.startup.TaglibUriRule body
INFO: TLD skipped. URI: http://jakarta.Apache.org/taglibs/standard/scriptfree is already defined
Jan 3, 2012 7:24:45 PM org.Apache.catalina.startup.TaglibUriRule body
INFO: TLD skipped. URI: http://Java.Sun.com/jstl/sql_rt is already defined
Jan 3, 2012 7:24:45 PM org.Apache.catalina.startup.TaglibUriRule body
INFO: TLD skipped. URI: http://Java.Sun.com/jstl/sql is already defined
Jan 3, 2012 7:24:45 PM org.Apache.catalina.startup.TaglibUriRule body
INFO: TLD skipped. URI: http://Java.Sun.com/jsp/jstl/sql is already defined
Jan 3, 2012 7:24:45 PM org.Apache.catalina.startup.TaglibUriRule body
INFO: TLD skipped. URI: http://Java.Sun.com/jstl/xml_rt is already defined
Jan 3, 2012 7:24:45 PM org.Apache.catalina.startup.TaglibUriRule body
INFO: TLD skipped. URI: http://Java.Sun.com/jstl/xml is already defined
Jan 3, 2012 7:24:45 PM org.Apache.catalina.startup.TaglibUriRule body
INFO: TLD skipped. URI: http://Java.Sun.com/jsp/jstl/xml is already defined
このログはどういう意味ですか?
これは、Webアプリケーションのランタイムクラスパスに重複するTLDファイルがあることを意味します。 TLDは通常ライブラリのJARファイルに含まれているため、これはWebアプリケーションのランタイムクラスパスに重複するJARファイルがあることを意味します。
Appserverの/lib
フォルダーにもJDKの/lib
フォルダーにも触れていないと仮定すると、これらの重複はWARビルドの/WEB-INF/lib
フォルダーにあります。クリーンアップします。
仕様で必要なURIの優先順位は次のとおりです。
J2EE platform taglibs - Tomcat doesn't provide these
web.xml entries
JARS in WEB-INF/lib & TLDs under WEB-INF (equal priority)
Additional entries from the container
Tomcatはtldを2回ロードします。
1、Tomcatが起動すると、tldをロードしてtldファイル内のリスナーを検索します。
2、最初のjspファイルがコンパイルされると、tldペアのキャッシュが構築されます。
1、tldをロードしてtldファイル内のリスナーを検索します
Web.xmlからロードする場合、web.xmlのtaglib-uriとtldファイルのuriをセットに入れます。 WEB-INFまたはjarからロードする場合、URIはtldファイルからのものです。
Tomcatは、重複するtldリスナーの追加を回避する必要があるため、セットにuriが存在するかどうかを確認します。 uriがすでに存在する場合は、投稿したメッセージをログに記録しますそしてtldリスナーの追加をスキップします。
2、キャッシュの構築
1)web.xmlエントリ、タグuriはweb.xmlから取得されます
2)WEB-INFでtldファイルをスキャンします。タグuriはtldファイルから取得されます
3)jarをスキャンし、タグuriはtldファイルから取得されます。
Uriがすでに存在する場合、エントリは無視されます。
たとえば、TomcatとMaven(または他のサーバー)を使用している場合、サーバー上に既にあるJSTLライブラリを出荷し、サーバーが文句を言うことを意味します。
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
アプリケーションが(Tomcatに)デプロイされると、次のエラーメッセージが表示されます。
INFO: TLD skipped. URI: http://Java.Sun.com/jstl/core_rt is already defined
Mar 02, 2017 2:19:32 PM org.Apache.catalina.startup.TaglibUriRule body
解決策は、JSTLがTomcatにすでに付属しているため、タグ「scope」と「provided」の値を使用することです(これはIDE専用です)。
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
<scope>provided</scope>
</dependency>
その後、エラーは消えます。