2011-09-29 23 views
9

Tôi quan tâm đến việc sử dụng một số tính năng NIO2 trong SDK Java 7 nếu có (cụ thể là file system watchers), tuy nhiên tôi không muốn biên dịch các lớp của mình cho Java 7 và loại trừ Java 6 runtimes. Chủ yếu là vì tôi muốn giữ lại khả năng tương thích với Mac OS X và cũng bởi vì tôi không muốn buộc người dùng của mình nâng cấp.Sử dụng các tính năng Java 7 SDK trong Java 6

Điều này có khả thi không? Cách tốt nhất để làm điều đó là gì? Bất kỳ liên kết hoặc ví dụ nào?

Dưới đây là một số cách tôi có thể tưởng tượng: biên dịch tệp lớp với trình biên dịch khác và tải động dựa trên phiên bản Java? Hoặc có thể sử dụng sự phản chiếu? Hoặc có thể chỉ có một cài đặt trình biên dịch cho Java 7 để tạo các lớp tương thích Java 6?

Tôi đang tìm một giải pháp không biến thành một mớ hỗn độn xấu xí :), lý tưởng nhất là tôi có thể viết hai triển khai của một giao diện, một cách sử dụng các tính năng mới và không có, sau đó chọn một động để thực hiện các cuộc gọi phản chiếu khắp nơi.

+0

Vì tôi cho rằng các tính năng này bắt đầu tồn tại trong SE7, bạn nghĩ bạn sẽ có thể biên dịch bằng chế độ tương thích SE6 như thế nào và giữ lại chúng? – KevinDTimm

+0

Những gì tôi muốn làm là chỉ sử dụng chúng khi chương trình được thực hiện trên một thời gian chạy Java 7, và rơi trở lại hành vi khác nếu không. Lưu ý rằng tôi đang nói về các tính năng của Java 7 SDK chứ không phải các tính năng ngôn ngữ. –

+0

Xin lỗi, hai cơ sở mã sẽ cần thiết (hoặc, ít nhất, có một cơ sở xử lý tệp riêng biệt cho từng môi trường và tạo đầu ra riêng cho từng phiên bản như mã được biên dịch trong Phiên bản X thường không hoạt động trong bất kỳ Phiên bản được đánh số thấp hơn nào) – KevinDTimm

Trả lời

9

Chỉ cần xây dựng với mục tiêu 1,6 và tổ chức mã của bạn để bạn có thể nắm bắt ClassNotFoundExceptions và NoClassDefFoundErrors sạch xung quanh các mô-đun sử dụng 1.7. Có thể tải chúng với một trình nạp lớp riêng biệt chẳng hạn.

+0

Nó hoạt động, cảm ơn! Tôi đã cấu hình JDK 7 trong Eclipse để chăm sóc cú pháp tô sáng, và tôi đã xây dựng với đích Java 6. Đối với các cuộc gọi phương thức không tồn tại, bạn phải bắt giữ NoSuchMethodError. –

+0

@Laurens @EJP. Tôi không hiểu, làm thế nào bạn có thể xây dựng nguồn 1.7 với mục tiêu 1.6? Nó sẽ không cung cấp cho bạn: 'javac: source release 1.7 yêu cầu release release 1.7' – Pacerier

+0

@Pacerier Bí quyết là xây dựng với source 1.6 thay vì 1.7, và chỉ gọi các phương thức từ 1.7 SDK. Có thể cần một số cấu hình trong trình soạn thảo của bạn để ngăn không cho nó phàn nàn và hoàn thành mã để hoạt động, nhưng nếu không nó sẽ hoạt động. –

0

Đối với một số yếu tố đã được thêm vào trong Java 7, bạn có thể tìm thấy các jsr Java 6 js cung cấp cho bạn chức năng. Tôi không tin rằng đây sẽ là trường hợp cho các hệ thống tập tin Watcher tuy nhiên.

+0

Nếu chạy trên Java 6, tôi không cần chức năng, nó là tùy chọn cho người dùng chạy trên Java 7. Trong trường hợp cụ thể này, tôi có thể rơi trở lại trên bỏ phiếu hoặc hành vi làm mới rõ ràng. –

+3

Hãy xem xét JNotify –

0

Về mặt người xem hệ thống tệp, trước khi Java 7 tôi đã từng chỉ thăm dò một thuộc tính của tệp cứ sau vài giây hoặc lâu hơn để kiểm tra xem nó có thay đổi không. Nó không phải là chính xác tốt đẹp, nhưng thực tế nó không sử dụng tài nguyên đáng chú ý và từ quan điểm của người dùng cuối xuất hiện để làm việc giống nhau.

Nếu bạn đang theo một thư viện toàn diện hơn, hãy xem http://commons.apache.org/jci/commons-jci-fam/index.html - Tôi tin rằng điều gì đó tương tự, mặc dù tôi chưa bao giờ sử dụng nó.

Chỉ định nguồn 1.7 và mục tiêu 1.6 Tôi chắc chắn sẽ không hoạt động, tôi đã thử nó vì một lý do khác trong khi quay trở lại và từ bộ nhớ JVM đã phàn nàn về cờ không tương thích (tôi đoán là vì động cơ gọi mới trong 7 .)

1

Bạn có thể xây dựng cho java 1,6 dễ dàng như bộ công cụ đã chỉ ra. Tuy nhiên, bạn cần đảm bảo rằng bạn không vô tình truy cập bất kỳ phương thức nào không tồn tại trong java 6. Điều này sẽ gây ra một ngoại lệ thời gian chạy trong mã sản xuất của bạn.

Nếu bạn đang sử dụng maven, bạn có thể sử dụng plugin maven-executecer, đảm bảo rằng không có java 1,7 lớp hoặc gọi phương thức lẻn vào mã được tạo cho 1.6.

Ví dụ sẽ là thay đổi từ java 1.4 đến 1.5. Tôi đã xây dựng 1,5 với mục tiêu là 1,4 và tôi đã vô tình sử dụng:

new BigDecimal(5); 

Tiền phạt đã biên dịch này và chạy tốt cho tôi. Nhưng bởi vì khách hàng vẫn đang sử dụng 1,4, nó đã thất bại. Bởi vì hàm tạo này không tồn tại trong 1.4. Nó được giới thiệu trong 1.5.

Một giải pháp khác là xây dựng một vài lọ, một với công cụ mới nio, một với các công cụ cũ và phát hiện tại thời điểm cài đặt cho dù người dùng có đang chạy java 1.7 hay không. Nếu có, hãy thêm lọ chứa triển khai thích hợp.