2010-06-09 25 views
5

Có thư viện bên thứ ba nào để phát hiện việc sử dụng thư viện Java 1.5 khi biên dịch bằng trình biên dịch 1.5 với nguồn 1.4 và mục tiêu 1.4 không?Phát hiện việc sử dụng các thư viện Java cũ hơn

Tôi có thể sử dụng 1,4 rt.jar trong bootclasspath tuy nhiên tôi hy vọng có một cách tốt hơn. Để được sử dụng, ví dụ, để không biên dịch/xây dựng nếu một thư viện mới được sử dụng.

Trả lời

3

Tên tò mò có tên Animal Sniffer được thiết kế cho tác vụ này. Xem blog của Kohsuke post Compiling with JDK6 and running on JDK5

Nó đóng gói như một Maven Plugin (một ví dụ về việc sử dụng được đưa ra trong answer này), nhưng cũng có thể được gọi cách lập trình:

~/code/scratch/sniff: curl http://maven.dyndns.org/2/org/jvnet/animal-sniffer/1.2/animal-sniffer-1.2.jar > animal-sniffer.jar 
~/code/scratch/sniff: curl http://repo1.maven.org/maven2/asm/asm-all/3.1/asm-all-3.1.jar > asm-all.jar 
~/code/scratch/sniff: curl http://maven.dyndns.org/2/org/jvnet/animal-sniffer/java1.5/1.0/java1.5-1.0.sig > java1.5-1.0.sig 

~/code/scratch/sniff: mkdir -p target/classes 
~/code/scratch/sniff: cd !$ 
cd target/classes 
~/code/scratch/sniff/target/classes: jar xf /Users/jason/usr/scala-2.8.0.RC2/lib/scala-library.jar 
~/code/scratch/sniff/target/classes: jar xf /Users/jason/usr/scala-2.8.0.RC2/lib/scala-compiler.jar 
~/code/scratch/sniff/target/classes: cd - 
/Users/jason/code/scratch/sniff 
~/code/scratch/sniff: scala -classpath animal-sniffer.jar:asm-all.jar 
Welcome to Scala version 2.8.0.RC2 (Java HotSpot(TM) 64-Bit Server VM, Java 1.6.0_17). 
Type in expressions to have them evaluated. 
Type :help for more information. 

scala> import org.jvnet.animal_sniffer._ 
import org.jvnet.animal_sniffer._ 

scala> import collection.JavaConversions._ 
import collection.JavaConversions._ 

scala> val ignored = collection.mutable.Set("scala/*", "ch/*", "jline/*", "org/apache/*") 
ignored: scala.collection.mutable.Set[java.lang.String] = Set(org/apache/*, jline/*, scala/*, ch/*) 

scala> val sc = new SignatureChecker(new java.io.FileInputStream("java1.5-1.0.sig"), ignored) 
sc: org.jvnet.animal_sniffer.SignatureChecker = [email protected] 

scala> sc.process(new java.io.File("target/classes")) 
Undefined reference: java/util/concurrent/locks/LockSupport.park(Ljava/lang/Object;)V in target/classes/scala/concurrent/forkjoin/ForkJoinPool$WaitQueueNode.class 
Undefined reference: sun/misc/Unsafe.putOrderedObject(Ljava/lang/Object;JLjava/lang/Object;)V in target/classes/scala/concurrent/forkjoin/ForkJoinWorkerThread.class 
Undefined reference: sun/misc/Unsafe.putOrderedInt(Ljava/lang/Object;JI)V in target/classes/scala/concurrent/forkjoin/ForkJoinWorkerThread.class 
Undefined reference: java/util/concurrent/atomic/AtomicReferenceFieldUpdater.lazySet(Ljava/lang/Object;Ljava/lang/Object;)V in target/classes/scala/concurrent/forkjoin/LinkedTransferQueue$QNode.class 
Undefined reference: java/util/concurrent/locks/LockSupport.park(Ljava/lang/Object;)V in target/classes/scala/concurrent/forkjoin/LinkedTransferQueue.class 
Undefined reference: java/util/concurrent/locks/LockSupport.parkNanos(Ljava/lang/Object;J)V in target/classes/scala/concurrent/forkjoin/LinkedTransferQueue.class 
2

Điều không rõ ràng đối với tôi về những gì bạn đang cố gắng đạt được. Vì vậy, tôi đoán rằng bạn đang cố gắng để đảm bảo rằng mã của bạn là 100% Java 1.4 tương thích, trong khi cũng cố gắng và tận dụng các cải tiến (giả thuyết) trong trình biên dịch Java bytecode 1.5. Cách đơn giản là thực hiện hai bản dựng:

  1. Tạo bằng Java 1.4 để kiểm tra xem mã của bạn có tương thích với thư viện Java 1.4 không.

  2. Xây dựng lần thứ hai bằng cách sử dụng Java 1.5 với nguồn 1.4 và mục tiêu 1.4.

Bắt là thao tác này chỉ phát hiện các lỗi tĩnh API không khớp hoặc nơi không tương thích trong hành vi lớp chứ không phải chữ ký.

Điều khác cần lưu ý là biên dịch Java trên nền tảng mới để chạy trên nền tảng cũ không có khả năng giúp ... nếu đó là những gì bạn đang cố gắng đạt được.

  • Trình biên dịch bytecode Java không tối ưu hóa nhiều và do đó bản phát hành mới hơn sẽ không tạo ra bytecode nhanh hơn đáng kể.

  • Trình biên dịch JIT có thể cải thiện đáng kể từ bản phát hành này sang bản phát hành tiếp theo, nhưng trình biên dịch JIT là một phần của nền tảng thực thi.

  • Nơi khác, nơi cải tiến hiệu suất có thể xảy ra là trong việc triển khai các thư viện lớp Java và đây cũng là một phần của nền tảng thực thi.

Tóm lại, nếu bạn biên dịch mã với trình biên dịch JDK 1.5 javac, bạn sẽ không nhận được lợi ích của cải tiến hiệu suất trong Java 1.5.

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