前提・実現したいこと
EclipseでJavaの簡易アプリを作っており、「ログイン機能の実装」をするにあたりJDBCドライバの読み込みエラーが発生し、困っています。
これを解消し、テーブル内に登録されたid,passでログインすることを目標としています。
発生している問題・エラーメッセージ
java.lang.NoClassDefFoundError: java/sql/Driver java.base/java.lang.ClassLoader.findBootstrapClass(Native Method) java.base/java.lang.ClassLoader.findBootstrapClassOrNull(ClassLoader.java:1258) java.base/java.lang.System$2.findBootstrapClassOrNull(System.java:2134) java.base/jdk.internal.loader.ClassLoaders$BootClassLoader.loadClassOrNull(ClassLoaders.java:118) java.base/jdk.internal.loader.BuiltinClassLoader.loadClassOrNull(BuiltinClassLoader.java:616) java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:579) java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:522) org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1284) org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1187) java.base/java.lang.Class.forName0(Native Method) java.base/java.lang.Class.forName(Class.java:315) dao.IdpwDAO.isLoginOK(IdpwDAO.java:22) servlet.LoginServlet.doPost(LoginServlet.java:43) javax.servlet.http.HttpServlet.service(HttpServlet.java:652) javax.servlet.http.HttpServlet.service(HttpServlet.java:733) org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
該当のソースコード
Java
1package dao; 2 3import java.sql.Connection; 4import java.sql.DriverManager; 5import java.sql.PreparedStatement; 6import java.sql.ResultSet; 7import java.sql.SQLException; 8 9public class IdpwDAO { 10 // ログインできるならtrueを返す 11 public boolean isLoginOK(String id, String pw) { 12 Connection conn = null; 13 boolean loginResult = false; 14 String servername = "localhost"; 15 String databasename = "Sample_db"; 16 String user = "root"; 17 String password = "********"; 18 String url = "jdbc:mysql://" + servername + "/" + databasename + "?serverTimezone=JST"; 19 20 try { 21 // JDBCドライバを読み込む 22 Class.forName("com.mysql.cj.jdbc.Driver"); 23 24 // データベースに接続する 25 conn = DriverManager.getConnection(url, user, password); 26 27 // SELECT文を準備する 28 String sql = "select count(*) from IDPW where ID = ? and PW = ?"; 29 PreparedStatement pStmt = conn.prepareStatement(sql); 30 pStmt.setString(1, id); 31 pStmt.setString(2, pw); 32 33 // SELECT文を実行し、結果表を取得する 34 ResultSet rs = pStmt.executeQuery(); 35 36 // ユーザーIDとパスワードが一致するユーザーがいたかどうかをチェックする 37 rs.next(); 38 if (rs.getInt("count(*)") == 1) { 39 loginResult = true; 40 } 41 } 42 catch (SQLException e) { 43 e.printStackTrace(); 44 loginResult = false; 45 } 46 catch (ClassNotFoundException e) { 47 e.printStackTrace(); 48 loginResult = false; 49 } 50 finally { 51 // データベースを切断 52 if (conn != null) { 53 try { 54 conn.close(); 55 } 56 catch (SQLException e) { 57 e.printStackTrace(); 58 loginResult = false; 59 } 60 } 61 } 62 63 // 結果を返す 64 return loginResult; 65 } 66} 67
試したこと
javaのビルドパスでクラスパスの方にmysql-connector-java-8.0.25.jarを通しています。
上記のコードは別にあるservletファイルで実行するメソッドIdpwDAO用のファイルです。
そのため実行時にはサーバーで実行を押していますが、これとは別にDBにアクセスし内容を表示するコードを書き、javaアプリケーションで実行するとDBの中身が表示されるので、なぜサーバーを介すとできないのかな?と悩んでおります。
pleiadesの最新(2021-06)をインストールすると、サーバー起動の所でエラーになりました。
調べると最新バージョンはバグがでやすくおすすめしないとのことだったので、諦めました。
回答よろしくお願いいたします。
補足情報(FW/ツールのバージョンなど)
pleiades-2021-03
tomcat9
java11
データベースはmysqlを使用しており、DBViewerにて登録内容など正常であることを確認済みです。
tomcat9のフォルダのlib直下にmysql-connector-java-8.0.25.jarを配置しています。
プロジェクトの種類:動的Webプロジェクト
構成
[環境変数]
JAVA_HOME:C:\Users***\Downloads\pleiades-2021-03-java-win-64bit-jre_20210328\pleiades\java\11
Path(システム):%JAVA_HOME%\bin
Path(ユーザー):C:\Program Files\MySQL\MySQL Server 8.0\bin