質問: (Connection) DriverManager.getConnection( "jdbc:mysql://localhost:3306/learning", "root", ""); return con; } catch(Exception e) { throw new IllegalStateException(e); } } } ```
回答: サーブレット内で Class.forName().newInstance() しているのなら、毎回ビルドパスに追加するのが正しいやり方です。Javaランタイム環境やTomcatランタイム環境にライブラリを追加してしまう方法もありますが、少々乱暴なので紹介しません。 Servlet仕様やJavaEE仕様では、コンテナ(Tomcat, Glassfish, JBossなど)と JavaEEアプリケーション、Webアプリケーションそれぞれに分担があって、その分担ごとにライブラリを置く場所が決まります。 RyoMさんはWebアプリケーションを作成していますが、サーブレットが自力でDB接続を手に入れているので、ライブラリもサーブレットのすぐそばに置くのが正しい。 Eclipseでは、WebContent/WEB-INF/lib にライブラリを格納するか、ビルドパスに追加したうえで、Deployment Assembly 設定画面で、追加したライブラリを指定します。こうすることで、warファイルを作成したときライブラリが同梱され、warファイル単独で別環境にデプロイできるようになります。 一歩進め、DB接続をコンテナ側に任せ、WebアプリケーションはコンテナからDB接続を借り受けて接続する、といった構成にする場合、コンテナのクラスパスにライブラリを追加して、コンテナの設定にDB接続を追加します。サーブレットからは、借り受けるDB接続を web.xml に記載して利用します。 Eclipse WTPで Tomcat を使っている状況なら、サーバーの実行時設定のクラスパスにライブラリを追加するか catalina/lib にライブラリを格納し、Serversプロジェクトの中にある Tomcat の context.xml に、JNDI DataSource を設定し、Webアプリケーションからは InitialContext から DataSource を取り出して使います。 Java EE 6仕様のCDIを使うのであれば、Webアプリケーションはコンテナから DataSource を与えてもらって使うという、とてもすっきりしたやり方になります。たしかTomcatだけではできない(別途CDIを導入する必要がある)ので、JBoss AS や Glassfish を使うようになったら検討してみてください。場合によってはTomcatをがんばって使い続けるよりも話が早いかもしれません。 追記: マイナス評価されていますね......もし間違っている点がありましたらご指摘ください。指摘が無いと、なぜマイナス評価なのだか、質問者や読み手にとっても回答が妥当なのか誤っているのかさえ判断がつかないので困ってしまうので、コメントを投稿してください。あるいはこの回答を超える回答をしてもらってもよいかと。