状況の説明
JPAまたはJDBCの依存関係を追加して実行したところ、起動時に以下のエラーが発生しました:
***************************
APPLICATION FAILED TO START
***************************
Description:
Failed to configure a DataSource: 'url' attribute is not specified and no embedded datasource could be configured.
Reason: Failed to determine a suitable driver class
Action:
Consider the following:
If you want an embedded database (H2, HSQL or Derby), please put it on the classpath.
If you have database settings to be loaded from a particular profile you may need to activate it (no profiles are currently active).
Spring Bootがクラスパス上にspring-boot-starter-data-jpaまたはspring-boot-starter-jdbcを検出し、DataSourceビーンを構成しようとしました。URLもドライバーも指定されていないため、処理を続行できず即座に起動が失敗します。
発生原因
データベース関連のスターターはSpring Bootの自動構成をトリガーします。クラスパス上にそれらを検出した瞬間、DataSourceビーンを構築しようとします。設定済みのspring.datasource.url(MySQL、PostgreSQLなど)も、自動的に起動できる組み込みデータベース(H2、HSQL、Derby)もない場合、起動は失敗します。
最も多い原因は次の3つです:
- 別のプロジェクトから依存関係をコピーしたが、
application.propertiesの設定を持ってこなかった - 新しいモジュールを作成中で、まだデータベースのセットアップが済んでいない
- データソースの設定は存在するが、ファイルの場所が間違っているか、アクティブでないSpringプロファイルに紐付けられている
解決方法 — 状況に合ったものを選択してください
方法1:application.propertiesにデータベースURLを追加する
実際のデータベースに接続する場合は、以下の行を追加するだけで解決します:
# application.properties
# MySQLの例
spring.datasource.url=jdbc:mysql://localhost:3306/mydb
spring.datasource.username=root
spring.datasource.password=yourpassword
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
# PostgreSQLの例
# spring.datasource.url=jdbc:postgresql://localhost:5432/mydb
# spring.datasource.username=postgres
# spring.datasource.password=yourpassword
対応するJDBCドライバーも依存関係に含める必要があります。MavenでMySQLを使用する場合:
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<scope>runtime</scope>
</dependency>
方法2:ローカル開発・テスト用にH2を追加する
まだ実際のデータベースが用意できていない場合、H2は完全にインメモリで動作するためセットアップ不要です。依存関係を追加するだけで使えます:
<!-- Maven -->
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>runtime</scope>
</dependency>
# Gradle
runtimeOnly 'com.h2database:h2'
Spring BootはH2データベースを追加の設定なしで自動構成します。フルDBサーバーを立ち上げたくない単体テストや開発初期段階に最適です。
方法3:DataSourceの自動構成を除外する
依存関係が推移的な依存として紛れ込んでいるが、アプリは実際にはデータベースを使用しない場合や、コードで手動でデータソースを構成している場合などに有効です。Spring Bootに自動構成をスキップさせましょう:
@SpringBootApplication(exclude = {
DataSourceAutoConfiguration.class
})
public class MyApplication {
public static void main(String[] args) {
SpringApplication.run(MyApplication.class, args);
}
}
プロパティファイルでの設定を好む場合も同じ効果が得られます:
spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration
よくある落とし穴:間違ったSpringプロファイルがアクティブになっている
多くのチームは設定をプロファイルファイルに分割しています:application-dev.properties、application-prod.propertiesなどです。データソースのURLはそれらのファイルのどれかに記述されています。しかしSpring Bootはプロファイルがアクティブでない場合、ベースのapplication.propertiesしか読み込まないため、設定が見つかりません。
実行中のプロファイルを確認するか、プロパティで明示的に指定してください:
spring.profiles.active=dev
コマンドラインからの指定:
java -jar myapp.jar --spring.profiles.active=dev
application.ymlを使用している場合
YAMLの設定は以下のようになります:
spring:
datasource:
url: jdbc:mysql://localhost:3306/mydb
username: root
password: yourpassword
driver-class-name: com.mysql.cj.jdbc.Driver
jpa:
hibernate:
ddl-auto: update
show-sql: true
YAMLはインデントに敏感です。スペース1つのずれが設定を静かに壊してしまい、明確なエラーが出ず実行時に値が欠落するだけです。コミット前にToolCraftのYAML ↔ JSONコンバーターに設定を貼り付けて構文の問題を事前に確認しましょう。完全にブラウザ上で動作するため、認証情報が外部に送信されることはありません。
修正の確認
アプリを再起動してください。正常に起動すると以下のように表示されます:
HikariPool-1 - Starting...
HikariPool-1 - Added connection com.mysql.cj.jdbc.ConnectionImpl@...
HikariPool-1 - Start completed.
Started MyApplication in 3.421 seconds (process running for 3.8)
APPLICATION FAILED TO STARTのブロックが表示されなければ成功です。
より確実に確認したい場合は、実際に接続を開くスモークテストを追加してください:
@SpringBootTest
class DataSourceTest {
@Autowired
DataSource dataSource;
@Test
void connectionShouldSucceed() throws Exception {
try (Connection conn = dataSource.getConnection()) {
assertThat(conn.isValid(1)).isTrue();
}
}
}
予防のためのヒント
- ローカルDBの動作設定(またはH2フォールバック)を記述した
application-dev.propertiesを用意しておくと、新しい開発者が初日からセットアップなしでアプリを実行できます - CIパイプラインでは
--spring.profiles.active=testを固定し、H2またはTestcontainersを使用することで、テストの分離性と再現性をマシン間で保てます - コミット前にYAMLを検証してください。上記のコンバーターは、ほとんどのテキストエディターでは見えないインデントのバグを検出できます
pom.xmlまたはbuild.gradleを定期的に監査してください — 推移的な依存関係が思いのほか頻繁にspring-boot-starter-data-jpaを密かに引き込んでいます

