- PR -

JSP で PostgreSQL へアクセスすると、『ClassNotFoundException』エラーが発生。

1
投稿者投稿内容
mae
会議室デビュー日: 2006/09/22
投稿数: 4
投稿日時: 2006-09-22 16:04
JSP を作成するため、Tomcat3、その他をインストールし、PostgreSQL へのアクセスをテストしましたが、エラーが出てアクセスできません。(PostgreSQL へアクセスしない JSP は OK)
発生したエラーは、『java.lang.ClassNotFoundException: org.postgresql.Driver』。
ここ1週間くらいこのトラブルと格闘していますが、依然として解消しません。
但し、TOMCAT_HOME の下に bin デレクトリーを作り、JDBC ドライバーを入れた後に一度アクセスする事ができましたが、システムを再起動後はアクセスできなくなりました

JDBC ドライバーを /var/lib/tomcat3/common/lib/ に配置しているので、CLASSPATH の設定は必要ないと思われましたが、エラーが発生したので念の為、".bash_profile" に "export CLASSPATH=/var/lib/tomcat3/common/lib/pg73jdbc2.jar" と入れましたが、解消しません。

『# jar -tf /var/lib/tomcat3/common/lib/pg73jdbc2.jar』を実行したところ、『org/postgresql/Driver.class』が抽出されましたので、ドライバクラスに間違いはないと思います。

一体何が悪いのでしょうか。
どなたか、原因と解決策をご教授の程お願い致します。

尚、テスト用JSP、環境、インストール場所等は以下の通りです。

<テスト用JSP>
以下のJSPは、発生しているエラーのテスト用に作成したもので、他のロジックは全て削除してあります。

<%@ page language="java" contentType="text/html; charset=UTF-8" %>
<%@ page import="java.sql.*" %>
<HTML>
<HEAD><TITLE>test</TITLE></HEAD>
<BODY>
test<BR>
<%
Class.forName("org.postgresql.Driver");
Connection conn = DriverManager.getConnection("jdbc:postgresql:jinji", "apache", "");
conn.close();
%>
</BODY>
</HTML>

