たなかのJava日記

どんなことをやったか(学んだか)、どこで詰まったか(わからなかったか)、どこで工夫したかの記録です。

【Spring Boot】Spring JDBCなどがimportできない件

【困りごと】

データベース操作用のクラスを作成する際に、下記クラス(JDBC関連)がインポートできない。

import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.namedparam.BeanPropertySqlParameterSource;
import org.springframework.jdbc.core.namedparam.SqlParameterSource;
import org.springframework.jdbc.core.simple.SimpleJdbcInsert;

【仮説①】
タイピングミス

【仮説①結果】
タイピングをミスしている部分もありましたが、修正してもインポートできませんでした。
そもそも、IDEで補完できなかった時点でおかしいことに気付くべきでした。


【仮説②】
IDEの補完で候補が表示されていないとなると、Mavenのpom.xmlへの依存関係だと予想。
これは、Spring Boot アプリケーションでSpring JDBCを使うにはpom.xmlに依存関係を設定する必要があるためです。

【仮説②結果】
予想通りでした。原因はscopeの指定が間違っていたためです。

//間違いの箇所
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-jdbc</artifactId>
	<scope>runtime</scope>  
</dependency>
//正しい
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>


scopeには、「そのライブラリがどのようなタイミングでクラスパスに追加されるか」を指定します。


ここでruntimeを指定していたため、上手くいかなかったようです。
runtimeはコンパイル時にはクラスパスに入らず、実行時、テスト実行時にライブラリが追加されます。
そのため、コードを書いているときに追加できずにIDEに怒られていたという訳です。

ちなみに、無指定(省略時)だとcompileになります。
compileはmainやtestのソースコードコンパイル時や実行時、テスト実行時に追加されます。

参考サイト:
Mavenのscopeに何を書いたら良いのかわからなかったので調べてみた - Qiita