mike-neckのブログ

Java or Groovy or Swift or Golang

spring-bootとJava DBとgradleとintellij-ideaとあれこれ #jggug_boot #jggug

こんにちわ、みけです。

先週の金曜(2014/08/01)にJGGUG主催の

ドキッおっさんだらけのGrails 3.0先取り!?Spring Boot入門ハンズオン

に行ってきました。

なお、この勉強会のツイートなどは、多分まとめられてると思います|д゚)チラッ

また、参加者の皆さんのブログなども多数あると思います|д゚)チラッ

ので、僕の興味の範囲でダラダラと書いています。


Spring Bootでファイルベースのデータベースを使う

unitテストなどでデータベースを扱う場合、

ファイルベースのデータベースのほうが何かと便利だったりします。

テスト前にデータベースに大量にデータを入れる場合などは、

事前に準備しておいたデータベースを

どかーんと持ってきたほうが楽ですし、楽ですし、楽だったりします。

というわけで、このハンズオンでもh2のファイルベースのデータベースを

使った演習をしました。


ただ僕の場合、天邪鬼な性格が災いして、

もともとJavaにはJava DBが付いているのだから、

わざわざh2落としてこなくても、

Java DBでいいじゃんと考えて、

Java DBでやることにしました。

設定の記述

Java DBを使う場合、application.ymlで次のように記述します。

spring:
  datasource:
    driverClassName: org.apache.derby.jdbc.EmbeddedDriver
    url: jdbc:derby:/path/to/database.db
    username: sa
    password: sa
  jpa:
    hibernate:
      ddl-auto: update

で、勉強会の資料では、

ファイルの実態がない場合には作成されるということで、

このまま実行したところ…

$ gradle bootRun

...省略...

java.sql.SQLException: データベース'/Users/mike/IdeaProjects/spring-boot-self-learning/database.db'が見つかりません。
    at org.apache.derby.impl.jdbc.SQLExceptionFactory40.getSQLException(Unknown Source)
    at org.apache.derby.impl.jdbc.Util.newEmbedSQLException(Unknown Source)
    at org.apache.derby.impl.jdbc.Util.newEmbedSQLException(Unknown Source)
    at org.apache.derby.impl.jdbc.Util.generateCsSQLException(Unknown Source)
    at org.apache.derby.impl.jdbc.EmbedConnection.newSQLException(Unknown Source)
    at org.apache.derby.impl.jdbc.EmbedConnection.handleDBNotFound(Unknown Source)
    at org.apache.derby.impl.jdbc.EmbedConnection.<init>(Unknown Source)
    at org.apache.derby.impl.jdbc.EmbedConnection40.<init>(Unknown Source)
    at org.apache.derby.jdbc.Driver40.getNewEmbedConnection(Unknown Source)
    at org.apache.derby.jdbc.InternalDriver.connect(Unknown Source)
    at org.apache.derby.jdbc.Driver20.connect(Unknown Source)
    at org.apache.derby.jdbc.EmbeddedDriver.connect(Unknown Source)

...省略...

:bootRun FAILED

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':bootRun'.
> Process 'command '/Library/Java/JavaVirtualMachines/jdk1.8.0_05.jdk/Contents/Home/bin/java'' finished with non-zero exit value 1

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.

BUILD FAILED

Total time: 13.69 secs

という感じで落ちてしまいました。

ファイルなければ作ってくれる言うたのに…(´・ω・`)

解決策

url;create=trueを追加するとイケます。

spring:
  datasource:
    driverClassName: org.apache.derby.jdbc.EmbeddedDriver
    url: jdbc:derby:/path/to/database.db;create=true
    username: sa
    password: sa
  jpa:
    hibernate:
      ddl-auto: update

なければ作ってくれるとは一体何だったのか…


Gradleの記述

Java DBは$JAVA_HOME/db/libの下にあるderby.jarなので、

これをcompile configurationに追加します。

apply plugin: 'idea'
// 他のプラグインは省略

dependencies {
    compile files("${System.getenv('JAVA_HOME')}/db/lib/derby.jar")
    // 他のdependenciesは省略
}

あれれれれ?!

なお、このgradleプロジェクトでideaタスクを実行した後に、

intellij ideaで開くと、

お、これ、gradleプロジェクトだね?gradleプロジェクトとして読み込む?

intellijに聞かれるので、これに応じると…

せっかくcompile configurationに入れたderby.jarが消えていなくなります。

どうやら、configurationのfilesにintellijちゃんは対応していないようです(´・ω・`)

なので、Java DBを使う場合は、gradleプロジェクトとしては認識させないようにしておいたほうが

良さそうですね|д゚)チラッ


おわり