<環境>
・OS :RedHat Linux 9 (カーネル:2.4.20-
・PostgreSQL:7.3.2 (RedHat Linux 9 インストール時のもの)
・Apache :2.0.40-21 (RedHat Linux 9 インストール時のもの)

・Tomcat:3-3.3.2-1 (tomcat3-3.3.2-1jpp.noarch.rpm をダウンロードしインストール)
・JDK :1.3.1_18 (jdk-1.3.1_18.i586.rpm をダウンロードしインストール)
・mod_jk:1.2.14.1 (jakarta-tomcat-connectors-1.2.14.1-src.tar.gz をダウンロードしインストール)
・JDBC :pg73jdbc2.jar (http://jdbc.postgresql.org/download.html よりダウンロードしインストール)

<インストール場所>
・Tomcat3:/usr/share/
・JDK :/usr/java/
・mod_jk :/usr/lib/httpd/modules/
・JDBC :/var/lib/tomcat3/common/lib/ <--- lib が無かったので新規作成

以上。
uk
ぬし
会議室デビュー日: 2003/05/20
投稿数: 1155
お住まい・勤務地: 東京都
投稿日時: 2006-09-22 16:46
引用:

maeさんの書き込み (2006-09-22 16:04) より:
<インストール場所>
・Tomcat3:/usr/share/
・JDBC :/var/lib/tomcat3/common/lib/ <--- lib が無かったので新規作成


Tomcat3とは、また古いバージョンですね。
それはともかく、Tomcatのインストールディレクトリが/usr/shareなのに、ドライバ
の配置場所が/var/lib/tomcat3/common/lib/というのがよくわかりません。Tomcat3の
ドキュメントを見る限りでは、Tomcatのインストールディレクトリ/lib/commonに
入れるのが妥当ではないですか?

このアプリケーションでしか使わないのであれば、WEB-INF/libの下でもいいですけどね。
mae
会議室デビュー日: 2006/09/22
投稿数: 4
投稿日時: 2006-09-22 19:51
ご回答ありがとうございます。
Tomcatのインストールディレクトリが/usr/shareなのに、ドライバの配置場所が/var/lib/tomcat3/common/lib/という件ですが、/usr/share/tomcat3にインストールされているのは、conf,lib,logs,webapps,workのリンクのみで実体は他の場所にあります。
その為、ドライバの配置場所が/var/lib/tomcat3/common/lib/になっています。
(libが無かったので新規作成と書きましたが、作成したのはcommonの下のlibです)

Tomcatのインストールディレクトリ/lib/commonに入れるのが妥当ではないかとの事ですが、/usr/share/tomcat3/lib(リンク)のリンク先が、/var/lib/tomcat3になり、ここにcommonがあります。ドライバは実はcommonの下とcommon/libの下に配置しています。

このアプリケーションでしか使わないのであれば、WEB-INF/libの下でもいいとありますが、実はwebappsの下にあるROOT,admmin,examplesの下のそれぞれのWEB-INF/libの下にもドライバーを配置しています。

この様にあちこちにドライバーを配置しているのは、エラーが発生している為で、原因が特定されれば不要なドライバーは削除します。

エラーは、Tomcatのインストールディレクトリ/usr/share/tomcat3にあるのはリンクのみで、実体は他のディレクトリにある事が原因しているのでしょうか?
(この様なディレクトリ構成は、rpmをインストールした時にできたものです)
あと分からないのは、一度はDBにアクセスできたにも関わらず、システムを再起動したらエラーになっていたのは、原因として何が考えられるのでしょうか?

以上、宜しくお願い致します。
99ri
大ベテラン
会議室デビュー日: 2006/09/09
投稿数: 129
投稿日時: 2006-09-23 08:42
tomcat起動時に-classpath 指定をおこなうので環境変数の設定は無効になるのでは?
起動スクリプトを参照してclasspathがどのように設定されているか確認しましょう

http://tomcat.apache.org/tomcat-3.3-doc/tomcat-ug.html#configuring_classes
ドキュメント Configuring Classesの項で
現在の環境のフォルダとjarファイルの対応つけ(lib/commonに相当するのはどこか)
を確認したほうがいいかと思います


[ メッセージ編集済み 編集者: 99ri 編集日時 2006-09-23 08:45 ]
mae
会議室デビュー日: 2006/09/22
投稿数: 4
投稿日時: 2006-09-23 17:17
ご回答ありがとうございます。
tomcat起動時に-classpath 指定をおこなうので環境変数の設定は無効になるのではとの事ですが・・・
今回のトラブルが起きてから本・ネット等で調べた範囲では、「common/lib の下に置けば自動的にCLASSPATHが追加される、それ以外に置いた場合はCLASSPATHを設定しなさい」というのが多くありました。
この指摘はTomcat3.3.2には当てはまらないのでしょうか?
CLASSPATHの設定が効いていないのが疑問ではあったのですが、環境変数の設定が無効になるという事であれば、どの様にすれば良いのでしょうか?

起動スクリプトで、classpath がどのように設定されているかという件ですが、お恥ずかしいですが見ても良く分かりませんでした。
以下に、起動スクリプトの抜粋をコピーしましたが、これからどの様な事が分かるのでしょうか?

○/etc/rc.d/init.d/tomcat3 の中に、直接 CLASSPATH の記述はありませんが、tomcat3 の中で参照している、TOMCAT_SCRIPT=/usr/bin/dtomcat3 には、次の様な記述があります。

○/usr/bin/dtomcat3 の中で、CLASSPATH の記述部分を抜粋。

 CLASSPATH の記述箇所は多々ありますが、関係すると思われる部分のみ抜粋しました。
 スクリプトの中にある、${TOMCAT_INSTALL} の内容は、/etc/tomcat3/conf/tomcat3.conf の中で、TOMCAT_INSTALL="/usr/share/tomcat3" と記述されています。

## --------------------------- 抜粋 ---------------------------
      ・
      ・
## -------------------- Prepare CLASSPATH --------------------
MAIN=org.apache.tomcat.startup.Main
export MAIN

oldCP=$CLASSPATH
unset CLASSPATH
CLASSPATH=${TOMCAT_INSTALL}/lib/tomcat.jar:${TOMCAT_INSTALL}/lib/common/commons-logging-api.jar

# Ignore previous CLASSPATH

# This is consistent with "java -jar tomcat.jar "
export CLASSPATH
      ・
      ・
if [ "$oldCP" != "" ]; then
CLASSPATH=${oldCP}
export CLASSPATH
else
unset CLASSPATH
fi
## -----------------------------------------------------------/

ドキュメント Configuring Classesの項で、現在の環境のフォルダとjarファイルの対応つけ(lib/commonに相当するのはどこか)を確認する件ですが、このドキュメントによると lib/common には connector_util.jar、core_util.jar,、etomcat.jar・・・等の jar があるところという事になりますが、当方の環境では、/var/lib/tomcat3/common にそれらがありますので、問題はないかと思います。

ドライバは/var/lib/tomcat3/common に下にも配置してありますが、なぜ認識されないのでしょうか?

疑問だらけですが、宜しくお願い致します。
99ri
大ベテラン
会議室デビュー日: 2006/09/09
投稿数: 129
投稿日時: 2006-09-24 00:42
現環境にご自身が作成されたWEBアプリの WEB-INF/lib に
ドライバがあり上記エラーになる場合
問題の切り分けのため下記仮対処を行わないでください

仮対処
 unset CLASSPATH の下で行っている
 CLASSPATH=にドライバのjarファイルを追記してみて下さい
:${TOMCAT_INSTALL}/lib/common/pg73jdbc2.jar

java コマンドで-classpath 指定した場合は環境変数CLASSPATHを使用しません
環境変数CLASSPATH をexport しているので -classpath 指定ではないようです

CLASSPATH の記述箇所は抜粋しすぎてよくわかりませんでした
肝心のcommon/lib の記述がありませんし
exportが何行かあるので条件付で設定しているようです

 oldCP=$CLASSPATH で起動前の値を保持しておき
 unset CLASSPATH  で起動前の設定は一旦解除しています

[ メッセージ編集済み 編集者: 99ri 編集日時 2006-09-24 01:35 ]

[ メッセージ編集済み 編集者: 99ri 編集日時 2006-09-24 07:26 ]
mae
会議室デビュー日: 2006/09/22
投稿数: 4
投稿日時: 2006-09-24 13:06
uK 様、99Ri 様 有り難うございました。
お陰さまをもちまして、トラブルが無事解決しました。
貴重なご意見、有り難うございました。
1

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