web-dev-qa-db-fra.com

comment vérifier la version du fichier jar?

Je travaille actuellement sur une application de vernis J2ME, simplement pour l'améliorer. Je rencontre des difficultés pour obtenir la version exacte du fichier jar ... Est-ce qu'il y a un moyen de trouver la version du fichier jar pour les importations effectuées dans la classe? Je veux dire si vous avez quelque chose, importez x.y.z; Peut-on savoir à quelle version du paquet jar x.y appartient?

63
Ritesh

Décompressez le fichier JAR et recherchez le fichier manifeste (META-INF\MANIFEST.MF). Le fichier manifeste du fichier JAR peut contenir un numéro de version (mais une version n'est pas toujours spécifiée).

53
Vivek

Vous devez le décompresser et vérifier son fichier META-INF/MANIFEST.MF, par exemple.

unzip -p file.jar | head

ou plus spécifique:

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

Juste pour développer les réponses ci-dessus, à l'intérieur du fichier META-INF/MANIFEST.MF du fichier JAR, vous verrez probablement une ligne: Manifest-Version: 1.0 ← Ceci est ET NON le numéro de version du fichier jar!

Vous devez rechercher Implementation-Version qui, le cas échéant, est une chaîne de texte libre, donc entièrement à la discrétion de l'auteur du fichier JAR quant à ce que vous y trouverez dedans . Voir aussi Oracle docs et Version du package spécificaion

20
joth

Juste pour compléter la réponse ci-dessus.

Le fichier manifeste est situé dans le fichier jar, dans le chemin META-INF\MANIFEST.MF.

Vous pouvez examiner le contenu de jar dans n’importe quel archiveur prenant en charge Zip.

17
Vadzim

Chaque version de pot a une somme de contrôle unique. Vous pouvez calculer la somme de contrôle pour votre jarre (sans informations de version) et la comparer aux différentes versions du jar. Nous pouvons également rechercher un pot à l'aide d'une somme de contrôle.

Reportez-vous à cette question pour calculer la somme de contrôle: Quel est le meilleur moyen de calculer une somme de contrôle pour un fichier se trouvant sur ma machine?

11
vijay

En principe, vous devriez utiliser la classe Java.lang.Package qui utilise le chargeur de classes pour vous donner des informations sur vos classes.

exemple:

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

Je pense que logback est connu pour utiliser cette fonctionnalité pour suivre le nom/la version du fichier JAR de chaque classe dans les stacktraces qu'elle produit.

voir aussi http://docs.Oracle.com/javase/8/docs/technotes/guides/versioning/spec/versioning2.html#wp90779

4
Donatello

Ce programme simple listera tous les cas pour la version de jar à savoir

  • Version trouvée dans le fichier manifeste
  • Aucune version trouvée dans Manifest et même à partir du nom du pot
  • Fichier manifeste non trouvé

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

Il utilise le fichier javaxt-core qui peut être téléchargé à partir de http://www.javaxt.com/downloads/

3
Shanky_Gupta

Vous pouvez filtrer la version du fichier MANIFEST en utilisant 

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

1
Sudheer Avula

Pour Linux, essayez ce qui suit:

trouver . -name "YOUR_JAR_FILE.jar" -exec zipgrep "Version d'implémentation:" '{}' \; | awk -F ':' '{print $ 2}'

0
Bae Cheol Shin

Je suis en retard mais vous pouvez essayer les deux méthodes suivantes

en utilisant ces classes nécessaires

import Java.util.jar.Attributes;
import Java.util.jar.Manifest;

Ces méthodes me permettent d'accéder aux attributs de jar. J'aime être rétrocompatible et utiliser les dernières nouveautés. Alors j'ai utilisé ça

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

Cela fonctionne bien lorsque vous utilisez Maven et que vous avez besoin de pom détails pour connaître les classes. J'espère que cela t'aides.

0
GetBackerZ