Получить версию 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.