Какая версия javac построила мою банку?

Как я могу определить, какая версия компилятора Java была использована для сборки банку? У меня есть tar-батончик, и он мог быть построен в любом из трех JDK. Нам нужно точно знать, какой из них, поэтому мы можем подтвердить совместимость. Верна ли версия компилятора где-то в файлах классов или классе?

java,jar,

172

Ответов: 19


78 принят

Вы не можете сказать из файла $ jar xf log4j-1.2.15.jar, обязательно.

Загрузите шестнадцатеричный редактор и откройте один из файлов классов внутри файла $ ./org/apache/log4j/Appender.class ./org/apache/log4j/Appender.class: скомпилированные данные класса Java, версия 45.3 и посмотрите на смещения байта 4 - 7. Информация о версии встроена.

http://en.wikipedia.org/wiki/Java_class_file

Примечание. Как упоминалось в комментарии ниже,

эти байты говорят вам, какая версия компиляции класса FOR, а не какая версия скомпилировала ее.


267 ов

А jar- это просто контейнер. Это файл-архив a la tar. Хотя у jarнее может быть интересная информация, содержащаяся в ее иерархии META-INF , она не обязана указывать урожайность классов в ее содержимом. Для этого нужно изучить classфайлы в нем.

Как упоминал Питер Лори в комментарии к первому вопросу, вы не можете знать, какой выпуск JDK создал данный classфайл, но вы можете узнать версию класса байтового кода classфайла, содержащегося в a jar.

Да, этот вид отстой, но первым шагом является извлечение одного или нескольких классов из jar. Например:

$ javap -v ./org/apache/log4j/Appender.class | grep major
 major version: 45

В Linux, Mac OS X или Windows с установленной Cygwin команда file (1) знает версию класса.

file

Или, альтернативно, использование grepJDK как @ jikes.thunderbolt точно указывает:

> javap -v ./org/apache/log4j/Appender.class | findstr major
 major version: 45

И если вы отнесены к Windowsсреде либо без fileилиjavap

class

FWIW, я соглашусь, что $ file ~/bin/classes/P.class /home/dave/bin/classes/P.class: compiled Java class data, version 50.0 расскажут намного больше о заданном classфайле, чем заданный оригинальный вопрос.

В любом случае, другая версия класса, например:

javap -v <class> | findstr major

Основная версия версии класса соответствует следующим версиям Java JDK:

  • 45.3 = Java 1.1
  • 46 = Java 1.2
  • 47 = Java 1.3
  • 48 = Java 1.4
  • 49 = Java 5
  • 50 = Java 6
  • 51 = Java 7
  • 52 = Java 8
  • 53 = Java 9

41

Вот способ Java, чтобы найти эту информацию.

Windows: javap -v <class> | grep major
Unix:> javap -v Application | findstr major   major version: 51

Например:
javac


11 ов

Java-компилятор ( jar) не создает банки, он переводит файлы Java в файлы классов. Инструмент Jar ( jar) создает реальные банки. Если пользовательский манифест не указан, в манифесте по умолчанию указывается, какая версия JDK использовалась для создания баннера.


9

Нет необходимости распаковывать JAR (если одно из имен классов известно или просматривается, например, с использованием 7zip), поэтому в Windows будет достаточно:

javap -cp log4j-core-2.5.jar -verbose org.apache.logging.log4j.core.Logger | findstr major
Java, банки,
Похожие вопросы
Яндекс.Метрика