Обнаружьте использование более старых библиотек Java

Существует ли сторонняя библиотека для обнаружения использования библиотеки Java 1.5 при компиляции с 1,5 компиляторами с - источник 1.4 и - предназначается 1.4?

Я мог использовать 1.4 rt.jar в bootclasspath однако, я надеюсь, что существует лучший путь. Использоваться, например, приводить компиляцию/сборку к сбою, если более новой библиотекой пользуются.

5
задан Peter Mortensen 28 August 2015 в 17:38
поделиться

2 ответа

Любопытное название Animal Sniffer предназначено для этой задачи. См. запись в блоге Kohsuke Compiling with JDK6 and running on JDK5

Он упакован как Maven Plugin (пример использования приведен в этом ответе), но может быть вызван и программно:

 ~/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 = org.jvnet.animal_sniffer.SignatureChecker@2a65dbe8

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
3
ответ дан 14 December 2019 в 19:01
поделиться

Мне неясно, чего вы пытаетесь достичь. Поэтому я предполагаю, что вы пытаетесь убедиться, что ваш код на 100% совместим с Java 1.4, но при этом пытаетесь использовать (гипотетические) улучшения в компиляторе байткода Java 1.5. Простой способ - сделать две сборки:

  1. Сборка с использованием Java 1.4, чтобы проверить, что ваш код совместим с библиотеками Java 1.4.

  2. Второй раз собрать с использованием Java 1.5 с параметрами -source 1.4 и -target 1.4.

Загвоздка в том, что это позволяет обнаружить только статические несоответствия API, и может пропустить проблемы, когда вы используете API рефлексивно или когда несовместимость заключается в поведении класса, а не в сигнатурах.

Другая вещь, которую следует отметить, заключается в том, что компиляция Java на новой платформе для запуска на старой платформе вряд ли поможет... если это то, чего вы пытаетесь достичь.

  • Компиляторы байткода Java не делают большой оптимизации, и поэтому более новый выпуск не будет производить значительно более быстрый байткод.

  • Компиляторы JIT, вероятно, значительно улучшаются от выпуска к выпуску, но компилятор JIT является частью платформы исполнения.

  • Другое место, где может произойти улучшение производительности - это реализация библиотек классов Java, а они также являются частью платформы исполнения.

Короче говоря, если вы компилируете код с помощью компилятора JDK 1.5 javac, а затем запускаете его на платформе Java 1.4, вы не получите преимущества повышения производительности в Java 1.5.

2
ответ дан 14 December 2019 в 19:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: