質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
JDBC

JDBC(Java DataBase Connectivity)は、Javaとリーレーショナルデータベースに接続させる基本的なAPIです。Java上でSQLステートメントを発行することで、データベースの種類に影響を受ないDB操作を可能とします。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

Q&A

解決済

1回答

444閲覧

eclipseの動的webプロジェクトでPostgreSQL JDBCドライバーが java.lang.ClassNotFoundException になる

sisyamo0000

総合スコア3

JDBC

JDBC(Java DataBase Connectivity)は、Javaとリーレーショナルデータベースに接続させる基本的なAPIです。Java上でSQLステートメントを発行することで、データベースの種類に影響を受ないDB操作を可能とします。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

0グッド

0クリップ

投稿2024/02/04 03:54

編集2024/02/05 02:03

実現したいこと

eclipseのプロジェクトで、DBを利用したいのですが、
JDBCドライバーの設定がうまくいきません。

前提

動的webプロジェクトでjspで入力された値を元に、、サーブレットに飛び、DBから取得した値をセットして再びjspに戻り結果を表示するものを作成しています。
DB接続のためにJDBCを設定しているのですが、ビルドパスのライブラリから追加するとプロジェクト直下に配置されてしまいます。
サイトを見ると、webシステムの場合はDBに接続するためにはJDBCドライバーは、WEBーINF/libフォルダーに配置する必要があると書かれていたので、libに格納させるためにlibからビルドパスを設定したり、コピーして貼り付けたりしたのですが入りません。
一度jspを実行したのですが、エラーメッセージを見るとorg.postgresql.Driver のクラスが見つからないために、java.sql.Connection を取得できていないようです。PostgreSQL JDBC ドライバがクラスパスに含まれていないか、または正しくロードされていない可能性があるようなのですが、
パスを設定するのはほぼ初めてなので自信がなく、
libに格納していないからなのか、はたまた別の部分が原因なのかがわかりません。
この場合、原因を解消するためには何をしてみるべきでしょうか??

発生している問題・エラーメッセージ

接続開始。←connectionの確認出力 java.lang.ClassNotFoundException: org.postgresql.Driver at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1353) at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1165) at java.base/java.lang.Class.forName0(Native Method) at java.base/java.lang.Class.forName(Class.java:421) at java.base/java.lang.Class.forName(Class.java:412) at dao.ConnectionDAO.getConnection(ConnectionDAO.java:19) at dao.ConnectionDAO.select(ConnectionDAO.java:34) at DBConnection_JavaEE01.doPost(DBConnection_JavaEE01.java:50) at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:590) at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:205) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:149) at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:174) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:149) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:167) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:482) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:115) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93) at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:673) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:340) at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:391) at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63) at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:896) at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1744) at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52) at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191) at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659) at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) at java.base/java.lang.Thread.run(Thread.java:1583) java.lang.NullPointerException: Cannot invoke "java.sql.Connection.createStatement()" because "this.con" is null at dao.ConnectionDAO.select(ConnectionDAO.java:36) at DBConnection_JavaEE01.doPost(DBConnection_JavaEE01.java:50) at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:590) at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:205) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:149) at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:174) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:149) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:167) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:482) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:115) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93) at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:673) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:340) at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:391) at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63) at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:896) at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1744) at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52) at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191) at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659) at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) at java.base/java.lang.Thread.run(Thread.java:1583) ConnectionDAO: dao.ConnectionDAO@54724bdc←値が格納されているかの確認出力 ConnectionDTO: dao.ConnectionDTO@17cba456←値が格納されているかの確認出力

該当のソースコード

ソースコード

試したこと

ここに問題に対して試したことを記載してください。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

イメージ説明

イメージ説明

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jimbe

2024/02/04 04:25

タイトルが良く分からない文言です。 eclipse に~ではeclipse のプラグインか何かかと思われますが実際はプロジェクトの話ですね。 実現したいことや前提の説明(前提かな?)・エラーメッセージから 『eclipseの動的webプロジェクトでPostgreSQL JDBCドライバーが java.lang.ClassNotFoundException になる』 と何で何が起きているのかを端的に書いて頂いたほうが分かり易いと思います。
jimbe

2024/02/04 04:46 編集

どのようなドライバのファイルを何処から得て(ダウンロードして) WEB-INF/lib に配置したのでしょうか。 Postgresql のバージョンは幾つでしょうか。 (このようなバージョン等の情報を補足に追加して下さい。) ドライバのクラス名はそれで合っていますか?
jimbe

2024/02/04 04:43

>原因を解消するためには何をしてみるべきでしょうか?? 当然ですが、何が原因で起きているのかを確認してください。 データベースを扱う部分を(動的webでなく)普通のコマンドラインで実行するようなプロジェクトに抜き出して実行出来るか試しては如何でしょうか。 それで動くものが出来ればコードに問題は無く、動的webプロジェクトでの環境(言われているようにクラスパスとか)の問題であることが確実になります。
sisyamo0000

2024/02/04 04:53

すみません。 確かに読み返してみると意味のわからない文章になってしまっていました。 ・ダウンロードしているバージョンはPostgreSQLは14.10_1とplogresql-42.7.1(5).jarです。 ・ドライバのクラスはポート番号などは特に変更していないのであっていると思います。 設定の仕方はプロジェクト→ビルドパスの構成→ライブラリークラスパス→ライブラリーの追加→ユーザーライブラリ→新規ProgreSQL JDBCを適用→外部JARの追加→14.10_1,plogresql-42.7.1(5).jar追加 という流れで設定をしました。
jimbe

2024/02/04 07:30 編集

編集ありがとうございます。 >plogresql-42.7.1(5).jar …ファイル名の打ち間違いで postgresql-42.7.1.jar でしょうか。 "(5)" というのはダウンロードを 5 回試した結果勝手に付けられたんですかね。 Eclipse への jar の追加はドライバだけで良いはずです。 PostgreSQL は別途インストールしてサーバを起動しておくことになりますので、 PostgreSQL 自体をクラスパスに入れておく必要は無いでしょう。 で、 Eclipse にドライバのパスを追加してもそれは精々コンパイルの為だけで、実行環境である Tomcat には関係ありません。 ( なのでサーブレットで PostgreSQL ドライバの機能を使わない (JDBC の機能だけを使う) なら Eclipse へのパスの追加は必要ありません。 ) Tomcat は WEB-INF/lib から必要なクラスをロードすることになっていますので、 JDBC の jar はそこにも入れておく必要があります。 Eclipse でのファイルの配置状況を、プロジェクトエクスプローラ部分のスクリーンショット等で見せて頂けますでしょうか。
sisyamo0000

2024/02/04 13:51

丁寧な解説ありがとうございます。 (5)というのは何かのバージョンのことかと思ってました笑 何度も試すうちに5回もダウンロードしてしまっていたのですね、、 初心者でどれがどんな役割を果たしているのかなどがまだ掴めていない部分が多くとても助かります。 画像を新しく添付しましたのでご確認をお願いします。
jimbe

2024/02/04 17:59

画像のマークダウンの中にさらに画像のマークダウンが入ってしまっているようです。 画像のマークダウンは "![説明](URL)" という形式で、説明のところには画像が何なのかを書き(画像が表示出来ない環境でリンクのテキストになったり目の見えない人が使う読み上げソフトで読まれます)、 URL に画像への URL を書きます。 編集枠の下にプレビューがあり、編集すると即プレビューも変わって確認出来ますので、思ったように出来ているか確認しながら試してみてください。
sisyamo0000

2024/02/05 01:15

すみません。今修正しました。 確認をお願いします
jimbe

2024/02/05 05:28

画像が2つ見えました。ありがとうございます。
guest

回答1

0

ベストアンサー

こちらでドライバが読み込めるかだけ試した時の Eclipse の状態です。
Eclipse=2021-09(4.21.0), サーバ=Tomcat10(Java16)
バージョンとパースペクティブの違いで見え方が若干違うかもしれません。
回答用に作ったプロジェクトに幾つかの質問のをいろいろ入れていたのでごちゃごちゃしてますが、WEB-INF/lib に JDBC ドライバを入れ、 index.jsp でボタンを押したら PetListServlet の doGet が呼ばれてドライバのロードをしてから petInfo.jsp が表示される状態です。
一番下のコンソールで loaded JDBC Driver. が表示されていますので、ロード出来ています。(ドライバ名をテキトウにすると ClassNotFoundException になります。)

Eclipse スクリーンショット

投稿2024/02/04 14:40

編集2024/02/05 08:54
jimbe

総合スコア12659

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sisyamo0000

2024/02/05 02:14

DB接続変数のconが依然としてnullなのは、接続がうまくいっていないのではなく、だたどこかしらのコードの間違いなのでしょうか??
jimbe

2024/02/07 05:24 編集

