- PR -

Tomcat5でのclasspathの設定について

1
投稿者投稿内容
みじ
会議室デビュー日: 2004/05/22
投稿数: 9
投稿日時: 2004-12-20 18:43
はじめまして。
WindowsXPでTomcat5.0.19を使用していますが、以前はTomcat4.1.29を使用していました。現在の環境はエディタ+J2SE1.4SDK+Tomcat5.0.19です。
両方のclasspathの設定の違いについて疑問があり、投稿させていただきました。

Tomcat4.1.29の時は、ServletやJSPのために「servlet.jar」をclasspathとして通しました。このJARファイルにはjavax.servletパッケージやjavax.servlet.jspパッケージ等、ServletやJSPのクラスが入っていることは、jarファイルを解凍して確認しました。
Tomcat5.0.19になりますとjarファイルが2つに分割され、「servlet-api.jar」と「jsp-api.jar」に分かれました。
前者にはサーブレット関連のjavax.servletパッケージ、javax.servlet.httpパッケージが入っており、後者にはJSP関連のjavax.servlet.jspパッケージ、javax.servlet.jsp.elパッケージ、javax.servlet.jsp.tagextパッケージが入っています。こちらもjarファイルを解凍して確認しました。
ということは、JSPをコンパイルする際には、「jsp-api.jar」をclasspathに通さないといけないと思います。
しかし、「servlet-api.jar」にしかクラスパスを通していない状態でも、JSPが正常にサーブレットに変換、コンパイル、実行まできちんとできるのです。

jakartaのサイトでは、servlet-api.jarは「ServletとJSPのAPIクラス」で、jsp-api.jarは「JSP2.0API」と書いています。
なので、JSPが実行できるのは、正常な動きだとは思うんです。
でも、実際servlet-api.jarにはJSP関連のクラスは入っていないんですよね・・・。

Tomcatの内部のどこかで見に行ってるんでしょうか・・・?
だとしたら、どのような仕組みになっているのか、具体的に知る方法はありますでしょうか?
ご存知の方がいらっしゃいましたら、教えていただけるとありがたいです。
よろしくお願いいたします。
米山@クロノス
大ベテラン
会議室デビュー日: 2003/06/10
投稿数: 103
お住まい・勤務地: 大阪市淀川区西中島4-13-22 新大阪淀川ビル5F
投稿日時: 2004-12-20 19:57
こんにちは。米山@クロノスです。

引用:

みじさんの書き込み (2004-12-20 18:43) より:

ということは、JSPをコンパイルする際には、「jsp-api.jar」をclasspathに通さないといけないと思います。
しかし、「servlet-api.jar」にしかクラスパスを通していない状態でも、JSPが正常にサーブレットに変換、コンパイル、実行まできちんとできるのです。



JSPファイル自体がコンパイルされるわけではありません。
JSPファイルから生成されたサーブレットのファイルがコンパイルされるという部分は理解できていますでしょうか。
さらに、その作業を行うのはみじさんじゃないですよね?
コンテナの役割です。

コンパイル時に必要なクラスパスと、実行時に必要なクラスパスがあるということはご存知でしょうか?

_________________
みじ
会議室デビュー日: 2004/05/22
投稿数: 9
投稿日時: 2004-12-20 20:27
米山@クロノス様、ご返信を頂きありがとうございます。

JSPファイル自体がコンパイルされないことは、わかっておりますので大丈夫です。
ただ、そのコンテナが、「JSPから変換されたサーブレットをコンパイルする際に見るクラスファイル」が、jsp-api.jarに入っているので、classpathが必要なのではないかと考えたわけです。
説明が足りずに、申し訳ございません。

引用:

コンパイル時に必要なクラスパスと、実行時に必要なクラスパスがあるということはご存知でしょうか?



