как проверить версию файла jar?


91

В настоящее время я работаю над полировальным приложением J2ME, просто улучшая его. Я не могу получить точную версию файла jar. Есть ли способ найти версию файла jar для импорта, выполненного в классе? Я имею в виду, что если у вас есть что-то, импортируйте xyz; можем ли мы узнать, к какой версии принадлежит пакет jar xy?

Ответы:


78

Распакуйте файл JAR и найдите файл манифеста ( META-INF\MANIFEST.MF). Файл манифеста файла JAR может содержать номер версии (но не всегда версия указывается).


Когда я сказал, что работаю над улучшением приложения, я загрузил файлы jar и знаю версию файлов jar. Но я хотел узнать версию фляги, к которой принадлежит пакет, надеюсь, вы ее поняли.
— Ритеш Мэнджи,

Чтобы объяснить вам больше, у меня есть импорт xyz, я знаю, что xy принадлежит a-4.1.jar, но приложение, над которым я работаю, было разработано давно, и я не знаю, какую версию файла a.jar они использовали, я меня беспокоит версия, потому что некоторые классы обесценились по сравнению с jar старой версии (я так чувствую), потому что, хотя у меня есть jar в библиотеке, я обнаружил, что импорт не может быть разрешен
— Ритеш Мэнджи,

Итак, если вы знаете версию jar, которую они использовали при создании приложения, вы бы также использовали ту же версию jar для выполнения приложения?
— Вивек

1
Если это то, что вам нужно, то я боюсь, что вам придется перестраивать приложение, исключая устаревшие jar-файлы. Потому что поиск номера версии, связанной с данным jar, подобен функции один к одному. Только один номер версии для одного файла jar. Но определение того, какая версия jar использовалась во время разработки приложения, кажется мне совершенно невозможным, если разработчик не прикрепит к приложению необходимые jar-файлы.
— Вивек

1
Версия для записи в MANIFEST.MF кажется необязательной. Нет версии, записанной в различных sqljdbc42.jarфайлах, которые я использовал с Cognos, но Cognos может сообщить версию (4.2.6420.100). Откуда у него эта версия, если она не записана в манифесте?
— Nick.McDermaid

52

Вам нужно разархивировать его и проверить META-INF/MANIFEST.MFфайл, например

unzip -p file.jar | head

или более конкретно:

unzip -p file.jar META-INF/MANIFEST.MF

26

Чтобы расширить ответы выше, внутри файла META-INF / MANIFEST.MF в JAR вы, вероятно, увидите строку: Manifest-Version: 1.0 ← Это НЕ номер версии jar!

Вам нужно искать Implementation-Version, какая из строк произвольного текста, если она есть, полностью зависит от автора JAR относительно того, что вы там найдете. См. Также документацию Oracle и спецификацию версии пакета.


Этот (и другие) ответ в настоящее время обсуждается на Meta
— Томас Веллер

17

Просто чтобы завершить приведенный выше ответ.

Файл манифеста находится внутри jar по META-INF\MANIFEST.MFпути.

Вы можете просмотреть содержимое jar в любом архиваторе, поддерживающем zip.


2
Этот (и другие) ответ в настоящее время обсуждается на Meta
— Томас Веллер

11

Каждая версия jar имеет уникальную контрольную сумму. Вы можете рассчитать контрольную сумму для своей банки (в которой не было информации о версии) и сравнить ее с различными версиями банки. Мы также можем выполнить поиск в банке по контрольной сумме.

Обратитесь к этому вопросу, чтобы вычислить контрольную сумму: Как лучше всего рассчитать контрольную сумму для файла, находящегося на моей машине?


5
Я просто посчитал jar md5 и вставил в гугл. Сработал отлично, спасибо большое!
— mik01aj 07

7

В основном вы должны использовать java.lang.Package класс, который использует загрузчик классов, чтобы предоставить вам информацию о ваших классах.

пример:

String.class.getPackage().getImplementationVersion();
Package.getPackage(this).getImplementationVersion();
Package.getPackage("java.lang.String").getImplementationVersion();

Я думаю, что известно, что logback использует эту функцию для отслеживания имени / версии JAR каждого класса в его производимых трассировках стека.

см. также http://docs.oracle.com/javase/8/docs/technotes/guides/versioning/spec/versioning2.html#wp90779


3

