カスタムタグの話のしようと思った発端は、
Tomcat9 を再起動した際、異常(10分近く)に時間がかかった原因を調べた結果でした。
通常、Tomcat の起動は一瞬で終わるはずなのに、当初原因が判りませんでした。
起動パラメータを見直したりもしたのですが、一向に改善せず、最終的には、
以下のログが怪しいと気が付きました。
「情報 [main] org.apache.jasper.servlet.TldScanner.scanJars 少なくとも1つのJARが、まだTLDを含んでいないTLDについてスキャンされました。 スキャンしたが、そこにTLDが見つからなかったJARの完全なリストについては、このロガーのデバッグログを有効にしてください。 スキャン中に不要なJARをスキップすると、起動時間とJSPのコンパイル時間が改善されます。」
実は、この情報は私の環境に限らず一般的にどの環境でも出ている普通のものです。
たぶん、このログの意味を理解されている方も少ないと思います。
そもそも「TLD」って何でしょう?
また良くある事ですが、日本語訳はありがたいのですが意味が通じませんよね。
ちゃんとわかる言い回しにすると、
「TLDを探しに JAR の中をスキャンしたけれど、TLDが無い JAR が1つ以上見つかった。
もし、その JAR が何なのか知りたければ、ログのデバッグ設定を有効にしてね。
スキャンが不要な JAR をスキップすると起動時間とJSPのコンパイルが速くなるよ。」
と、まあこんなところでしょうか。
TLD を含む JAR のほうが少ないですからこのメッセージはほぼ必ず出る訳です。
問題は、全ての JAR についてスキャンされるので、巨大な JAR ファイルがあったりすると
結構な時間がかかってしまいます。
結果的に、どうしたら良いかと言えば、catalina.proparties に以下の行を追加します。
tomcat.util.scan.StandardJarScanFilter.jarsToSkip=\*.jar
これで、Tomcat が10分近くかかっていたものが瞬時に起動するようになりました。
もし、カスタムタグを使っているのであれば、上記に必要な jar を1つずつ記述します。
気を付けていただきたいのは、TLD を含む JAR では無く、含まない JAR を指定する事です。
普通、逆じゃないかと思うのですが、そういう仕様になってます。
良くあるのが、繰り返し文で、
<% for( int i=0; i<10;i++ ) { %>
<td><%=data[i]%></td>
<% } %>
というところを例えば、
<c:forEach begin="1" end="5" step="2" var="i">
<td><%=data[i]%></td>
</c:forEach>
といった具合に書けます。
リーダー:「カスタムタグを作ったから今後はこれを使って書いてね。これで品質も生産性も上がるんだ。」
担当:「タグの属性の "begin" とか "end" ってどういう意味ですか?」
リーダー:「TLD に定義してるから見りゃわかるだろ!」
担当:「はあ・・・」
というところですね。
使えて悪い事は無いのですが、システム上の副作用が大きすぎるのです。
カスタムタグは定義(TLD)と実装(java)で構成されますが、
TLD はこのタグの仕様を記述するテキストファイルです。
厄介なのは、jar ファイルの中にも入れられるので、
TLD があるか無いかをいちいち調べる必要がある訳です。
そう、使っていなくてもです・・・。
今どき、html の静的タグだけでページを書く人っているんでしょうか?
javascript や html5 を使った動的なページが主流なのに、
こんな仕様は不要じゃないかと思います。
| « 前頁 | 次頁 » |