在运行时获取jar版本

时间:2014-02-12 09:47:29

标签: java reflection jar

我想知道是否有可能在运行时检索该类来自的jar的版本号?

我知道可以找到该类来自的jar:

MyClass.class.getProtectionDomain().getCodeSource().getLocation().getPath();

但是版本怎么样?

(假设它不在文件名中:))

3 个答案:

答案 0 :(得分:16)

import javax.mail.internet.InternetAddress;

/**
Display package name and version information for javax.mail.internet.
*/
public final class ReadVersion {
  public static void main(String... aArgs){
    ReadVersion readVersion = new ReadVersion();
    readVersion.readVersionInfoInManifest();
  }

  public void readVersionInfoInManifest(){
    InternetAddress object = new InternetAddress();
    Package objPackage = object.getClass().getPackage();
    //examine the package object 
    String name = objPackage.getSpecificationTitle();
    String version = objPackage.getSpecificationVersion();
    //some jars may use 'Implementation Version' entries in the manifest instead
    System.out.println("Package name: " + name);
    System.out.println("Package version: " + version);
  }
}

答案 1 :(得分:16)

试试这个,它可能会有所帮助:

String s = new String();
System.out.println(s.getClass().getPackage().getSpecificationVersion());
System.out.println(s.getClass().getPackage().getImplementationVersion());

输出:

1.7
1.7.0_25

答案 2 :(得分:0)

请小心使用getPackage()。getImplementationVersion / getSpecificationVersion()

getSpecificationVersion返回清单中的specVersion。 清单是jar的属性,在sun.misc.URLClassPath中用作

  public Manifest getManifest() throws IOException {
                    SharedSecrets.javaUtilJarAccess().ensureInitialization(JarLoader.this.jar);
                    return JarLoader.this.jar.getManifest();
                }

因此,如果有人将您的库用作胖子罐的依赖项,它将返回胖子罐子的清单版本。