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

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

ただいまの
回答率

87.37%

eclipseでjarファイルがあってもJava.lang.ClassNotFoundException:mysql.jdbc.Driverのエラーがでる

解決済

回答 3

投稿

  • 評価
  • クリップ 1
  • VIEW 4,544

score 6

java初心者のものです。書籍の内容どおりに進めてたらエラーにひっかりまして、
「Java.lang.ClassNotFoundException:mysql.jdbc.Driver」で調べたところjarファイルが設定していないとでたので、確認したところちゃんとWEB-INF、libにjarファイルを設定していますし、クラスパスも「ビルドパスの構成」から設定しているのにエラーになる原因がわかりません。

コンソールのエラー

java.sql.SQLException: con.mysql.jdbc.Driver
    at org.apache.catalina.realm.JDBCRealm.open(JDBCRealm.java:645)
    at org.apache.catalina.realm.JDBCRealm.startInternal(JDBCRealm.java:718)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
    at org.apache.catalina.realm.CombinedRealm.startInternal(CombinedRealm.java:214)
    at org.apache.catalina.realm.LockOutRealm.startInternal(LockOutRealm.java:120)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
    at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:905)
    at org.apache.catalina.core.StandardEngine.startInternal(StandardEngine.java:262)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
    at org.apache.catalina.core.StandardService.startInternal(StandardService.java:439)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
    at org.apache.catalina.core.StandardServer.startInternal(StandardServer.java:760)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
    at org.apache.catalina.startup.Catalina.start(Catalina.java:625)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:351)
    at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:485)
Caused by: java.lang.ClassNotFoundException: con.mysql.jdbc.Driver
    at java.net.URLClassLoader.findClass(URLClassLoader.java:382)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:264)
    at org.apache.catalina.realm.JDBCRealm.open(JDBCRealm.java:641)
    ... 19 more

ソースコード

package chapter10;

import java.io.IOException;
import java.util.UUID;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

/**
 * Servlet implementation class TransactionTokenServlet
 */
@WebServlet("/TransactionTokenServlet1")
public class TransactionTokenServlet1 extends HttpServlet {
  TransactionTokenBean tranTokenBean=new TransactionTokenBean();
@Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

  int studentNo;
  String studentName;
  int schoolYear;

  try{
    studentNo=Integer.parseInt(request.getParameter("studentno"));
    studentName=request.getParameter("studentname");
    schoolYear=Integer.parseInt(request.getParameter("schoolyear"));
  }catch(NumberFormatException e){
    getServletContext().getRequestDispatcher("/errorinput.html").forward(request, response);
    return;

  }
  tranTokenBean.setStudentNo(studentNo);
  tranTokenBean.setStudentName(studentName);
  tranTokenBean.setSchoolYear(schoolYear);

  HttpSession session=request.getSession();
  session.setAttribute("tranTokenBean", tranTokenBean);

  String tokenID=UUID.randomUUID().toString();
  session.setAttribute("tokenID", tokenID);

  getServletContext().getRequestDispatcher("/transanctiontoken_check.jsp").forward(request,response);
    }

}

試したこと

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

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

Eclipse4.5
Widows7
tomcat8
jdbcドライバー:mysql-connection-java-8.0.17.jar
jdk1.8.0_211
MySQL Server5.7

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

+1

java.sql.DriverManager

かなりの人がなぜ12年前の技術で書くんだい?

DriverManagerメソッドgetConnectionとgetDriversは、Java Standard Edition サービス・プロバイダ・メカニズムをサポートするように拡張されました。JDBC 4.0ドライバは、ファイルMETA-INF/services/java.sql.Driverを含める必要があります。このファイルには、java.sql.DriverのJDBCドライバ実装の名前が含まれます。たとえばmy.sql.Driverクラスをロードするために、META-INF/services/java.sql.Driverファイルに次のエントリが含まれます。

書かないでいいものを書くからそういうバグになるんだけど

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/09/03 21:55

    本題は、$CATALINA_HOME/conf/server.xmlに記述するrealm要素にドライバー名を記述する。ドライバー名を正しくしてほしい、ということです。

    キャンセル

  • 2019/09/03 22:00

    JDBC 4.0は、javaアプリケーションで機能しますが、webアプリケーションの場合に有効にならないので、仕方なくClass.forName()している。これがメモリリークする可能性をもたらす。これは別の話です。いつか詳しく説明します。

    キャンセル

  • 2019/09/03 22:01

    ああすまん、1つめの回答で引きずられた

    キャンセル

checkベストアンサー

0

問題を含んでいるのはそのソースではなさそうです(chapter10 はエラーログのどこにも出ていない)。

エラー文の主要な行は以下の二つで、

java.sql.SQLException: con.mysql.jdbc.Driver

Caused by: java.lang.ClassNotFoundException: con.mysql.jdbc.Driver

con.mysql.jdbc.Driver というクラスが見つかりませんと述べています。

java の Class.forName("com.mysql.jdbc.Driver"); とするべきところ、m → n となってしまったのだと思います。

ソースコードに心当たりがなければ、設定ファイルなどに記載したものが最終的に上記のコードにわたっているのかもしれません。

con.mysql.jdbc.Driver を全文検索するなどして原因箇所を発見し、com.mysql.jdbc.Driverに修正してください。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/09/03 20:52

    なんでみんな 12年以上前に書かなくてもよくなった

    Class.forName

    をかくかね

    キャンセル

0

JDBC RealmおよびDataSource Realmは、データベースで認証用のユーザ情報を管理する方法です。

ドライバー名はsever.xmlに記述することになっています。書籍にeclipseで開発する際の設定方法が書いてあるはず。ドライバー名を正しくしてください。

ドライバー用のjarはWEB-INF/lib配下ではなく、$CATALINA_HOME/lib配下に置くことをすすめます。ドライバーが原因でメモリーリークする可能性があるため。

Tomcat 8 JDBCRealm 追記 (2019-9-4)

Tomcat 8 のJDBCRealmを参照してください。JDBCRealm

$CATALINA_BASE/conf/server.xml に記述する内容です。

<Realm className="org.apache.catalina.realm.JDBCRealm"
      driverName="org.gjt.mm.mysql.Driver"
   connectionURL="jdbc:mysql://localhost/authority?user=dbuser&amp;password=dbpass"
       userTable="users" userNameCol="user_name" userCredCol="user_pass"
   userRoleTable="user_roles" roleNameCol="role_name"/>

ご自分の設定の driverName の部分が間違っていると思われます。修正しましょう。

また、JDBCドライバーは $CATALINA_HOME/lib 配下に置くように言っています。jarファイルでなければならない。zipファイルはだめのよう。

To set up Tomcat to use JDBCRealm, you will need to follow these steps:

    <省略>
    Place a copy of the JDBC driver you will be using inside the $CATALINA_HOME/lib directory. Note that only JAR files are recognized!
    <省略>


上はTomcat単独の設定です。eclipseでTomcatを起動しているなら、プロジェクトビューの中の Serverフォルダの下にserver.xmlがあるはず。その中身を調べて、ドライバー名を正しくしてください。

driverName="com.mysql.jdbc.Driver"

質問があれば歓迎します。server.xmlの場所を見つけてください。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 87.37%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る