как проверить версию файла 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.