2011-12-14 25 views
23

Cố gắng biên dịch ứng dụng của tôi với java 1.7 Tôi đã tìm thấy phương thức mới được thêm vào trong javax.sql.CommonDataSource (và như vậy trong j.s.DataSource) -. getParentLogger(). Bạn có thể so sánh CommonDataSource:1.7 với CommonDataSource:1.6Phương thức mới được thêm vào trong javax.sql.CommonDataSource trong 1,7

Đối với tôi thay đổi này chắc chắn sẽ phá vỡ tính tương thích ngược. Ví dụ, ứng dụng của tôi (có chứa các triển khai của DataSource) thậm chí không biên dịch với 1.7 mà không có thay đổi về mã.

Theo ý kiến ​​của tôi, nó phải là lý do rất mạnh mẽ để làm điều này - nhưng tôi không thể google ngay cả một. Ai đó có thể giải thích lý do đằng sau sự thay đổi này? Làm thế nào nó phải đối phó với nó một cách chính xác - đối với tôi đó là lần đầu tiên tôi gặp phải sự không tương thích ngược với java, vì vậy tôi không có "thực hành tốt nhất" ở đây ...

+1

Đâ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

+2

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. –

+0

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

Trả lời

6

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; 
} 
+2

Điều này sẽ không xảy ra nếu mã của bạn chạy trên Java 7? –

5

Trước tiên hãy thêm phương thức mới được yêu cầu mà không có chú thích @Override.

Nếu bạn không ngại hỗ trợ các phương thức mới, chỉ cần ném SQLFeatureNotSupportedException.

Nếu bạn đang gói một DataSource khác và muốn hỗ trợ 6 và 7, hãy sử dụng sự phản chiếu để gọi các phương thức nếu chúng tồn tại.

0

Một cách khác để xử lý này là để thay đổi các biến môi trường PATH của và JAVA_HOME

Dưới đây là cách để đối phó với nó trên Mac:

xuất khẩu JAVA_HOME =/System/Library/Frameworks/JavaVM.framework /Versions/1.6.0/Home

export PATH =/System/Library/Frameworks/JavaVM.framework/Versions/1.6.0/Trang chủ/bin /: $ PATH

Các vấn đề liên quan