Java 1.7に対してアプリをコンパイルしようとしています。javax.sql.CommonDataSource(およびjsDataSource)に追加された新しいメソッドがあることがわかりました-.getParentLogger()
。 CommonDataSource:1.7 と CommonDataSource:1.6 を比較できます
私にとって、この変更は間違いなく下位互換性を壊します。たとえば、私のアプリ(DataSourceの実装を含む)は、コードを変更しないと1.7に対してコンパイルされません。
私の意見では、これを行う理由は非常に強いはずですが、1つでもグーグルで検索することはできません。誰かがこの変更の背後にある理由を説明できますか?正しく処理する方法-私にとって、Javaとの後方互換性に遭遇したのは初めてなので、ここには「ベストプラクティス」はありません...
Java 7用のアプリケーションのコンパイルをサポートする準備ができていない場合でも、Java7コンパイラを使用してJava1.6用にコンパイルできます。 Java 1.6ランタイム環境(またはSDK)がインストールされている必要があります。 Java7コンパイラを使用してスタブ化されたDataSource
を実装するMyDataSource.Java
クラスをコンパイルしようとすると、次のように表示される場合があります。
$ Java -version
Java version "1.7.0"
Java(TM) SE Runtime Environment (build 1.7.0-b147)
Java HotSpot(TM) Server VM (build 21.0-b17, mixed mode)
$ javac -version
javac 1.7.0
$ javac MyDataSource.Java
MyDataSource.Java:7: error: MyDataSource is not abstract and does not override abstract method getParentLogger() in CommonDataSource
public class MyDataSource implements DataSource {
^
1 error
Java 1.6用に記述されたソースファイルを使用すること、Java 1.6バイトコードを生成すること、およびJava1.6ランタイムJARの場所をコンパイラに指示する必要があります。
$ javac -source 1.6 -target 1.6 -bootclasspath <path to Java 1.6 JRE>/lib/rt.jar MyDataSource.Java
$ file MyDataSource.class
MyDataSource.class: compiled Java class data, version 50.0 (Java 1.6)
$ javap MyDataSource
Compiled from "MyDataSource.Java"
public class MyDataSource implements javax.sql.DataSource {
public MyDataSource();
public Java.io.PrintWriter getLogWriter() throws Java.sql.SQLException;
public void setLogWriter(Java.io.PrintWriter) throws Java.sql.SQLException;
public void setLoginTimeout(int) throws Java.sql.SQLException;
public int getLoginTimeout() throws Java.sql.SQLException;
public <T extends Java/lang/Object> T unwrap(Java.lang.Class<T>) throws Java.sql.SQLException;
public boolean isWrapperFor(Java.lang.Class<?>) throws Java.sql.SQLException;
public Java.sql.Connection getConnection() throws Java.sql.SQLException;
public Java.sql.Connection getConnection(Java.lang.String, Java.lang.String) throws Java.sql.SQLException;
}
まず、@ Overrideアノテーションなしでリクエストされた新しいメソッドを追加します。
新しいメソッドをサポートしてもかまわない場合は、SQLFeatureNotSupportedExceptionをスローするだけです。
別のデータソースをラップしていて、6と7をサポートしたい場合は、リフレクションを使用して、メソッドが存在する場合はそれを呼び出します。
これを処理する別の方法は、PATHとJava_HOMEの環境変数を変更することです。
Macでこれに対処する方法は次のとおりです。
エクスポートJava_HOME =/System/Library/Frameworks/JavaVM.framework/Versions/1.6.0/Home
export PATH =/System/Library/Frameworks/JavaVM.framework/Versions/1.6.0/Home/bin /:$ PATH