- JAVA
No suitable driver foundの原因と直し方|Java JDBC
java.sql.SQLException: No suitable driver found for jdbc:mysql://localhost:3306/mig は、DriverManager.getConnection に渡した URL を扱える JDBC ドライバーが、1つも見つからなかったときのエラーです。 原因は2つに分かれます。
| 原因 | 見分け方 | 直し方 |
|---|---|---|
| ドライバーの jar が、実行時のクラスパスに無い | URL は正しい。Class.forName("ドライバーのクラス") が ClassNotFoundException |
依存関係に追加(Maven・Gradle)、実行時のクラスパスに入っているか確かめる |
| URL の書き間違い | エラー文の for のあとの URLが、正しい形と違う |
jdbc:mysql://・jdbc:postgresql:// の形に直す |
エラー文の for のあとに、実際に渡された URL がそのまま表示されます。 まずここを見ます。前後の空白や、置き換えられていない ${DB_URL} も、そのまま出ます。
確認環境:Java 21、PostgreSQL JDBC Driver 42.7.2(PostgreSQL 16)、MariaDB Connector/J 2.7.6(MySQL 8.0)(確認日 2026年10月11日)。MySQL Connector/J(com.mysql.cj.jdbc.Driver)の jar は、確認環境で用意できなかったため、MySQL 8.0 への接続は MariaDB Connector/J で再現しました。
本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。
(記載例)出典:株式会社RJC「No suitable driver foundの原因と直し方|Java JDBC」
ドライバーの jar が無いとき
(ドライバーの jar をクラスパスに入れずに実行)
java.sql.SQLException: No suitable driver found for jdbc:postgresql://localhost:5432/reldemo
URL が正しくても、ドライバーが無いと、すべての URL でこのエラーになりました(SQLState は 08001)。ドライバーが読み込まれているかは、次のどちらかで確かめられます。
DriverManager.drivers().forEach(d -> System.out.println(d.getClass().getName()));
// ドライバーが無いと何も出ない。あれば org.postgresql.Driver など
Class.forName("org.postgresql.Driver");
// 無ければ java.lang.ClassNotFoundException: org.postgresql.Driver
| DB | ドライバーのクラス | Maven の依存関係 |
|---|---|---|
| MySQL | com.mysql.cj.jdbc.Driver |
com.mysql:mysql-connector-j |
| PostgreSQL | org.postgresql.Driver |
org.postgresql:postgresql |
| MariaDB | org.mariadb.jdbc.Driver |
org.mariadb.jdbc:mariadb-java-client |
依存関係に書いたのに見つからない
| 確認すること | 内容 |
|---|---|
Maven の scope |
test・provided は、アプリの実行時のクラスパスに入らない(Maven 公式ドキュメント)。runtime か、scope を書かない(compile) |
| 実行のしかた | java -cp アプリ.jar で、依存する jar を -cp に入れていない |
| IDE で動くのに、ビルドした jar で動かない | 下の「fat jar」を確認 |
Class.forName は、jar が無いことの解決にはなりません。 jar があれば、PostgreSQL のドライバーは Class.forName を書かなくても自動で読み込まれました(PostgreSQL JDBC の公式ドキュメントでも、Java 1.6 以降は不要とされています)。
URL の書き間違い:どの間違いで、このエラーになるか
ドライバー(PostgreSQL・MariaDB)を入れた状態で、URL だけを変えて試しました。
| URL | 結果 |
|---|---|
jdbc:postgresql://localhost:5432/reldemo |
接続できた |
jdbc:postgres://localhost:5432/reldemo |
No suitable driver(postgresql の ql が抜けている) |
postgresql://localhost:5432/reldemo |
No suitable driver(jdbc: が無い) |
jdbc:postgresql//localhost:5432/reldemo |
No suitable driver(: が無い) |
JDBC:POSTGRESQL://localhost:5432/reldemo |
No suitable driver(大文字) |
jdbc:postgresql://...(先頭に空白) |
No suitable driver |
jdbc:postgresql://localhost:5432/reldemo(末尾に空白) |
接続まで進み、FATAL: database "reldemo " does not exist(別のエラー) |
${DB_URL}(置き換えられていない) |
No suitable driver for ${DB_URL} |
null |
The url cannot be null(別のエラー) |
jdbc:mysql://localhost:3306/mig |
接続できた(MariaDB Connector/J 2.7.6) |
mysql://localhost:3306/mig |
No suitable driver(jdbc: が無い) |
jdbc:mysql:/localhost:3306/mig(/ が1つ) |
'//' is not present in the url(ドライバーの URL 解析のエラー) |
jdbc:postgres:// は、postgres という名前に引きずられやすい書き間違いです。JDBC では jdbc:postgresql:// と書きます(PostgreSQL JDBC の公式ドキュメント)。また、jdbc: の付かない postgresql://ホスト/DB の形の URL(環境変数などで渡されることがある形)も、上の表のとおり、そのままでは JDBC の URL として使えませんでした。
先頭の空白や ${DB_URL} は、設定ファイルや環境変数から読んだときに起きます。 設定ファイルの = のあとに空白がある、プロパティの置き換えが効いていない、などです。エラー文の for のあとをよく見ると、空白が2つ並んでいる(for jdbc:)ことで気づけます。
MySQL の URL
jdbc:mysql://ホスト:3306/DB名?プロパティ
MySQL Connector/J の公式ドキュメントでは、jdbc:mysql: のほか、jdbc:mysql:loadbalance:・jdbc:mysql:replication: などが使えるとされています。MariaDB Connector/J を使うなら jdbc:mariadb:// と書くのが確実です(確認環境の 2.7.6 では jdbc:mysql:// でも接続できましたが、版によって扱いが違うことがあります)。
fat jar で、片方のドライバーだけ見つからない
複数の jar を1つにまとめた jar(fat jar・uber jar)で、PostgreSQL と MariaDB の両方のドライバーを入れたのに、PostgreSQL だけ No suitable driver になりました。
drivers=[org.mariadb.jdbc.Driver] ← PostgreSQL のドライバーが無い
[jdbc:postgresql://localhost:5432/reldemo] No suitable driver found for jdbc:postgresql://...
[jdbc:mysql://localhost:3306/mig] OK MariaDB Connector/J 2.7.6
unzip -p app.jar META-INF/services/java.sql.Driver
org.mariadb.jdbc.Driver ← PostgreSQL の行が無い
ドライバーは、jar の中の META-INF/services/java.sql.Driver というファイルで自動登録されます。 2つの jar を展開してまとめたとき、同じ名前のこのファイルが、あとから入れた MariaDB の jar の内容で上書きされ、PostgreSQL の行が消えていました。クラスは jar の中にあるので、Class.forName("org.postgresql.Driver") は成功し、そのあとは接続できました。
| 直し方 | 内容 |
|---|---|
Maven Shade Plugin なら ServicesResourceTransformer |
META-INF/services のファイルを上書きせず、中身をつなげる(Maven 公式ドキュメント) |
| 結果の確認 | unzip -p app.jar META-INF/services/java.sql.Driver に、使うドライバーがすべてあるか |
| 回避 | Class.forName("org.postgresql.Driver") で明示的に読み込む |
<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer"/>
</transformers>
確認環境でも、META-INF/services/java.sql.Driver に両方の行(org.postgresql.Driver・org.mariadb.jdbc.Driver)を書くと、両方のドライバーが登録され、どちらの DB にも接続できました。
Tomcat で動かすとき
Tomcat の公式ドキュメントでは、Tomcat の設定(context.xml の Resource)で DataSource を作る場合、JDBC ドライバーの jar を $CATALINA_HOME/lib に置くとされています。また、WEB-INF/lib に入れたドライバーは、自動では登録されないので、アプリの中で明示的に登録する必要があるとされています。
| ドライバーの置き場所 | 自動登録 |
|---|---|
$CATALINA_HOME/lib・$CATALINA_BASE/lib |
される(Tomcat の DataSource もここから読み込む) |
WEB-INF/lib(war の中) |
されない。Class.forName などで明示的に登録 |
(Tomcat での動作は、確認環境では試していません。公式ドキュメントの記述によります)
確認の手順(チェックリスト)
| 順番 | 確認すること | 方法 |
|---|---|---|
| 1 | 実際に渡された URL | エラー文の for のあと(空白・${...}) |
| 2 | URL の形 | jdbc:mysql://・jdbc:postgresql://(postgres ではない) |
| 3 | ドライバーが読み込まれているか | DriverManager.drivers()、Class.forName |
| 4 | 依存関係 | 書いてあるか、scope が test・provided でないか |
| 5 | fat jar | unzip -p app.jar META-INF/services/java.sql.Driver |
| 6 | Tomcat | ドライバーの jar が $CATALINA_HOME/lib にあるか |
JDBC での接続・SQL の実行の基本は、関連記事の「Java JDBCでMySQL接続|PreparedStatementとCRUD」で扱っています。
よくある質問
Q. Spring Boot でも出ますか。
A. Spring Boot 固有のエラー文は、確認環境では試していません。URL(spring.datasource.url)の書き間違いと、ドライバーの依存関係の不足は、どの環境でも起きる原因なので、上の手順で確かめます。
Q. Class.forName を書けば直りますか。
A. jar が無ければ ClassNotFoundException になるだけで、直りません。URL の書き間違いも直りません。fat jar で services のファイルが上書きされた場合と、Tomcat の WEB-INF/lib の場合には、回避になります。
まとめ
- URL を扱えるドライバーが無いエラー。エラー文の
forのあとが、実際に渡された URL - ドライバーの jar が実行時に無い:依存関係、
scope(test・provided は実行時に入らない) - URL の書き間違い:
jdbc:の抜け、jdbc:postgres:、大文字、先頭の空白、置き換えられていない${...} - fat jar では
META-INF/services/java.sql.Driverが上書きされることがある。Shade ならServicesResourceTransformer - Tomcat は
$CATALINA_HOME/libにドライバーを置く
参考・出典
確認日はいずれも 2026年10月11日です。
- PostgreSQL JDBC Driver「Initializing the Driver」:https://jdbc.postgresql.org/documentation/use/
- MySQL Connector/J Developer Guide「Connection URL Syntax」:https://dev.mysql.com/doc/connector-j/en/connector-j-reference-jdbc-url-format.html
- MySQL Connector/J Developer Guide「Connecting to MySQL Using the JDBC DriverManager Interface」:https://dev.mysql.com/doc/connector-j/en/connector-j-usagenotes-connect-drivermanager.html
- MySQL Connector/J Developer Guide「Installing Connector/J Using Maven」:https://dev.mysql.com/doc/connector-j/en/connector-j-installing-maven.html
- Java SE 21 API「DriverManager」:https://docs.oracle.com/en/java/javase/21/docs/api/java.sql/java/sql/DriverManager.html
- Apache Maven Shade Plugin「Resource Transformers」:https://maven.apache.org/plugins/maven-shade-plugin/examples/resource-transformers.html
- Apache Maven「Introduction to the Dependency Mechanism」:https://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html
- Apache Tomcat 10.1「JNDI Datasource How-To」:https://tomcat.apache.org/tomcat-10.1-doc/jndi-datasource-examples-howto.html
本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。
(記載例)出典:株式会社RJC「No suitable driver foundの原因と直し方|Java JDBC」
株式会社RJC ― SI事業・SES事業・AI駆動開発。RJCは一緒に成長を楽しめる会社です。
WE ARE HIRING
RJCで一緒に開発しながら、
成長を楽しみませんか?
RJCは、Web・モバイル・AIを活用した開発プロジェクトで、テックリードやPM・PMOも活躍するシステム開発会社です。会社を知る、待遇を確かめる、話を聞いてみる。気になるところ見てみてください!
- 127日年間休日
- 12時間平均残業時間
- 毎日ガチャ遊びココロも大切にする福利厚生。アマギフなどの賞品ラインナップ!
ほかにも、チケットレストラン、書籍読み放題、2年ごとの慰労報奨(休暇 or 金一封)、11期連続の黒字決算。