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?

Ritesh Mengji
źródło

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

Vivek
źródło
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
kenorb
źródło
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

joth
źródło
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.

Vadzim
źródło
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?

vijay
źródło
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

Donatello
źródło
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/

Shanky_Gupta
źródło
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.

GetBackerZ
źródło
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}'

Bae Cheol Shin
źródło
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.

Ganesan R
źródło
0

Możesz filtrować wersję z pliku MANIFEST za pomocą

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

Sudheer Avula
źródło
Wydaje się, że w większości powiela to starszą odpowiedź - stackoverflow.com/a/38313502/272387 - i nie ma gwarancji, że manifesty będą miały Bundle-Version.
Richlv
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
DC.Skells
źródło
-14

Można to sprawdzić poleceniem java -jar jarname

Akash Tolia
źródło
6
Spowoduje to uruchomienie main()metody JAR
Thomas Weller