come controllare la versione del file jar?


91

Attualmente sto lavorando a un'applicazione di lucidatura J2ME, solo migliorandola. Ho difficoltà a ottenere la versione esatta del file jar. C'è un modo per trovare la versione del file jar per le importazioni effettuate nella classe? Voglio dire, se hai qualcosa, importa xyz; possiamo sapere a quale versione del pacchetto jar xy appartiene?

Risposte:


78

Decomprimere il file JAR e cercare il file manifest ( META-INF\MANIFEST.MF). Il file manifest del file JAR potrebbe contenere un numero di versione (ma non sempre viene specificata una versione).


Come ho detto che sto lavorando per migliorare l'applicazione, ho scaricato i file jar e conosco la versione dei file jar. Ma volevo sapere la versione del barattolo a cui appartiene il pacchetto, spero che tu ottenga.
Ritesh Mengji

Per spiegarti di più, ho import xyz, so che xy appartiene a a-4.1.jar, ma l'applicazione su cui sto lavorando è stata sviluppata molto tempo fa, e io dono quale versione del file a.jar hanno usato, io Sono preoccupato per la versione perché, alcune delle classi sono state svalutate dal jar della versione precedente (mi sento così), perché, anche se ho jar nella libreria, trovo che l'importazione non possa essere risolta
Ritesh Mengji

Quindi, se conosci la versione di jar che hanno usato durante la creazione dell'applicazione, useresti anche la stessa versione di jar per eseguire l'applicazione?
Vivek

1
Se questo è il tuo requisito, temo che dovrai ricostruire l'applicazione escludendo i barattoli obsoleti. Perché trovare il numero di versione associato a un determinato jar è come una funzione uno a uno. Un solo numero di versione per un file jar. Ma trovare quale versione di jar è stata utilizzata al momento dello sviluppo dell'applicazione mi sembra altamente impossibile a meno che lo sviluppatore non allega i jar richiesti con l'applicazione.
Vivek

1
La registrazione della versione in MANIFEST.MF sembra essere facoltativa. Non esiste alcuna versione registrata in vari sqljdbc42.jarfile che ho utilizzato con Cognos, tuttavia Cognos è in grado di segnalare una versione (4.2.6420.100). Da dove viene questa versione se non è registrata nel manifest?
Nick.McDermaid

52

Devi decomprimerlo e controllarne il META-INF/MANIFEST.MFfile, ad es

unzip -p file.jar | head

o più specifico:

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

26

Solo per espandere le risposte sopra, all'interno del file META-INF / MANIFEST.MF nel JAR, probabilmente vedrai una riga: Manifest-Version: 1.0 ← Questo NON è il numero di versioni del vaso!

Devi cercare Implementation-Versionquale, se presente, è una stringa di testo libero, quindi dipende interamente dall'autore del JAR da quello che troverai lì. Vedere anche i documenti Oracle e le specifiche della versione del pacchetto


Questa risposta (e altre) è attualmente discussa su Meta
Thomas Weller il

17

Solo per completare la risposta di cui sopra.

Il file manifest si trova all'interno del jar nel META-INF\MANIFEST.MFpercorso.

Puoi esaminare il contenuto di jar in qualsiasi archiviatore che supporti zip.


2
Questa risposta (e altre) è attualmente discussa su Meta
Thomas Weller il

11

Ogni versione del vaso ha un checksum univoco. Puoi calcolare il checksum per il tuo jar (che non aveva informazioni sulla versione) e confrontarlo con le diverse versioni del jar. Possiamo anche cercare un vaso usando il checksum.

Fai riferimento a questa domanda per calcolare il checksum: Qual è il modo migliore per calcolare un checksum per un file che si trova sulla mia macchina?


5
Ho appena calcolato il jar md5 e l'ho incollato su google. Ha funzionato alla grande, grazie mille!
mik01aj

7

Fondamentalmente dovresti usare la java.lang.Packageclasse che usa il classloader per darti informazioni sulle tue classi.

esempio:

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

Penso che il logback sia noto per utilizzare questa funzione per tracciare il nome / versione JAR di ciascuna classe nei suoi stacktrace prodotti.

vedere anche http://docs.oracle.com/javase/8/docs/technotes/guides/versioning/spec/versioning2.html#wp90779


3

Questo semplice programma elencherà tutti i casi per la versione di jar, vale a dire

  • Versione trovata nel file manifest
  • Nessuna versione trovata in Manifest e nemmeno dal nome del vaso
  • File manifest non trovato

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

Utilizza il jar javaxt-core che può essere scaricato da http://www.javaxt.com/downloads/


Grazie per il riferimento a javaxt, ho appena usato il codice di esempio più semplice da javaxt.com/Tutorials/Jar/…
David

1
Cordiali saluti, per coloro che preferiscono che Maven estragga javaxt-core piuttosto che scaricare il JAR, è possibile utilizzare uno di questi approcci: gist.github.com/daluu/dda7b29cb5b6e0fbfbaec664eb759739 , gist.github.com/daluu/52af7eef52563ddf78fe
David

2

Sono in ritardo ma puoi provare i seguenti due metodi

utilizzando queste classi necessarie

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

Questi metodi mi consentono di accedere agli attributi jar. Mi piace essere retrocompatibile e utilizzare le ultime novità. Quindi ho usato questo

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

Funziona bene quando usi Maven e hai bisogno di dettagli pom per classi conosciute. Spero che sia di aiuto.


1

Per Linux, prova a seguire:

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


1

Se hai winrar, apri il jar con winrar, fai doppio clic per aprire la cartella META-INF. Estratto MANIFEST.MFeCHANGES file in qualsiasi posizione (ad esempio desktop).

Apri i file estratti in un editor di testo: vedrai la versione di implementazione o la versione di rilascio.


0

È possibile filtrare la versione dal file MANIFEST utilizzando

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


Questo sembra per lo più duplicare questa risposta precedente - stackoverflow.com/a/38313502/272387 - e non è garantito che i manifest Bundle-Version.
Richlv

0

Ho pensato di dare una risposta più recente poiché questa domanda è ancora abbastanza alta nelle ricerche.

Verifica della versione JAR CLi:

Eseguire quanto segue sul file jar CLi:

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

Output di esempio:

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

La versione CLi è elencata sopra.

Per ottenere la versione server, eseguire quanto segue:

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

(quanto sopra varierà in base all'implementazione dell'autenticazione, si prega di modificare di conseguenza)

Output di esempio:

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.