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に対応させました。