Novo método adicionado em javax.sql.CommonDataSource em 1.7

Tentando compilar meu aplicativo contra o java 1.7 eu encontrei o que havia um novo método adicionado em javax.sql.CommonDataSource (e assim em jsDataSource) -. getParentLogger() . Você pode comparar CommonDataSource: 1.7 com CommonDataSource: 1.6

Para mim, essa mudança definitivamente quebra a compatibilidade com versões anteriores. Por exemplo, meu aplicativo (que contém implementações de DataSource) ainda não compila contra 1.7 sem alterações no código.

Na minha opinião, devem ser razões muito fortes para fazer isso – mas eu não posso google até mesmo um. Alguém pode explicar o raciocínio por trás dessa mudança? Como é suposto lidar com isso corretamente – para mim, é a primeira vez que encontro incompatibilidade com java, então não tenho nenhuma “melhor prática” aqui …

Se você não estiver pronto para suportar a compilation de seu aplicativo para Java 7, ainda poderá compilar para o Java 1.6 usando o compilador Java 7. Você precisará de um ambiente de tempo de execução (ou SDK) do Java 1.6 instalado. Se você tentar compilar uma class MyDataSource.java que implemente um DataSource com MyDataSource.java usando um compilador Java 7, poderá ver o seguinte:

 $ 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 

Você precisa dizer ao compilador que deseja usar os arquivos de origem escritos para o Java 1.6, produzir o bytecode do Java 1.6 e onde encontrar o JAR de tempo de execução do Java 1.6:

 $ javac -source 1.6 -target 1.6 -bootclasspath /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 unwrap(java.lang.Class) 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; } 

Primeiro adicione o novo método solicitado sem a anotação @Override.

Se você não se importar em suportar os novos methods, simplesmente lance SQLFeatureNotSupportedException.

Se você estiver envolvendo outro DataSource e quiser oferecer suporte a 6 e 7, use a reflection para chamar os methods, se existirem.

Outra maneira de lidar com isso é alterar as variables ​​de ambiente de PATH e JAVA_HOME

Aqui está a maneira de lidar com isso no Mac:

exportar JAVA_HOME = / System / Library / Frameworks / JavaVM.framework / Versões / 1.6.0 / Home

Exportar PATH = / System / Library / Frameworks / JavaVM.framework / Versões / 1.6.0 / Home / bin /: $ PATH

Intereting Posts