jak sprawdzić wersję pliku jar?


91

Obecnie pracuję nad polską aplikacją J2ME, tylko ją ulepszam. Mam trudności z uzyskaniem dokładnej wersji pliku jar. Czy istnieje sposób, aby znaleźć wersję pliku jar do importu wykonanego w klasie? To znaczy, jeśli masz coś, zaimportuj xyz; czy możemy wiedzieć, do której wersji należy pakiet jar xy?

Odpowiedzi:


78

Rozpakuj plik JAR i poszukaj pliku manifestu ( META-INF\MANIFEST.MF). Plik manifestu pliku JAR może zawierać numer wersji (ale nie zawsze jest określona wersja).


Jak powiedziałem, że pracuję nad ulepszeniem aplikacji, pobrałem pliki jar i znam wersję tych plików. Ale chciałem poznać wersję jar, do której należy pakiet, mam nadzieję, że ją dostaniesz.
Ritesh Mengji

Żeby wyjaśnić więcej, mam import xyz, wiem, że xy należy do a-4.1.jar, ale aplikacja, na której pracuję, została opracowana dawno temu i nie wiem, jakiej wersji pliku a.jar używali, martwię się o wersję, ponieważ niektóre klasy zostały zdeprecjonowane z słoika starszej wersji (tak mi się wydaje), ponieważ mimo że mam jar w bibliotece, uważam, że nie można rozwiązać importu
Ritesh Mengji

Czy więc jeśli znasz wersję jar, której użyli podczas tworzenia aplikacji, używałbyś tej samej wersji jar do wykonania aplikacji?
Vivek

1
Jeśli takie są Twoje wymagania, to obawiam się, że będziesz musiał przebudować aplikację z wyłączeniem przestarzałych plików jar. Ponieważ znalezienie numeru wersji związanego z danym plikiem jar jest jak funkcja jeden do jednego. Tylko jeden numer wersji dla jednego pliku jar. Jednak znalezienie wersji jar, która była używana w czasie tworzenia aplikacji, wydaje mi się wysoce niemożliwe, chyba że programista dołączy do aplikacji wymagane pliki jar.
Vivek

1
Wersja nagrywania w MANIFEST.MF wydaje się być opcjonalna. Nie ma wersji zapisanej w różnych sqljdbc42.jarplikach, których używałem z Cognos, jednak Cognos jest w stanie zgłosić wersję (4.2.6420.100). Skąd bierze tę wersję, jeśli nie jest zapisana w manifeście?
Nick.McDermaid

52

Musisz go rozpakować i sprawdzić jego META-INF/MANIFEST.MFplik, np

unzip -p file.jar | head

lub bardziej szczegółowe:

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

26

Aby rozwinąć powyższe odpowiedzi, w pliku META-INF / MANIFEST.MF w JAR, prawdopodobnie zobaczysz wiersz: Manifest-Version: 1.0 ← To NIE jest numer wersji jar!

Musisz sprawdzić, Implementation-Versionktóry, jeśli jest obecny, jest ciągiem tekstowym, tak całkowicie zależnym od autora JAR, co do tego, co tam znajdziesz. Zobacz także dokumentację Oracle i specyfikację wersji pakietu


Ta odpowiedź (i inne) jest obecnie omawiana w Meta
Thomas Weller

17

Wystarczy uzupełnić powyższą odpowiedź.

Plik manifestu znajduje się w pliku jar w META-INF\MANIFEST.MFścieżce.

Możesz sprawdzić zawartość słoika w dowolnym archiwizatorze obsługującym zip.


2
Ta odpowiedź (i inne) jest obecnie omawiana w Meta
Thomas Weller

11

Każda wersja słoika ma unikalną sumę kontrolną. Możesz obliczyć sumę kontrolną swojego słoika (który nie miał informacji o wersji) i porównać ją z różnymi wersjami słoika. Możemy również przeszukać słoik za pomocą sumy kontrolnej.

Zapoznaj się z tym pytaniem, aby obliczyć sumę kontrolną: Jaki jest najlepszy sposób obliczenia sumy kontrolnej dla pliku znajdującego się na moim komputerze?


5
Właśnie obliczyłem jar md5 i wkleiłem go do Google. Świetnie działało, wielkie dzięki!
mik01aj

7

Zasadniczo powinieneś użyć java.lang.Packageklasy, która używa modułu ładującego klasy do przekazywania informacji o twoich klasach.

przykład:

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

Wydaje mi się, że logback wykorzystuje tę funkcję do śledzenia nazwy / wersji JAR każdej klasy w utworzonych przez nią stacktraces.

zobacz także http://docs.oracle.com/javase/8/docs/technotes/guides/versioning/spec/versioning2.html#wp90779


3

Ten prosty program wyświetli listę wszystkich przypadków dla wersji jar mianowicie

  • Wersja znaleziona w pliku manifestu
  • Nie znaleziono wersji w Manifest, a nawet z nazwy jar
  • Nie znaleziono pliku manifestu

    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);
    

Używa javaxt-core jar, który można pobrać ze strony http://www.javaxt.com/downloads/


Dzięki za odniesienie do javaxt, właśnie użyłem tam prostszego kodu z javaxt.com/Tutorials/Jar/ ...
David

1
Do Twojej wiadomości, dla tych, którzy wolą maven, aby pobrać javaxt-core zamiast pobierać JAR, możesz wykonać jedną z tych metod: gist.github.com/daluu/dda7b29cb5b6e0fbfbaec664eb759739 , gist.github.com/daluu/52af7eef52563ddf78fe
David

2

Jestem spóźniony, ale możesz wypróbować dwie następujące metody

używając tych potrzebnych klas

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

Te metody pozwalają mi uzyskać dostęp do atrybutów jar. Lubię być kompatybilny wstecz i używać najnowszych. Więc użyłem tego

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;
}

Działa to dobrze, gdy używasz maven i potrzebujesz szczegółów pom dla znanych klas. Mam nadzieję że to pomoże.


1

W systemie Linux spróbuj wykonać następujące czynności:

odnaleźć . -name "YOUR_JAR_FILE.jar" -exec zipgrep "Implementation-Version:" '{}' \; | awk -F ':' '{print $ 2}'


1

Jeśli masz winrar, otwórz jar za pomocą winrar, kliknij dwukrotnie, aby otworzyć folder META-INF. Rozpakuj MANIFEST.MFi CHANGESpliki do dowolnej lokalizacji (powiedzmy na pulpit).

Otwórz rozpakowane pliki w edytorze tekstu: zobaczysz wersję implementacji lub wersję wydania.



0

Pomyślałem, że dam bardziej aktualną odpowiedź, ponieważ to pytanie wciąż pojawia się dość często w wyszukiwaniach.

Sprawdzanie wersji CLi JAR:

Uruchom następujące polecenie w pliku jar CLi:

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

Przykładowe dane wyjściowe:

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

Wersja CLi jest wymieniona powyżej.

Aby uzyskać wersję serwera, uruchom następujące polecenie:

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

(powyższe będzie się różnić w zależności od implementacji uwierzytelniania, proszę odpowiednio zmienić)

Przykładowe dane wyjściowe:

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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.