The Jakarta Project The Jakarta Tomcat Project

Tomcat

目次

Tomcat 質問集

その他の質問集

Printer Friendly Version
印刷用
バージョン
はじめに

このページでは、どの分類にも入らない質問を取り上げています。

Tomcat 4.1.27には、Webアプリケーションの再読込に関して不具合が存在するため、修正プログラム(hotfix)を必要とします。 詳しい情報はここに載っています。

質問

回答
JSPをコンパイルできない!
これが確認されましたか?
      org.apache.jasper.JasperException: Unable to compile
      class for JSP

      An error occurred at line: -1 in the jsp file: null

      Generated servlet error:
          [javac] Since fork is true, ignoring compiler
      setting.
          [javac] Compiling 1 source file
         [javac] Since fork is true, ignoring compiler
      setting.

    
もしそうなら、解決方法がいくつかあります。 環境周りの問題となっているケースでは、Windows環境において、起動スクリプトは正しく動作するがサービスだと動作しない例が典型的ですね。 サービスでは、Javaおよび他の"要素"を参照するのにレジストリの変数を利用します。 何かのトラブルを出さないために、 NT Service Config Utility が役に立つかどうか確認してみてください。

/servlet/*で、サーブレットが動かない!
サーブレットにマッピングされた /servlet/ を使用することはよくないです。 絶対によくないです。 これに比べると、もっとよくないです。 例えば、それについて回答したと思われるスレッドを、ここにいくつか紹介します。

Invokerは、なぜよくないの?
これは、著者の見解です。(場合によって、違うのかもしれませんが)
Invokerについて手短に言うと、 Invokerは、クラス名に基づいた他のサーブレットを実行時に読込することを可能とするダイナミックなサーブレットです。 例えば、com.foo.MyClassがサーブレットとして読込可能なクラスであるが、明示的に宣言されていないケースにおいて、 このサーブレットは http://localhost/servlet/com.foo.MyClass?more=cowbell という風に呼び出すことを可能にさせます。

よくない理由はこうです。
  • セキュリティの危険性 ... 直前のリンクを参照してください。
  • 設定内容が見えない。 使用可能なサーブレットおよび使用不可能なサーブレットを決定することができません。 web.xmlでは、あらゆるサーブレットが宣言され、マッピング定義されています。 その1ファイルにおいて、アプリケーションの動作方法に対するロードマップを即座に決定するのです。
  • バックドア。 マッピングされるサーブレットは、Invoker経由で、クラス名で交互に呼び出すことができます。 URLが異なり、URLパターンがまさに異なるため、すべてのセキュリティ制約が無視されてしまうこともあります。
  • バックドア。 悪いプログラマは、よくないことを発生させるのをより容易にしてしまいます。
  • バックドア。 共有領域にある共通のサードパーティ製のJARファイルの使用は普通でしょう。 共有されたJARファイルにサーブレットが含まれていれば、そのサーブレットが落とし穴となり、よくないことが発生します。
  • 設定内容が見えない。 繰り返しになりますが、すごく大事なことなんです。 面倒ですが、明示的に宣言することは、アプリケーションのメンテナンススキームに非常に有用です。

Tomcatのバージョン番号はどうやって取得するの?
javax.servlet.ServletContext.getServerInfo();

Tomcatで、CPU使用率が100%に達する!
可能性として、ガベージコレクタの負荷が極端に大きいのかもしれません。

JVM 1.4.1では、ガベージコレクタに回収されないメモリリークが存在します。 詳しい情報はここです。 そうでなければ、メモリプロファイラを入手するか、メモリの設定を調整してください。

起動時にシステムプロパティを設定するには、どうしたらいいの?
startup.batまたはcatalina.batを呼び出す前に、JAVA_OPTSに設定してください。 ( もしくは、それらのファイルを編集することもできますが、その方法については説明しません )

例 (windows): SET JAVA_OPTS='-DpropName=propValue'

例 (unix): export JAVA_OPTS='-DpropName=propValue'

Windowsのサービスを利用しているユーザ - これを使ってみてください

カスタマイズしたエラーページを返すには、どうしたらいいの?
web.xmlに...
        <error-page>
            <error-code>404</error-code>
            <location>/error/404.html</location>
        </error-page>
    
を設定してください。 また、エラー500はもちろん、他の例外を指定したり、Throwableを継承した例外をキャッチしても構いません。
詳しい情報については、設定方法がぞっとするような分量で記述されているサーブレット仕様を参照してください。

LE版を利用したほうがいいの?
いいえ。 実験的な試みだったのですが、結果的に失敗でした。 (場合によって違うかもしれませんが) LE版の当初の目的は、JDK 1.3に含まれていないTomcat向けの多くの標準機能をJDK 1.4が提供しているためです。 ディストリビューションの容量を少しでも節約することで、ネットワークの帯域幅を節約することにもつながります。 そのとき以来、混乱の連続となりました。 ( 説明に食い違いがありましたら、私を罵倒してください ) 詳しい情報はここ。

停止中にセッションを保存させないようにするには、Tomcatにどうやって設定したらいいの?
タグプーリングを無効にするには、どうしたらいいの?
タグプーリングを無効にするには、 $TOMCAT_HOME/conf/web.xmlを開き --> JSPサーブレットの定義を enablePooling=false に変更してください。

server.xmlのDTDはあるの?
ありません! 正確に言うと、用意することができません。 理由はここにあります。

ウェルカムファイルを変更するには、どうしたらいいの? ( index.htmlの代わりにindex.jspを出力したい )
web.xmlにあるwelcome-files-listを変更してください。 詳しい情報はここにあります。

すべての有効なアドレスの代わりに特定のIPアドレスでTomcatを起動するには、どうしたらいいの?
ちゃんとマニュアルを読んでね! [プロパティ address='127.0.0.1' をコネクタの設定に追加してね。] もっと詳しく知りたいときは、 JK Http (開発終了)、 Http (Coyoteコネクタ) を参照してください。

JARファイルにシンボリックリンクを使用するには、どうしたらいいの?
server.xmlに手を出す必要があり、 このようにしてください。 (心配無用、実に簡単ですよ!)

UTF-8で取得するにはどうしたらいいの?
このスレッドに回答があります。

サーブレット(またはJSP)から、ダウンロードの保存ダイアログでファイル名を変更したいときはどうしたらいいの?
Content-Dispositionヘッダを使ってください。

タグプーリングが動作しません? releaseメソッドが呼ばれていないんです!
おそらく、あなたの作ったタグについて、それが動作していないわけではありません。 これに関して、多くのバグレポートを受け取っています。 ここにぞっとするほどの量のバグレポートがあります。

どうして、java.lang.IllegalStateExceptionが返されるの?
java.lang.IllegalStateExceptionがどのようにして返されるかについての大抵の理由は共通しており、こうなっています。
  • setBufferSizeを呼び出していたり、コンテンツの中身が書き込まれた状態になっている。
  • レスポンスがコミットされていたり、下記のように実行されている。
    • ServletResponse.reset()もしくはServletResponse.resetBuffer()を呼び出している。
    • HttpServletResponse.sendError()HttpServletResponse.sendRedirect()の両方を呼び出している。
    • jsp:forwardの実行を含んでいるRequestDispatcher.forward()を呼び出している。
forward()もしくはsendRedirect()が呼び出されると、下記に示すコードのどの行でも実行をさらに継続することを思い出してください。
例題:
{
  ...
  response.sendRedirect("foo.jsp");
  // ここのポイントとして、return文を記述してください。
  // さもなければ下記の行が実行されてしまうでしょう。
  System.out.println("After redirect! By the way ...");
  System.out.println("Use commons-logging or log4j, not System.out");
  System.out.println("System.out is a bad practice!");

  response.sendRedirect("bar.jsp"); /* この行でエラーをスローします! */

}
    