Эта простая программа перечислит все случаи для версии jar, а именно

  • Версия найдена в файле манифеста
  • Версия не найдена в манифесте и даже по имени jar
  • Файл манифеста не найден

    Map<String, String> jarsWithVersionFound   = new LinkedHashMap<String, String>();
    List<String> jarsWithNoManifest     = new LinkedList<String>();
    List<String> jarsWithNoVersionFound = new LinkedList<String>();
    
    //loop through the files in lib folder
    //pick a jar one by one and getVersion()
    //print in console..save to file(?)..maybe later
    
    File[] files = new File("path_to_jar_folder").listFiles();
    
    for(File file : files)
    {
        String fileName = file.getName();
    
    
        try
        {
            String jarVersion = new Jar(file).getVersion();
    
            if(jarVersion == null)
                jarsWithNoVersionFound.add(fileName);
            else
                jarsWithVersionFound.put(fileName, jarVersion);
    
        }
        catch(Exception ex)
        {
            jarsWithNoManifest.add(fileName);
        }
    }
    
    System.out.println("******* JARs with versions found *******");
    for(Entry<String, String> jarName : jarsWithVersionFound.entrySet())
        System.out.println(jarName.getKey() + " : " + jarName.getValue());
    
    System.out.println("\n \n ******* JARs with no versions found *******");
    for(String jarName : jarsWithNoVersionFound)
        System.out.println(jarName);
    
    System.out.println("\n \n ******* JARs with no manifest found *******");
    for(String jarName : jarsWithNoManifest)
        System.out.println(jarName);
    

Он использует javaxt-core jar, который можно загрузить с http://www.javaxt.com/downloads/


Спасибо за ссылку на javaxt, я просто использовал более простой пример кода с сайта javaxt.com/Tutorials/Jar/…
— Дэвид

1
К вашему сведению, для тех, кто предпочитает maven извлекать javaxt-core, а не загружать JAR, вы можете использовать любой из этих подходов: gist.github.com/daluu/dda7b29cb5b6e0fbfbaec664eb759739 , gist.github.com/daluu/52af7eef52563ddf78fe
— David

2

Я опаздываю, но вы можете попробовать следующие два метода

используя эти необходимые классы

import java.util.jar.Attributes;
import java.util.jar.Manifest;

Эти методы позволяют мне получить доступ к атрибутам jar. Мне нравится иметь обратную совместимость и использовать новейшие версии. Так что я использовал это

public Attributes detectClassBuildInfoAttributes(Class sourceClass) throws MalformedURLException, IOException {
    String className = sourceClass.getSimpleName() + ".class";
    String classPath = sourceClass.getResource(className).toString();
    if (!classPath.startsWith("jar")) {
      // Class not from JAR
      return null;
    }
    String manifestPath = classPath.substring(0, classPath.lastIndexOf("!") + 1) + 
        "/META-INF/MANIFEST.MF";
    Manifest manifest = new Manifest(new URL(manifestPath).openStream());
    return manifest.getEntries().get("Build-Info");
}

public String retrieveClassInfoAttribute(Class sourceClass, String attributeName) throws MalformedURLException, IOException {
    Attributes version_attr = detectClassBuildInfoAttributes(sourceClass);

    String attribute = version_attr.getValue(attributeName);

    return attribute;
}

Это хорошо работает, когда вы используете maven и нуждаетесь в деталях pom для известных классов. Надеюсь это поможет.


1

Для Linux попробуйте следующее:

найти . -name "YOUR_JAR_FILE.jar" -exec zipgrep "Версия реализации:" '{}' \; | awk -F ':' '{print $ 2}'


1

Если у вас есть WinRAR, откройте банку с помощью WinRAR, дважды щелкните, чтобы открыть папку META-INF. Извлечение MANIFEST.MFи CHANGESфайлы в любом месте (скажем рабочий стол).

Откройте извлеченные файлы в текстовом редакторе: вы увидите версию реализации или версию выпуска.


0

Вы можете отфильтровать версию из файла МАНИФЕСТА, используя

unzip -p my.jar META-INF/MANIFEST.MF | grep 'Bundle-Version'


Кажется, что это в основном дублирует этот старый ответ - stackoverflow.com/a/38313502/272387 - и манифесты не гарантируются Bundle-Version.
— Richlv

0

Думал, что дам более свежий ответ, так как этот вопрос все еще довольно часто встречается в поисковых запросах.

Проверка версии CLi JAR:

Выполните следующее в файле jar CLi:

unzip -p jenkins-cli.jar META-INF/MANIFEST.MF

Пример вывода:

Manifest-Version: 1.0
Built-By: kohsuke
Jenkins-CLI-Version: 2.210  <--- Jenkins CLI Version
Created-By: Apache Maven 3.6.1
Build-Jdk: 1.8.0_144
Main-Class: hudson.cli.CLI

Версия CLi указана выше.

Чтобы получить версию сервера, запустите следующее:

java -jar ./jenkins-cli.jar -s https://<Server_URL> -auth <email>@<domain>.com:<API Token> version

(приведенное выше будет зависеть от вашей реализации аутентификации, пожалуйста, измените соответствующим образом)

Пример вывода:

Dec 23, 2019 4:42:55 PM org.apache.sshd.common.util.security.AbstractSecurityProviderRegistrar getOrCreateProvider
INFO: getOrCreateProvider(EdDSA) created instance of net.i2p.crypto.eddsa.EdDSASecurityProvider
2.210  <-- Jenkins Server Version

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.