Nếu bạn chưa sẵn sàng để hỗ trợ biên dịch ứng dụng của bạn cho Java 7, bạn vẫn có thể biên dịch cho Java 1.6 bằng cách sử dụng trình biên dịch Java 7. Bạn sẽ cần một môi trường thời gian chạy Java 1.6 (hoặc SDK) được cài đặt. Nếu bạn cố gắng biên soạn một lớp MyDataSource.java
mà thực hiện một stubbed DataSource
sử dụng một trình biên dịch Java 7, bạn có thể thấy như sau:
$ 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
Bạn cần phải nói với trình biên dịch mà bạn muốn sử dụng file nguồn bằng văn bản cho Java 1.6, sản xuất Java bytecode 1.6 và nơi tìm JAR thời gian chạy 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;
}
Nguồn
2011-12-14 14:47:46
Đây không phải là lần đầu tiên. Điều này luôn xảy ra khi họ cập nhật JDBC. Tôi đồng ý rằng đây không phải là điều tốt đẹp (tm). Nhiều trình điều khiển ví dụ cần phải duy trì các phiên bản riêng biệt chỉ vì điều này. Nó là một nỗi đau, nhưng nó chỉ nên dẫn đến các lỗi biên dịch, không phải trong các lỗi thời gian chạy (tức là bạn có thể xây dựng cho JDK6 và vẫn chạy nó với JDK7). – Thilo
Giao diện JDBC đã trở nên không tương thích ngược nhiều lần (bằng cách thêm phương thức) trong quá khứ. Bạn sẽ có thể thêm các phương thức bổ sung vào các lớp của bạn, và chúng sẽ hoạt động không có vấn đề trong môi trường trước 1.7. –
Hm ... Nó không phá vỡ khả năng tương thích nhị phân? Ý tôi là - việc thực hiện DS của tôi đã được biên soạn dựa trên DS cũ, mà không có phương pháp mới được thêm vào - nó có vẻ là sự thay đổi không tương thích nhị phân, phải không? – BegemoT