Tomcatで定期的に実行されるイベントを設定するにはどうしたらいいの?
Tomcatでは、これを直接サポートしていません。 ServletもしくはJSP仕様の部分に含まれていないからです。 この機能が必要であれば、 このスレッド または このリンク を参照してください。

Element "web-app" does not allow "servlet" hereって、いったい何なの?
あなたの書いたweb.xmlが、Well-Formedでないか、サーブレット仕様で定義されたDTDに従っていないのでしょう。 web.xmlが正しいと確保するために、XML Validatorを使ってください。

System.outの出力先はどこなの?
catalina.outを生成するには、どうしたらいいの?
System.outおよびSystem.errは、ともにcatalina.outへ書き出されます。 しかしながら、swallowOutput属性経由でこれを抑制し、異なるログファイルに送出することもできます。
そうすることで、catalina.outは生成されなくなります。 しかし、そのことが問題にならないわけではありません。 というのも、ロギングパッケージを使用するようになってから、標準出力へ書き出されなくなりましたよね?
詳しいことは log4jの設定例 および catalina.outの生成に関するスレッド を参照してください。

Webアプリケーション内にあるファイルを読み込みたいのですが、どうやって開けばいいの?
ServletContext.getResourceAsStream()を使ってください。

JREのみでTomcatを実行できるの? それとも、完全なJDKを必要とするの?
Tomcatは、完全なJDKを公式に必要とします。 というのも、JSPのコンパイルにjavacが必要だからです。 全てのJSPがプリコンパイルされていれば、JREのみでTomcatを実行して行けますが、それについては自己の責任のもとで行ってください。


[ このページは 小川 環 によって翻訳されました。 日本語訳に関する質問については report@jajakarta.org までお願いします。 ]
Copyright © 1999-2003, Apache Software Foundation.