44066
Eclipseを使って、Apache+Tomcat+MySqlのWebアプリの勉強をしています。

[参考にしたサイト](http://m12.blog.shinobi.jp/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0-java/eclipse%E3%81%AE%E5%8B%95%E7%9A%84web%E3%83%97%E3%83%AD%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%81%8B%E3%82%89mysql%E3%82%92%E5%91%BC%E3%81%B3%E5%87%BA%E3%81%99)の内容をそのまま（データベース名やユーザ名・パスワードはこちらの環境に合わせて変更）打ち込んで、  
プロジェクトを右クリックして、実行 > サーバで実行 をすると、以下のエラーが出ます。

```

    java.lang.NoClassDefFoundError: java/sql/Driver
    
```

ネットでよく投稿されているのが、

```

    ClassNotFoundException: com.mysql.jdbc.Driver
    
```

で、JDBCドライバのパスがうまく通っていない、とは違う原因のようで、近くの人に聞いてもネットで調べてもわからないので投稿しました。  
どなたかアドバイスをいただけると幸いです。

【 当方の環境 】  
Oxygen.3a Release (4.7.3a)  
jdk1.8.0_131  
apache-tomcat-9.0.7  
mysql-5.7.21  
mysql-connector-java-5.1.46-bin.jar

【 参考にしたサイト 】  
[Eclipseの動的WebプロジェクトからMySQLを呼び出す](http://m12.blog.shinobi.jp/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0-java/eclipse%E3%81%AE%E5%8B%95%E7%9A%84web%E3%83%97%E3%83%AD%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%81%8B%E3%82%89mysql%E3%82%92%E5%91%BC%E3%81%B3%E5%87%BA%E3%81%99)

【 Eclipseのブラウザに出てくるメッセージ（全文） 】

```

    ----------------------------------------------------------------------
    HTTPステータス 500 - Internal Server Error
    ----------------------------------------------------------------------
    Type Exception Report
    メッセージ An exception occurred processing [index.jsp] at line [15]
    説明 The server encountered an unexpected condition that prevented it from fulfilling the request.
    例外
    org.apache.jasper.JasperException: An exception occurred processing [index.jsp] at line [15]
    
    12: 
    13: try { 
    14: // １．JDBC Driver の登録 
    15:     Class.forName("com.mysql.jdbc.Driver").newInstance(); 
    16: // ２．データベースへの接続 
    17:     Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/test_db?useSSL=false", "xxxxx", "xxxxx"); 
    18: // ３．SQL ステートメント・オブジェクトの作成 
    
    Stacktrace:
        org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:593)
        org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:467)
        org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:386)
        org.apache.jasper.servlet.JspServlet.service(JspServlet.java:330)
        javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
        org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
    
    原因
    javax.servlet.ServletException: java.lang.NoClassDefFoundError: java/sql/Driver
        org.apache.jasper.runtime.PageContextImpl.handlePageException(PageContextImpl.java:667)
        org.apache.jsp.index_jsp._jspService(index_jsp.java:191)
        org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
        javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
        org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:444)
        org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:386)
        org.apache.jasper.servlet.JspServlet.service(JspServlet.java:330)
        javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
        org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
    
    原因
    java.lang.NoClassDefFoundError: java/sql/Driver
        java.base/java.lang.ClassLoader.findBootstrapClass(Native Method)
        java.base/java.lang.ClassLoader.findBootstrapClassOrNull(ClassLoader.java:1248)
        java.base/java.lang.System$2.findBootstrapClassOrNull(System.java:2123)
        java.base/jdk.internal.loader.ClassLoaders$BootClassLoader.loadClassOrNull(ClassLoaders.java:125)
        java.base/jdk.internal.loader.BuiltinClassLoader.loadClassOrNull(BuiltinClassLoader.java:617)
        java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:580)
        java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:496)
        org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1211)
        org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1121)
        org.apache.jasper.servlet.JasperLoader.loadClass(JasperLoader.java:122)
        org.apache.jasper.servlet.JasperLoader.loadClass(JasperLoader.java:59)
        java.base/java.lang.Class.forName0(Native Method)
        java.base/java.lang.Class.forName(Class.java:292)
        org.apache.jsp.index_jsp._jspService(index_jsp.java:130)
        org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
        javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
        org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:444)
        org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:386)
        org.apache.jasper.servlet.JspServlet.service(JspServlet.java:330)
        javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
        org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
    
    注意 原因のすべてのスタックトレースは、のログに記録されています
    
```
CC BY-SA 4.0
2018-05-18T02:46:01.377
44052
2018-05-21T06:10:49.827
2018-05-18T03:08:05.323
3060
28560
question
java mysql
NoClassDefFoundError: java/sql/Driver の対処について
環境として「jdk1.8.0_131」と記載されていますが、Tomcatのスタックトレースを見ると、  
jdk9以上で動作しているように見受けます。(`java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:496)`というように、モジュール名が出力されている点から)

Tomcatが利用するJavaを1.8.0_131に変更すると事象解消しないでしょうか?
CC BY-SA 4.0
2018-05-18T12:24:05.943
44066
2018-05-18T12:24:05.943
20098
44052
answer
`NoClassDefFoundError`は、Tomcatのクラスローダーがクラス定義をロードしようとした際に、それが見つからないためスローされます。で、今回問題となっている`java/sql/Driver`というクラスがどこにあるかというと、Java
8以前は`[Javaのインストールディレクトリー]\lib\rt.jar`、Java 9では`[Javaのインストールディレクトリー]\lib\jrt-
fs.jar`にあります。これらのjarファイルはEclipseでTomcatのJREの設定が正しくできていれば、自動的にロードされるはずですが、何らかの理由により、正しくロードできていないのではないかと思います。

まずは、EclipseでTomcatのJREの設定を確認して下さい。そのJREのインストールディレクトリーの`lib`ディレクトリーに`jrt-
fs.jar`か`rt.jar`があるか確認してみて下さい。
CC BY-SA 4.0
2018-05-21T06:10:49.827
44122
2018-05-21T06:10:49.827
21092
44052
answer