在运行时获取jar版本

zib*_*ibi 14 java reflection jar

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

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

MyClass.class.getProtectionDomain().getCodeSource().getLocation().getPath();
Run Code Online (Sandbox Code Playgroud)

但是版本怎么样?

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

1ac*_*ac0 18

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);
  }
}
Run Code Online (Sandbox Code Playgroud)


She*_*nar 17

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

String s = new String();
System.out.println(s.getClass().getPackage().getSpecificationVersion());
System.out.println(s.getClass().getPackage().getImplementationVersion());
Run Code Online (Sandbox Code Playgroud)

输出:

1.7
1.7.0_25
Run Code Online (Sandbox Code Playgroud)


小智 5

小心使用 getPackage().getImplementationVersion/getSpecificationVersion()

getSpecificationVersion 从 Manifest 返回 specVersion。Manifest 是 jar 的一个属性,在 sun.misc.URLClassPath 中用作

  public Manifest getManifest() throws IOException {
                    SharedSecrets.javaUtilJarAccess().ensureInitialization(JarLoader.this.jar);
                    return JarLoader.this.jar.getManifest();
                }
Run Code Online (Sandbox Code Playgroud)

因此,如果有人使用您的库作为 fat jar 的依赖项,它会返回 fat jar 的 Manifest 版本。

  • 您刚刚强调了不制作 fat jar 的一个重要原因:它会清除各个库的清单信息。 (2认同)