як перевірити версію jar-файлу?


91

Зараз я працюю над польською програмою J2ME, просто вдосконалюючи її. Я відчуваю труднощі, щоб отримати точну версію файлу jar. Чи є спосіб знайти версію файлу jar для імпорту, зробленого в класі? Я маю на увазі, якщо у вас є щось, імпортуйте xyz; чи можемо ми знати, до якої версії належить пакет xy?

Відповіді:


78

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


Як я вже сказав, що працюю над вдосконаленням програми, я завантажив файли jar і знаю версію файлів jar. Але я хотів знати версію баночки, до якої належить упаковка, сподіваюся, ви її отримаєте.
Ritesh Mengji

Щоб пояснити вам більше, у мене є імпорт xyz, я знаю, що xy належить до a-4.1.jar, але програма, якою я працюю, була розроблена давно, і я не знаю, яку версію файлу a.jar вони використовували, я Мене турбує версія, оскільки деякі класи були амортизовані з банки попередньої версії (я так відчуваю), оскільки, хоча у мене є jar в бібліотеці, я вважаю, що імпорт не може бути вирішений
Ritesh Mengji

Отже, якщо ви знаєте версію jar, яку вони використовували під час створення програми, ви також використовували б ту ж версію jar для запуску програми?
Vivek

1
Якщо це те, що є вашими вимогами, то боюся, що вам доведеться переробляти програму, виключаючи застарілі банки. Оскільки пошук номера версії, пов’язаного з даним jar, схожий на функцію один до одного. Тільки один номер версії для одного файлу jar. Але знайти, яка версія jar була використана на момент розробки програми, для мене здається вкрай неможливим, якщо розробник не приєднає до програми необхідні банки.
Vivek

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 та специфікацію версії пакета



17

Тільки для заповнення наведеної відповіді.

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

Ви можете перевірити вміст банки в будь-якому архіваторі, що підтримує zip.



11

Кожна версія jar має унікальну контрольну суму. Ви можете розрахувати контрольну суму для вашого jar (який не мав інформації про версію) і порівняти його з різними версіями jar. Ми також можемо шукати банку за допомогою контрольної суми.

Зверніться до цього запитання, щоб розрахувати контрольну суму: Який найкращий спосіб обчислити контрольну суму для файлу, який знаходиться на моїй машині?


5
Я просто розрахував банку md5 і вставив її в Google. Працювали чудово, велике спасибі!
mik01aj

7

В основному ви повинні використовувати java.lang.Packageклас, який використовує завантажувач класів, щоб дати вам інформацію про ваші класи.

приклад:

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

Я думаю, що відомий спосіб використання цієї функції використовує цю функцію для відстеження імені / версії JAR кожного класу у створених стеках.

див. також http://docs.oracle.com/javase/8/docs/technotes/guides/versioning/spec/versioning2.html#wp90779


3

Ця проста програма перелічить усі випадки для версії jar, а саме

  • Версію знайдено у файлі маніфесту
  • У Manifest не знайдено жодної версії, навіть із назви 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
FYI, для тих, хто віддає перевагу 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

Ви можете відфільтрувати версію з файлу MANIFEST за допомогою

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.