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.