Получить версию jar во время выполнения

Мне интересно, можно ли получить во время исполнения номер версии из jar, из которого появился класс?

Я знаю, что можно найти банку, из которой класс приходит:

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

но как насчет версии?

(предполагая, что его нет в имени файла:))

Ответ 1

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);
  }
}

Ответ 2

Попробуйте, это может быть полезно:

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

Вывод:

1.7
1.7.0_25

Ответ 3

Будьте осторожны, используя getPackage(). GetImplementationVersion/getSpecificationVersion()

getSpecificationVersion возвращает specVersion из манифеста. Manifest является свойством jar и используется в sun.misc.URLClassPath как

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

Поэтому, если кто-то использует вашу библиотеку в качестве зависимости для fat jar, он возвращает версию Manifest для fat jar.