« 2007年08月 | メイン | 2007年10月 »

2007年09月 アーカイブ

2007年09月22日

(FreeBSD)TomcatでServletする(1/2)

HTTPのクライアント側で動作する小さなJavaアプリを指すアプレット(applet)と呼ぶが、それに対してサーバー側で動作する小さなJavaアプリを指すサーブレット(servlet)という言葉がある。昔かすかに聞いた覚えはあるが、その後servletなんて言葉はすっかり忘れていた。
先月から興味があってJDBCを勉強し始めているが、その関連の本を読むと、よくServletの話が出てくる。JavaはWebで使われることが多く、データベースをクライアント側で使うことは稀であるから、JDBCはServletで使われることが多い、ということになるのだろうか。

という訳で、このFreeBSDのWebサーバーにServletを動かす環境を作ってみたので、その過程を報告する。

まず必要なソフトであるが、Java開発環境であるJDK、Java動作環境であるJRE(Java VM)は当然として、クライアントの要求を受けてJavaアプリを起動するHTTPサーバーが必要だ。当初はCGIと似たような動作なのでApacheの設定かプラグインでできると思っていたが、過去にはJServというプログラムを使ってそのようなことをしていたようだが、今はTomcatという異なるHTTPサーバーを使うのがオープンソースでは主流のようだ。他にJRunやResinなどがあるが、これらは基本的には商用である。
蛇足だが、現在TomcatはApacheのプロジェクトで開発されているらしい。Jakarta TomcatとApache Tomcatは同じものである。

次に具体的なインストールの方法を記す。

●FreeBSDへのJDKのインストール
JDKにはJREが含まれているので、Java環境としてはJDKだけをインストールすれば良い。
しかし、最初につまづくのが、Sunが配布するJDKには、Linux用のバイナリはあるが、FreeBSD用のバイナリが無いことだ。従って、インストールするバイナリは次の3通りから選択する必要がある。
 (1) JDKのソースコードをコンパイルしてFreeBSD nativeなバイナリを作る
 (2) FreeBSDのLinux emulationによって、Linux用のバイナリを使う
 (3) Sun以外が配布するFreeBSD nativeなバイナリを使う

勿論(3)が一番楽である。FreeBSDのバージョンが5.5以降でJavaのバージョンが(1.4以前でなく)1.5で良いなら、FreeBSD Foundationが配布するDiablo JDKをインストールすれば良い。これはportsを使用してインストールすることもできる。

しかしながら、このサーバーのように、4.x以前のFreeBSDしか動かず(未だ原因不明)、HDDの空き容量が2G以上必要なJDK1.5のコンパイルができない場合は、別の選択をせざるを得ない。

JDK1.4については、(3)のようなバイナリは存在しない。CPUがPentium 150MHzであるこのサーバーでは、(2)のようにしてLinux emulationでLinuxのJREを動かすのでは、動作速度に難があり使い物にならない。
従ってJDK1.4をソースからコンパイルしたいのだが、少なくとも現時点のportsでは、なんとJDK1.4をコンパイルするのに(2)のLinux emulationによるLinuxのJDK1.4が必要になる。そして、portsのMakefileに書かれていたが、LinuxのJDK1.4を動かすには、FreeBSDが5.4以降である必要がある。
ついでに、JDK1.4のMakefileを動かし始めると、コンパイルには1.7GのHDDの作業領域が必要だという注意書きが表示された。このサーバーには0.4Mも空きが無いので、どの道無理であった。

Tomcat 5.5を動かすにはJDK1.4以上が必要なのだが、Tomcat 4.1なら、JDK1.2以上があれば良いので、このサーバーにはJDK1.3を入れることにした。
JDK1.3についても現在は(3)のようなバイナリが存在しない(過去にはDiablo JDKの1.3があったようだ)が、portsを使えば、JDK1.3のソースコードからのコンパイルは、Linuxのバイナリが必要になることも無く、実に簡単にできた。JDK本体のコンパイルはPentium 150MHzでも2~3時間でできたし、HDDの作業領域も300Mで足りた。

