Goalist Developers Blog

Gradle利用のSeaser2(S2JDBC)をJava8にする

Java7でS2JDBCを使っているプロジェクトをJava8にしたので手順を残します。
プロジェクト自体はGradleで管理されています。
EOLの問題があるけど、諸事情によりS2JDBCをJava8に対応させないといけない場合に役に立てばいいなぁと思います。
やるべきこと(確認ポイント)は以下です。

  • Gradleの設定をJava8でコンパイルするように変更する
  • s2-frameworkのjavassistだけを新しいものに置き換える
  • javax.transaction-apiが必要な場合は入れる
  • MySQLはバージョン5系を使う

1. Gradleの設定をJava8でコンパイルするように変更する

これはそんなに難しくないと思います、build.gradleの対象ヶ所を書き換えます。

sourceCompatibility = 1.8
targetCompatibility = 1.8

2. s2-frameworkのjavassistだけを新しいものに置き換える

今回の作業で一番はまったのはここでした。 dependenciesで以下のように設定しても古いjavassistが含まれてしまいます。

 // https://mvnrepository.com/artifact/org.seasar.container/s2-framework
 compile('org.seasar.container:s2-framework:2.4.44') {
   exclude module: 'javassist' 
 }
 // https://mvnrepository.com/artifact/org.javassist/javassist 
 compile group: 'org.javassist', name: 'javassist', version: '3.20.0-GA'   

 // https://mvnrepository.com/artifact/org.seasar.container/s2-tiger
 compile group: 'org.seasar.container', name: 's2-tiger', version: '2.4.44'   

 // https://mvnrepository.com/artifact/org.seasar.container/s2-extension
 compile group: 'org.seasar.container', name: 's2-extension', version: '2.4.44'

s2-frameworkでexcludeしてもs2-tigerやs2-extensionの部分で古いjavassistを取得してしまいます。
上記の設定からs2-framework以外を省いてgradle dependenciesで確認すると古いjavassistが含まれないので、excludeは機能していることが確認できます。 解決策としては以下のようにexcludeではなく、configurationsで全体から外してやればOKです。

configurations {
    all*.exclude group: 'jboss', module: 'javassist'
}

dependencies {
    // https://mvnrepository.com/artifact/org.seasar.container/s2-framework
    compile group: 'org.seasar.container', name: 's2-framework', version: '2.4.44'
    // https://mvnrepository.com/artifact/org.javassist/javassist 
    compile group: 'org.javassist', name: 'javassist', version: '3.20.0-GA'
    // https://mvnrepository.com/artifact/org.seasar.container/s2-tiger
    compile group: 'org.seasar.container', name: 's2-tiger', version: '2.4.44'
    // https://mvnrepository.com/artifact/org.seasar.container/s2-extension
    compile group: 'org.seasar.container', name: 's2-extension', version: '2.4.44'
    // https://mvnrepository.com/artifact/javax.persistence/javax.persistence-api
    compile group: 'javax.persistence', name: 'javax.persistence-api', version: '2.2'
}

3. javax.transaction-apiが必要な場合は入れる

ここまでを実行して以下のエラーで怒られた場合はjavax.transaction-apiが足らないので入れましょう。

Caused by: java.lang.ClassNotFoundException: javax.transaction.UserTransaction
    // https://mvnrepository.com/artifact/javax.transaction/javax.transaction-api
    compile group: 'javax.transaction', name: 'javax.transaction-api', version: '1.3'

4. MySQLはバージョン5系を使う

Java8に上げるついでにMySQLコネクタのバージョンを6にしてみたのですが、エラーで怒られました。ドライバ名が変わったのが原因だったので、あきらめて5系を使えば大丈夫でした。
たぶんS2JDBCのdialectの設定が新しいドライバ名に対応していません。 ドライバ名について詳しくはこちら。
datameer.zendesk.com

まとめ

今回は既存のバッチプログラムをマルチスレッド化するために、どうしてもJava8が使いたかったのでSeaser2(S2JDBC)をJava8に対応させました。