すみません。こちらのほうはよくわかっていなかったです。
ということは、環境変数classpathで設定するのは、「実行時に必要なクラスパス」だけ、ということなのでしょうか?
実際にTomcatのコンテナ内でJSPから変換されたサーブレットをコンパイルする際は、環境変数のclasspathを使ってるわけではなく、別のところに設定された「コンパイル時に必要なクラスパス」を使用している、という解釈でよろしいでしょうか?

そうすると、その「コンパイル時に必要なクラスパス」はどこに設定されているのでしょう・・・。servlet.xmlとかでしょうか?自分でも確認してみたいと思います。
uk
ぬし
会議室デビュー日: 2003/05/20
投稿数: 1155
お住まい・勤務地: 東京都
投稿日時: 2004-12-20 20:42
Tomcat実行時のクラスパスは、catalina.batとsetclasspath.bat(Windowsの場合)で設定
されています。また、WEB-INF/libに入っているjarファイルおよびWEBーINF/classesに入って
いるクラスに関しては、そのWebアプリケーションに限りクラスパスに入っている、と考えて
いいと思います。
米山@クロノス
大ベテラン
会議室デビュー日: 2003/06/10
投稿数: 103
お住まい・勤務地: 大阪市淀川区西中島4-13-22 新大阪淀川ビル5F
投稿日時: 2004-12-20 21:06
引用:

みじさんの書き込み (2004-12-20 20:27) より:

ということは、環境変数classpathで設定するのは、「実行時に必要なクラスパス」だけ、ということなのでしょうか?



いいえ。本来は「コンパイル時」、「実行時」両方に有効です。
main()メソッドを持つ通常のJavaプログラムを動かすのであれば、コンパイルの「javac」コマンド、実行の「java」コマンド、共に環境変数CLASSPATHを参照してくれます。
しかし、Tomcatを実行する際にはukさんが書かれているように、Tomcatの起動スクリプト内で環境変数CLASSPATHの設定は上書きされてしまいます。

つまり、みじさんが自分で書いたサーブレットのソースコードをコンパイルする際には、みじさんが設定したCLASSPATHの値が参照されますが、Tomcatの実行時には参照されません。

また、ukさんが書かれているように、「WEB-INF/classes」ディレクトリにあるクラスと「WEB-INF/lib」ディレクトリにあるJARファイルをCLASSPATHに通すのはコンテナの役目です。Tomcatではさらに「%TOMCAT_HOME%/common/lib」のJARファイルも同様です。

なので、みじさんが明示的にCLASSPATHに「jsp-api.jar」を設定しなくても、(たとえ設定しても上書きされるので同じことですが)、TomcatがJSPから生成されたサーブレット・ソースをコンパイルする際には「%TOMCAT_HOME%/common/lib」に配置されている「jsp-api.jar」を参照してくれます。

ちなみに、自分でカスタム・タグなんかを作成する場合には「JSP API」を利用するので、自分でソース・コードをコンパイルする際にも「jsp-api.jar」がCLASSPATHに通っている必要があります。


_________________
日本の中心で、オフを叫ぶ(@名古屋)。 ご意見募集中!

[ メッセージ編集済み 編集者: 米山@クロノス 編集日時 2004-12-20 21:08 ]
みじ
会議室デビュー日: 2004/05/22
投稿数: 9
投稿日時: 2004-12-20 21:50
uk様、米山@クロノス様、ご返信ありがとうございます。
お二人のご返信を見て、バッチファイルの中身を見て、ようやくわかりました。
Tomcatの起動時に、勝手にclasspathの書き換えがおこなわれていたのですね!
だから、環境変数に登録しなくても、コンパイルと実行ができる、ということですね。
そして、カスタムタグの時にはclasspathの設定が必要の意味もわかりました。
ここ2週間くらい、このことでずっと疑問に思っていたので、ようやくすっきりしました。
お二人とも、本当にありがとうございました。
もっと勉強したいと思います。
1

スキルアップ/キャリアアップ(JOB@IT)