Новый метод добавлен в javax.sql.CommonDataSource в 1.7 - PullRequest
24 голосов
/ 14 декабря 2011

Попытка скомпилировать мое приложение с использованием Java 1.7 Я обнаружил, что в javax.sql.CommonDataSource (и так в jsDataSource) добавлен новый метод -.Вы можете сравнить CommonDataSource: 1,7 с CommonDataSource: 1,6

Для меня это изменение определенно нарушает обратную совместимость.Например, мое приложение (которое содержит реализации DataSource) даже не компилируется с 1.7 без изменений в коде.

По моему мнению, для этого должны быть очень веские причины, но я не могу гуглить ни одного.Может кто-нибудь объяснить причину этого изменения?Как он должен правильно с этим справляться - для меня это первый раз, когда я столкнулся с обратной несовместимостью с Java, поэтому у меня нет здесь "лучших практик" ...

Ответы [ 3 ]

7 голосов
/ 14 декабря 2011

Если вы не готовы поддержать компиляцию вашего приложения для Java 7, вы все равно можете скомпилировать для Java 1.6 с помощью компилятора Java 7.Вам потребуется установленная среда исполнения Java 1.6 (или SDK).Если вы попытаетесь скомпилировать класс MyDataSource.java, который реализует заглушку DataSource с использованием компилятора Java 7, вы можете увидеть следующее:

$ 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 и где найти JAR времени выполнения Java 1.6:

$ 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;
}
6 голосов
/ 07 декабря 2012

Сначала добавьте запрошенные новые методы без аннотации @Override.

Если вы не против поддержки новых методов, просто сгенерируйте исключение SQLFeatureNotSupportedException.

Если вы переносите другой источник данных и хотите поддерживать 6 и 7, используйте рефлексию для вызова методов, если они существуют.

0 голосов
/ 15 марта 2014

Другой способ справиться с этим - изменить переменные окружения PATH и JAVA_HOME

Вот способ справиться с этим на Mac:

export JAVA_HOME = / System / Library / Frameworks /JavaVM.framework / Versions / 1.6.0 / Home

export PATH = / Система / Библиотека / Каркасы / JavaVM.framework / Версии / 1.6.0 / Home / bin /: $ PATH

...