2011-12-14 13 views
23

Intentando compilar mi aplicación contra java 1.7 Encontré lo que había un nuevo método agregado en javax.sql.CommonDataSource (y por lo tanto en j.s.DataSource) -. getParentLogger(). Puede comparar CommonDataSource:1.7 con CommonDataSource:1.6Nuevo método agregado en javax.sql.CommonDataSource en 1.7

Para mí, este cambio definitivamente rompe la compatibilidad con versiones anteriores. Por ejemplo, mi aplicación (que contiene implementaciones de DataSource) incluso no compila contra 1.7 sin cambios en el código.

En mi opinión, debería haber razones muy fuertes para hacer esto, pero no puedo buscar en Google ni siquiera una. ¿Alguien puede explicar el razonamiento detrás de este cambio? Cómo se supone que debe lidiar con eso correctamente, para mí es la primera vez que me encuentro con una incompatibilidad hacia atrás con Java, así que no tengo ninguna "mejores prácticas" aquí ...

+1

no es la primera vez. Esto siempre sucede cuando actualizan JDBC. Estoy de acuerdo en que esto no es una buena cosa (tm). Muchos controladores, por ejemplo, necesitan mantener versiones separadas solo por esto. Es un problema, pero solo debería generar errores de compilación, no errores de tiempo de ejecución (es decir, puede compilar para JDK6 y aún así ejecutarlo contra JDK7). – Thilo

+2

Las interfaces JDBC se volvieron incompatibles hacia atrás varias veces (al agregar métodos) en el pasado. Debería poder agregar los métodos adicionales a sus clases, y deberían funcionar sin problemas en entornos anteriores a 1.7. –

+0

Hm ... ¿No rompe la compatibilidad binaria? Quiero decir, mi implementación de DS se compiló con DS anterior, sin agregar un método nuevo, parece ser un cambio binario incompatible, ¿no? – BegemoT

Respuesta

6

Si no estás listo para admitir la compilación de su aplicación para Java 7, aún puede compilar para Java 1.6 utilizando el compilador de Java 7. Necesitará un entorno de tiempo de ejecución de Java 1.6 (o SDK) instalado. Si intenta compilar una clase MyDataSource.java que implementa un stubbed DataSource utilizando un compilador Java 7, es posible que aparezca el siguiente:

$ 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 

es necesario decirle al compilador que desea utilizar archivos de código fuente escrito para Java 1.6, produces Java 1.6 código de bytes y dónde encontrar el tiempo de ejecución de Java 1.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; 
} 
+2

¿Esto no explotará si tu código se ejecuta en Java 7? –

5

primero se debe agregar el nuevo método (s) solicitada sin la anotación @ Override.

Si no le molesta apoyar los nuevos métodos simplemente lance SQLFeatureNotSupportedException.

Si está envolviendo otro DataSource y desea admitir 6 y 7, use reflection para llamar a los métodos si existen.

0

Otra manera de manejar esto es cambiar las variables de entorno de PATH y JAVA_HOME

Aquí es manera de tratar con él en Mac:

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

export PATH =/System/Library/Frameworks/JavaVM.framework/Versiones/1.6.0/Inicio/bin /: $ PATH