●Tomcatのインストール
packages/portsを使えば、特に難しいことは無かった。このサーバーにTomcat 4.1を、別のPCにTomcat 5.5をインストールしたが、どちらもバイナリのインストール自体は容易だった。
敢えて注意すべきことを挙げると、上に書いたことと重複するが、JDKが1.3以前だとTomcat 5.0以降は動かせないことと、packages/portsのパッケージ名ではtomcat??とapache-tomcat??は同じものだということがある。

Tomcatの起動スクリプトは/usr/local/etc/rc.d/に作られるので、それを参考に、/etc/rc.confにtomcat_enable等の行を追加すれば、Tomcatが起動できるようになる。(OS起動時にも自動的に起動されるようになる)
ちなみに、このサーバーの/etc/rc.confの設定は、

tomcat41_enable="YES"
tomcat41_java_home="/usr/local/jdk1.3.1"
tomcat41_java_vendor="sun"
tomcat41_java_version="1.3"
tomcat41_java_os="native"
tomcat41_java_opts="-Xverify:none"

である。最後の行は、JDBCのI/Fの都合で追加したものであり、Tomcat単体としては必要ない。

ただ1点問題なのは、Tomcat 4.1は、起動スクリプトを使ってTomcatの起動はできるが、状態表示や終了ができないことだ。通常運用だと特に問題無いのだが、Servletのクラスファイルを更新するとTomcatを再起動する必要がある(Tomcat自体がJava VM上で動いておりServletを1回起動したらその名前のクラスはロード済になってしまうため)ので、Servlet開発中は不便である。
原因はロックファイル(/var/run/tomcat41.pid)がうまく作られない(中身が空になる)ことなのだが、/usr/local/etc/rc.subrとにらめっこしているが、今の所修正方法を発見していない。
FreeBSD 5.5のTomcatだとそういう問題は起こらないので、Tomcat 4.1のportsがFreeBSD 4.x以前のことを考えていない可能性がある。
また、samba等他のサーバープログラムの起動スクリプトを一通り見たが、サーバープログラムが自前でdaemon起動しロックファイルを管理しているものばかりで、Tomcatのようにdaemonコマンドを使用してJavaのようなインタプリタをdaemon起動するものは無く、参考にならなかった。起動スクリプトにてJava起動後のpidを取得してロックファイルに格納するというのは、OSの助けが無い限り、並の手段では不可能のように思える。

続きを読む "(FreeBSD)TomcatでServletする(1/2)" »

2007年09月23日

(FreeBSD)TomcatでServletする(2/2)

インストールし立てのTomcatを起動してHTMLブラウザでアクセスすると、予め用意されているコンテンツ(TomcatではWebアプリと言うらしい)が表示され、ブラウザがJavaに対応していれば、サンプルのServletやJSPがすぐに動く。サンプルのServletのソースを見ることもでき、開発意欲をかき立てられる。

なお、Tomcatのマニュアル(RUNNING.txt)には、デフォルトの設定ではポート8080で待ち受けると書いてあるが、FreeBSDのportsはそれを8180に書き換えるので、注意が必要だ。

そのサンプルソースを改造して、自前のServletを作成して、いざTomcatで動かそうとすると、作成したServletをどこに置いてどういう設定をすれば良いかがわからない。
とりあえず、最初のテストとしては、クラスファイルをサンプルServletのある所(webapp/examples/WEB-INF/classes/)に置いて、サンプルServletの設定があるwebapps/examples/WEB-INF/web.xmlに同じような設定(<servlet>と<servlet-mapping>)を加えればよい。そうして新たなServletが動けば、JDKの動作には問題なしだ。

