web-dev-qa-db-ja.com

1.7のjavax.sql.CommonDataSourceに追加された新しいメソッド

Java 1.7に対してアプリをコンパイルしようとしています。javax.sql.CommonDataSource(およびjsDataSource)に追加された新しいメソッドがあることがわかりました-.getParentLogger()CommonDataSource:1.7CommonDataSource:1.6 を比較できます

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

私の意見では、これを行う理由は非常に強いはずですが、1つでもグーグルで検索することはできません。誰かがこの変更の背後にある理由を説明できますか?正しく処理する方法-私にとって、Javaとの後方互換性に遭遇したのは初めてなので、ここには「ベストプラクティス」はありません...

24
BegemoT

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;
}
7
Dan Cruz

まず、@ Overrideアノテーションなしでリクエストされた新しいメソッドを追加します。

新しいメソッドをサポートしてもかまわない場合は、SQLFeatureNotSupportedExceptionをスローするだけです。

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

6
eskatos

これを処理する別の方法は、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

0
stones333