Sweetohm

Michel Casabianca

On voit parfois, sur certains projets Java, des horreurs comme un source que l’on modifie à la main pour mettre à jour la version de l’application. On peut faire beaucoup élégant grâce à la classe java.util.jar.Manifest : elle nous permet (plus ou moins simplement :o) de récupérer la version de l’application du MANIFEST contenu dans le JAR.

Pour reconnaître le manifeste de notre application, il faut qu’il soit identifié par son nom. Celui-ci sera renseigné dans le champ <name> du POM; la version sera quand à elle renseignée dans le champ <version>. On peut alors renvoyer la version avec la méthode suivante :

import java.io.IOException;
import java.net.URL;
import java.util.Enumeration;
import java.util.jar.Attributes;
import java.util.jar.Manifest;

/**
 * Return version extracted from MANIFEST.
 *
 * @return The application version as a String.
 */
private String getVersion() {
    try {
        Enumeration<URL> resources = getClass().getClassLoader().getResources("META-INF/MANIFEST.MF");
        while (resources.hasMoreElements()) {
            try {
                Manifest manifest = new Manifest(resources.nextElement().openStream());
                Attributes attributes = manifest.getMainAttributes();
                String name = attributes.getValue("Implementation-Title");
                if ("my-application-name".equals(name)) {
                    String version = attributes.getValue("Implementation-Version");
                    if (version != null) {
                        return version;
                    } else {
                        return "UNKNOWN";
                    }
                }
            } catch (IOException E) {
                // do nothing
            }
        }
    } catch(Exception e) {
        // do nothing
    }
    return "UNKNOWN";
}

On pourra alors afficher la version du serveur dans les logs au démarrage par exemple, ce qui est fort utile.

L’archive d’un projet d’exemple sur trouve ici. On pourra lancer l’exemple avec la commande mvn clean package exec:exec.

Enjoy!