Servletのきちんとした配置と設定は、大変見つけにかったが、TomcatのマニュアルのDeploymentのページ(TomcatのデフォルトのWebアプリのページから"Tomcat Documentation"→"App Developer Guide"→"Deployment"と順に辿る)に書いてあった。Servletを動かすための最低限の準備は、
(1) Tomcatのwebappsディレクトリに新たなディレクトリ(ここでは"sample"とする)を作成し、
(2) webapps/sample/WEB-INF/classes/ にクラスファイルを置き、
(3) webapps/sample/WEB-INF/ に設定ファイルであるweb.xmlを置く
だ。web.xmlは、conf/web.xml.sampleをコピーして編集するが、筆者が試した所、Tomcat 4.1では<web-app>の中に<servlet>と<servlet-mapping>だけでうまくいったが、Tomcat 5.5では<session-config>も必要だった。


今回、試験的なアプリとして、ランダムな表を出力するServletを作ってみた。
RandomTable Servletへのリンク
 ※アクセス後、ブラウザでページの更新(再読み込み)をすると違う表が出てくると思います。
 ※JRE 1.3.1 + Tomcat 4.1で動かしています。
RandomTable Servletのソースコードへのリンク
web.xmlへのリンク
 ※Tomcat 4.1で不要だった部分はコメントアウトしています。

続きを読む "(FreeBSD)TomcatでServletする(2/2)" »

2007年09月30日

MySQL Connector/J導入記

JDBCを使ってMySQLにアクセスするためのJava側のドライバとして、MySQL Connector/Jというものがある。
今回、JDK 1.3、Tomcat 4.1が動いている環境にMySQL Connector/J 5.0をインストールし、動かしてみて気付いたことや、遭遇したトラブルと実際に行った対処を書き留める。

(1) JDK 1.3でMySQL Connector/Jを使う時の注意点
MySQL Connector/Jのマニュアルの§1.1.1にあるが、JDK 1.4未満では、class verifierをOFFにする必要がある。コマンドラインからJava VMを起動する場合は、-Xverify:noneを指定すれば良い。

(2) JDK 1.3+TomcatでMySQL Connector/Jを使う時の注意点
上記(1)の制限により、TomcatのJava VM起動時オプションに"-Xverify:none"を指定する必要がある。FreeBSD 4.11でTomcat 4.1を動かしているこのサーバーでは、/etc/rc.confに

tomcat41_java_opts="-Xverify:none"

を加えている。

なお、シェルのコマンドラインからjavaコマンドを使用する場合は、mysql-connector-java.jarをJDKのディレクトリの下のjre/lib/ext/に置いておくとCLASSPATHの指定が不要になるが、Tomcatの場合はこれは無効である。インストールマニュアルの通り、mysql-connector-java.jarをTomcatのディレクトリの下のcommon/lib/に置く必要がある。

(3) MySQL Connector/JのExample 10がSQLエラーになる
あるMySQLのサーバーに対して、MySQL Connector/JのマニュアルのExample 10のコードを動かすと、

You have an error in your SQL syntax near 'DEFAULT, 'AUTO INCREMENT here?')' at line 1

というメッセージと共にSQLExceptionが発生した。
そのサーバーに対してMySQLのコマンドライン(クライアント)からサンプルコードと同等の処理である
INSERT INTO ... VALUES (DEFAULT, "...");

を実行すると、同様のエラーとなった。

MySQLのinfoによると、MySQLをconfigureする時にDONT_USE_DEFAULT_FIELDSを指定すると、そういう動作になるらしい。このコンパイルオプションはバージョン5.0.2で削除されているが、システム変数sql_modeをSTRICT_TRANS_TABLESにすると同じことが起こる。

このエラーを回避するには、rs.insertRow();の前に

rs.updateInt("priKey", 0);

を足すと良い。
第2引数は、0以外だと、auto incrementの初期値を与えることになるので正しくない。

About 2007年09月

2007年09月にブログ「Weblog on mebius.tokaichiba.jp」に投稿されたすべてのエントリーです。過去のものから新しいものへ順番に並んでいます。

前のアーカイブは2007年08月です。

次のアーカイブは2007年10月です。

他にも多くのエントリーがあります。メインページアーカイブページも見てください。

Powered by
Movable Type 3.35