在运行时获取jar包版本

28

我想知道是否有可能在运行时检索一个JAR文件的版本号,该JAR文件中包含了该类?

我知道可以找到包含该类的JAR文件:

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

但是版本呢?

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


1
Jars没有版本。 - user1907906
是的,你说得对,版本属于库版本,但在俚语中它是“拿jar包版本x.y.z”。 - 1ac0
4
Java 8 中,s.getClass().getPackage().getImplementationVersion() 可能为 null。 - Iakov Senatov
要在清单中包含实现版本,您需要修改maven-jar-plugin的<archive>配置元素,并将addDefaultImplementationEntries和addDefaultSpecificationEntries设置为true。这将修复s.getClass().getPackage().getImplementationVersion()返回null的问题。 - Isuru Hemantha
3个回答

29

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

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

输出:

1.7
1.7.0_25

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

如果你正在使用Maven构建JAR文件,objPackage.getSpecificationVersion()可能会返回版本为'null'的情况。 要解决这个问题,请参考:https://dev59.com/eHE85IYBdhLWcg3wkkY8 - Isuru Hemantha

6

请小心使用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();
                }

因此,如果有人将你的库用作fat jar的依赖项,则会返回fat jar的清单版本。


2
你刚刚强调了一个不制作fat jars的重要原因:它会抹掉单个库的清单信息。 - VGR

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接