2011-12-14 20 views
23

私のアプリケーションをJava 1.7でコンパイルしようとしました。新しいメソッドがjavax.sql.CommonDataSource(とj.s.DataSource)に追加されました。 getParentLogger()CommonDataSource:1.7CommonDataSource:1.6とを比較することができます新しいメソッドがjavax.sql.CommonDataSourceに1.7で追加されました

この変更は間違いなく下位互換性を破壊します。例えば、私のアプリ(DataSourceの実装を含む)は、コードの変更なしで1.7に対してコンパイルさえしません。

私の意見では、これは非常に強力な理由であるはずですが、私は1つでもGoogleをすることはできません。誰かがこの変更の背後にある理由を説明できますか?どのようにそれを正しく扱うことになっているのですか?私には、Javaと後方互換性がないことで初めて会ったので、ここでは「ベストプラクティス」はありません...

+1

はこれが初めてではありません。これは、JDBCを更新するときに常に発生します。私はこれがNice Thing(tm)ではないことに同意します。たとえば、多くのドライバは、これのために別のバージョンを維持する必要があります。それは痛みですが、コンパイルエラーだけでなく、実行時エラー(JDK6用にビルドして、それをJDK7に対して実行することもできます)では発生しません。 – Thilo

+2

JDBCインタフェースは過去に数回(メソッドを追加することによって)後​​方互換性がなくなりました。クラスに追加のメソッドを追加できるはずです。1.7より前の環境で問題なく動作するはずです。 –

+0

Hm ...バイナリ互換性が損なわれませんか?つまり、私のDSの実装は、新しいメソッドを追加することなく、古いDSに対してコンパイルされました。バイナリの互換性のない変更のようですね。 – BegemoT

答えて

6

準備が整っていなければJava 7用のアプリケーションのコンパイルをサポートするために、Java 7コンパイラを使用してJava 1.6用にコンパイルすることはできます。 Java 1.6ランタイム環境(またはSDK)がインストールされている必要があります。あなたは、Java 7のコンパイラを使用してスタブ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とどこのJava 1.6ランタイムJAR見つけるために:@Override注釈なしで要求された新しい方法(複数可)を追加し

$ 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; 
} 
+2

あなたのコードがJava 7で実行されている場合、これは爆発しませんか? –

5

ファーストを。

新しいメソッドをサポートしても構わない場合は、単にSQLFeatureNotSupportedExceptionをスローします。

別のデータソースをラップし、6と7をサポートする場合は、リフレクションを使用して、メソッドが存在する場合はそれを呼び出します。

0

これを処理する別の方法は、PATH環境変数を変更することで、JAVA_HOME

ここでは、Mac上でそれに対処する方法です:

輸出JAVA_HOME = /システム/ライブラリ/フレームワーク/ JavaVM.framework /Versions/1.6.0/Home

輸出PATH = /システム/ライブラリ/フレームワーク/ JavaVM.framework /バージョン/ 1.6.0 /ホーム/ binに/:$ PATH

関連する問題