例外のスタックトレースには、 java.lang.ClassNotFoundException: org.postgresql.Driver : at java.base/java.lang.Class.forName(Class.java:412) at dao.ConnectionDAO.getConnection(ConnectionDAO.java:19) : とあります。 これは、 dao.ConnectionDAO クラスの.getConnection メソッド内である ConnectionDAO.java の 19 行目の、 Class クラスの forName メソッドの呼び出しで ClassNotFoundException が発せられていることを指しています。 NullPointerException は、 ClassNotFoundException が発生しているにも関わらずその後の処理を実行しようとしているために発生しているものであって、問題そのものとは関係ありません。 あえてコードの問題と言うなら、(前の質問に書きましたが) 例外を catch しているのに表示するだけで、その後の正常処理を行ってしまうことです。 Javaにおける例外処理のベスト・プラクティス https://www.wantedly.com/companies/moneyforward/post_articles/35690 google検索 "java 例外処理 ベストプラクティス" https://www.google.com/search?q=java+%E4%BE%8B%E5%A4%96%E5%87%A6%E7%90%86+%E3%83%99%E3%82%B9%E3%83%88%E3%83%97%E3%83%A9%E3%82%AF%E3%83%86%E3%82%A3%E3%82%B9 例外処理はただ表示する為にあるのではありません。 ドライバが見つからなかったらその後の処理を行うことが出来ないのは明白なのですから、速やかに処理を中止して(プログラム的に)問題を解決する処理を行うか、解決出来ないならユーザに通知する(本件なら結果を表示する jsp に『問題が発生しました。システム管理者に連絡してください』と言った表示をする)等を行わなければなりません。 ConnectionDAO の getConnection メソッドはあくまでデータベースとの接続をすることが役割なら、そこに直接ユーザへ返答する処理を置くのはやり過ぎですので、出来ることは例外を呼び出し元に通知することです。 getConnection の呼び出し元もさらに呼び出し元に通知することを繰り返せば、やがてサーブレットまで戻ることになるでしょう。サーブレットなら例外を catch してエラーページをユーザに見せることが出来るはずです。 システムは正常処理を書けば良いのではありません。異常が発生した時にどうするのか、単にユーザの入力間違いで数値を入力すべき所に文字を入れたとかの簡単なモノから、ネット通信途中で切断されたとか、コンピュータが物理的に壊れてシステム全体がいきなり止まったとかまで想定し、何処で何が起きたときに何をするのかを決めて異常に対処する処理を(正常処理と同じように確実に)書かなければなりません。 勿論、コンピュータが壊れたとかは OS レベルでも対処出来ることではありませんが、それこそ少しでも何が起きたのかの証拠を残しておくことで後に(ハードウェア的に)対策を取れる可能性があります。(同じような目的で飛行機等にはブラックボックスがあるのですよね。) 家を建てるにしてもただ好きなように間取りを作るだけでなく、耐震とか火事になりにくいとか防犯とか冷暖房のための気密性とか、万が一のことも含めて色々対応させるはずです。 システムも同じく、想定外を極力無くして可能な限り対処し、対処出来ないなら他に任せる為に情報を残すこと、その様に作ることが必要です。
jimbe

2024/02/07 07:05 編集

質問に追加された画像内のパッケージエクスプローラには WEB-INF の下に lib が見当たりません。 回答のように lib を作ってその中にドライバの jar ファイルをコピーしてみては如何でしょうか。
sisyamo0000

2024/02/07 01:31

返信が遅くなりすみません。 libにjarファイルのコピーを入れて更新したら接続ができました! ありがとうございます! 今ある問題のみの解消で考えていましたが、確かに目先のものだけより、遅くてもいいから周辺知識も吸収して学習して力をつけた方がいいでよね。 ありがとうございます!
jimbe

2024/02/07 07:25

接続出来てよかったです。 本題では無い例外についてダラダラと書いてしまいましたが、やりたいことを書くことに集中している時にはなかなか気が回らないものですし、やりたいことをする方法を探して出てくるコード例等はその主題に焦点を当てる為に『エラー処理は省いています』という(時にはそのような注釈も無い)状態ですので必要なことに気が付かなかったりもしてしまいますね。 色々試していれば自ずと失敗も積み重なりますが、次にはもっと良い『失敗した時の処理』になっていくと思います。 見た目的には try {} catch {} が無くなってメソッドに throws SQLException が付くだけで、あまりそうは見えないかも知れませんが ^^;
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問