124 votes

comment vérifier la version d'un fichier jar ?

Je travaille actuellement sur une application polonaise J2ME, en l'améliorant. Je rencontre des difficultés pour obtenir la version exacte du fichier jar. Existe-t-il un moyen de trouver la version du fichier jar pour les importations effectuées dans la classe ? Je veux dire que si vous avez quelque chose comme import x.y.z, peut-on savoir à quelle version du jar le paquet x.y appartient ?

11voto

Dude Points 481

En principe, vous devez utiliser le java.lang.Package qui utilise le classloader 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é afin de tracer le nom/la version JAR de chaque classe dans ses stacktraces produits.

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

9voto

DC.Skells Points 313

J'ai pensé donner une réponse plus récente, car cette question revient souvent dans les recherches.

Vérification de la version de CLi JAR :

Exécutez ce qui suit sur le fichier jar CLi :

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

Exemple de sortie :

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 version CLi est indiquée ci-dessus.

Pour obtenir la version du serveur, exécutez ce qui suit :

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

(ce qui précède variera en fonction de votre mise en œuvre de l'authentification, veuillez le modifier en conséquence)

Exemple de sortie :

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

3voto

Shanky_Gupta Points 220

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

  • Version trouvée dans le fichier Manifest
  • Aucune version trouvée dans Manifest et même dans le nom du jar
  • 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 jar javaxt-core qui peut être téléchargé à l'adresse suivante http://www.javaxt.com/downloads/

0 votes

Merci pour la référence à javaxt, j'ai juste utilisé l'exemple de code plus simple qui s'y trouve à partir de javaxt.com/Tutoriels/Jar/

1 votes

Pour info, pour ceux qui préfèrent que maven tire javaxt-core plutôt que de télécharger le JAR, vous pouvez utiliser l'une ou l'autre de ces approches : gist.github.com/daluu/dda7b29cb5b6e0fbfbaec664eb759739 , gist.github.com/daluu/52af7eef52563ddf78fe

2voto

GetBackerZ Points 408

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 du bocal. J'aime être rétrocompatible et utiliser la dernière version. J'ai donc utilisé ceci

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 détails pom pour des classes connues. J'espère que cela vous aidera.

2voto

Bae Cheol Shin Points 1320

Pour Linux, essayez ce qui suit :

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X