2011-12-14 15 views
23

Próba kompilacji mojej aplikacji przeciwko java 1.7 Znalazłem nową metodę dodaną w javax.sql.CommonDataSource (i tak w j.s.DataSource) -. getParentLogger(). Możesz porównać CommonDataSource:1.7 z CommonDataSource:1.6Nowa metoda dodana w javax.sql.CommonDataSource w 1.7

Dla mnie ta zmiana zdecydowanie przełamuje kompatybilność wsteczną. Na przykład moja aplikacja (która zawiera implementacje DataSource) nawet nie kompiluje się względem wersji 1.7 bez zmian kodu.

Moim zdaniem, powinny to być bardzo mocne powody, aby to zrobić - ale nie mogę google nawet jeden. Czy ktoś może wyjaśnić przyczyny tej zmiany? Jak powinien się z tym uporać - dla mnie po raz pierwszy spotkałem się z niekompatybilnością wsteczną z java, więc nie mam tutaj żadnych "dobrych praktyk" ...

+1

To nie pierwszy raz. Dzieje się tak zawsze, gdy aktualizują JDBC. Zgadzam się, że to nie jest ładna rzecz (tm). Na przykład wielu kierowców musi utrzymywać oddzielne wersje właśnie z tego powodu. To jest ból, ale powinno to spowodować błędy kompilacji, a nie błędy w czasie wykonywania (np. Można zbudować dla JDK6 i nadal uruchamiać z JDK7). – Thilo

+2

Interfejsy JDBC stały się wielokrotnie niekompatybilne wstecz (przez dodanie metod) w przeszłości. Powinieneś być w stanie dodać dodatkowe metody do swoich zajęć i powinny one pracować bez problemu w środowiskach sprzed 1.7. –

+0

Hm ... Czy to nie psuje kompatybilności binarnej? Mam na myśli - moja implementacja DS została skompilowana ze starym DS, bez dodania nowej metody - wydaje się, że jest to zmiana binarna niekompatybilna, nieprawdaż? – BegemoT

Odpowiedz

6

Jeśli nie jesteś gotowy do obsługi kompilacji aplikacji dla Java 7, nadal możesz kompilować dla Javy 1.6 przy użyciu kompilatora Java 7. Będziesz potrzebował środowiska wykonawczego Java 1.6 (lub SDK). Jeśli próbujesz kompilacji MyDataSource.java klasy, która implementuje zgaszone DataSource użyciu Java 7 kompilator, można znaleźć w następujących miejscach:

$ 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 

Musisz poinformować kompilator, który chcesz użyć plików źródłowych napisanych w języku Java 1.6, produkować Java 1.6 kod bajtowy i gdzie znaleźć Java Runtime 1.6 dzbanka:

$ 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

Czy to nie wybuchnie, jeśli twój kod działa na Java 7? –

5

najpierw dodać żądany nową metodę (-y) bez adnotacji @Override.

Jeśli nie masz nic przeciwko wspieraniu nowych metod, po prostu rzuć wyjątek SQLFeatureNotSupportedException.

Jeśli owijasz inne źródło danych i chcesz obsługiwać 6 i 7, użyj odbicia, aby wywołać metody, jeśli istnieją.

0

Innym sposobem obsługi to zmienić zmienne środowiskowe i ścieżki JAVA_HOME

Oto sposób na radzenie sobie z nim na Mac:

export 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

Powiązane problemy