Get a JAR File version number

两盒软妹~` 提交于 2021-02-04 13:59:19

问题


I have an application used in clustering to keep it available if one or more failed and I want to implement a way to check the version of the jar file in java.

I have this piece of code to do that (e.g.: in the class MyClass) :

        URLClassLoader cl = (URLClassLoader) (new MyClass ())
            .getClass().getClassLoader();
        URL url = cl.findResource("META-INF/MANIFEST.MF");
        Manifest manifest = new Manifest(url.openStream());
        attributes = manifest.getMainAttributes();
        String version = attributes.getValue("Implementation-Version");

When i run the jar as an application it works fine BUT when i use the jar file as a librairie in an other application, i get the version number of the other application.

So my question is, how can i get the manifest of the jar where MyClass is contained ?

NB : I'm not interested in solution using static constraint like 'classLoader.getRessource("MyJar.jar")' or File("MyJar.jar")


回答1:


The correct way to obtain the Implementation Version is with the Package.getImplementationVersion() method:

String version = MyClass.class.getPackage().getImplementationVersion();



回答2:


You can code like :

java.io.File file = new java.io.File("/packages/file.jar"); //give path and file name
java.util.jar.JarFile jar = new java.util.jar.JarFile(file);
java.util.jar.Manifest manifest = jar.getManifest();

String versionNumber = "";
java.util.jar.Attributes attributes = manifest.getMainAttributes();
if (attributes!=null){
    java.util.Iterator it = attributes.keySet().iterator();
    while (it.hasNext()){
        java.util.jar.Attributes.Name key = (java.util.jar.Attributes.Name) it.next();
        String keyword = key.toString();
        if (keyword.equals("Implementation-Version") || keyword.equals("Bundle-Version")){
            versionNumber = (String) attributes.get(key);
            break;
        }
    }
}
jar.close();

System.out.println("Version: " + versionNumber); //"here it will print the version"

See this tutorial, thank you. I also learn new thing from here.




回答3:


If you know a class in the jar, you can get the location of the jar from the ProtectionDomain's CodeSource.

http://docs.oracle.com/javase/7/docs/api/java/lang/Class.html#getProtectionDomain%28%29

http://docs.oracle.com/javase/7/docs/api/java/security/ProtectionDomain.html#getCodeSource%28%29

http://docs.oracle.com/javase/7/docs/api/java/security/CodeSource.html#getLocation%28%29




回答4:


Finally i get the solution from a friend :

    // Get jarfile url
    String jarUrl = JarVersion.class
        .getProtectionDomain().getCodeSource()
        .getLocation().getFile();

    JarFile jar = new JarFile(new File(jarUrl));
    Manifest manifest = jar.getManifest();
    Attributes attributes = manifest.getMainAttributes();

    String version = attributes.getValue(IMPLEMENTATION_VERSION) 


来源:https://stackoverflow.com/questions/24306534/get-a-jar-file-version-number

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!