前提・実現したいこと
Java8で実行していたMySQLを読み込む簡単なサンプルが、Javaのバージョンを10にアップデートしたら、「No suitable driver」エラーとなり、実行できなくなりました。
Java8とJava10は互換性が保証されないと聞いていましたが、もろに影響を受けてしまいました。MySQLで作成したデータベースを、コマンドプロンプトでjavaを実行して表示する簡単なプログラムなのに動かなくなりました。(eclipse等は使っていません)
Java10でMySQLをどのように読み込んだらよいか、ぜひ教えてください。
発生している問題・エラーメッセージ
1. lib/extフォルダの廃止
Java8ではjdbcドライバを「C:\Program Files\Java\jdk1.8.0_111\jre\lib\ext」の下にコピーしていました。
ところがJava10では、extフォルダはありませんでした。
自分でフォルダを作成、コピーして実行すると、次のエラーとなりました。
/lib/ext exists, extensions mechanism no longer supported; Use -classpath instead.
2.CLASSPATHの指定
CLASSPATHを次のように指定して実行すると、次のエラーとなりました。
java.sql.SQLException: No suitable driver found for jdbc:mysql://localhost/sampledb (Sample.java:11)
いろいろな様式でクラスパスを指定してみましたが、結果は同じでした。
3.「Class.forName」を使う
「No suitable driver」の解決方式では「Class.forName」を使ことが広く行われている(Java8以前)ようでしたので、試したところ、次のようにJava10ではコンパイルエラーになってしまいました。、
「例外ClassNotFoundExceptionは報告されません。スローするには、捕捉または宣言する必要があります」
該当のソースコード
Java10/MySQL8
1下記コードを次のコマンドで実行しました。 2 3> set CLASSPATH=C:\java\test;C:\java\testlib\mysql-connector-java-8.0.11.jar 4> java Sample 5import java.sql.*; 6import java.util.*; 7 8public class Sample { 9 static final String URL = "jdbc:mysql://localhost/sampledb"; 10 static final String USERNAME = "root"; 11 static final String PASSWORD = "password"; //書き換えて実行 12 13 public static void main(String[] args) { 14 try (Connection connection = DriverManager.getConnection 15(URL, USERNAME, PASSWORD); 16 Statement statement = connection.createStatement(); ){ 17 String sql = "SELECT * FROM ENGLISH"; 18 ResultSet result = statement.executeQuery(sql); 19 20 while (result.next()) { 21 System.out.print (result.getInt ("STUDENTNO" ) + "\t"); 22 System.out.print (result.getString("STUDENTNAME") + "\t"); 23 System.out.println(result.getInt ("SCORE" )); 24 } 25 } catch (SQLException e) { 26 e.printStackTrace(); 27 } 28 } 29} 30
試したこと
次のような手順で確認しました。
■MySQL8のインストール
△インストール前に、MySQL5.1.12をアンインストールし、さらにMySQL関連のファイルをすべて削除し、完全に空の状態でダウンロード/インストールしました。
△認証方法としては、「Legacy Authentication Method」を選択しました。
(Legacyにしないと、うまくいかないようでしたので、再度インストールしました)
△MySQLに対するパスを設定しました。
■MySQLをコマンドプロンプトで実行し、次のようにデータベースを作成、表示しました。
>mysql –u root –p Enter password: ******** mysql> source sampledb; mysql> use sampledb; mysql>select * from english;
△テーブルは正しく表示されました。
ここで、sampledbは次のように作りました。
MySQL
1CREATE DATABASE SAMPLEDB; 2USE SAMPLEDB; 3CREATE TABLE ENGLISH ( 4 STUDENTNO INT(10), 5 STUDENTNAME VARCHAR(20), 6 SCORE INT 7); 8INSERT INTO ENGLISH VALUES(1001,'野口英雄',70); 9INSERT INTO ENGLISH VALUES(1002,'板垣退助',25); 10INSERT INTO ENGLISH VALUES(1003,'伊藤博文',90);
■次に、作成されたSAMPLEDBをJavaのプログラムで表示することにしました。
△MySQL8のインストールで、「mysql-installer-community-8.0.11.0.msi」が得られました。ダブルクリックすると、「mysql-connector-java-8.0.11.jar」が生成されたので、これがjdbcドライバと判断し、JDKライブラリフォルダへ設定することにしました。
△java8では「C:\Program Files\Java\jdk1.8.0_111\jre\lib\ext」の下にコピーしました。
ところがJava10では、extフォルダはありませんでした。
△仕方がないので、libの下に自分でextフォルダを作成して、JDBCドライバを挿入して実行したら、次のメッセージが出て、叱られました。
/lib/ext exists, extensions mechanism no longer supported; Use -classpath instead.
■「C:\java\test」フォルダを作成し、Sample.javaとjdbcのドライバをコピーして入れました。
△次の結果となりました。
>set CLASSPATH=C:\java\test >java Sample java.sql.SQLException: No suitable driver found for jdbc:mysql://localhost/sampledb (Sample.java:11)
△
ここで、Sample.javaは次のように作りました。
Java
1import java.sql.*; 2import java.util.*; 3 4public class Sample { 5 static final String URL = "jdbc:mysql://localhost/sampledb"; 6 static final String USERNAME = "root"; 7 static final String PASSWORD = "password"; //書き換えて実行 8 9 public static void main(String[] args) { 10 try (Connection connection = DriverManager.getConnection 11(URL, USERNAME, PASSWORD); 12 Statement statement = connection.createStatement(); ){ 13 String sql = "SELECT * FROM ENGLISH"; 14 ResultSet result = statement.executeQuery(sql); 15 16 while (result.next()) { 17 System.out.print (result.getInt ("STUDENTNO" ) + "\t"); 18 System.out.print (result.getString("STUDENTNAME") + "\t"); 19 System.out.println(result.getInt ("SCORE" )); 20 } 21 } catch (SQLException e) { 22 e.printStackTrace(); 23 } 24 } 25}
■前述の方法以外に、次の方法も試してみました。
「C:\java\test」フォルダにSample.java、「C:\java\testlib」にjdbcドライバを入れて実行
△結果は次の通りです。
> set CLASSPATH=C:\java\test;C:\java\testlib\mysql-connector-java-8.0.11.jar > java Sample java.sql.SQLException: No suitable driver found for jdbc:mysql://localhost/sampledb (Sample.java:11)
ほかにもいろいろ試してみましたが、結局上記のエラーとなってしまいます。
何が問題なのでしょうか。Java10とMySQL8の組み合わせが悪いのでしょうか。よろしくお願いします。
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。