每个的含义在java.lang.Package的文档中进行了解释。
规范版本必须由 ASCII 数字序列组成,以 ASCII 句点分隔。不允许使用其他字符,句点不能位于值的开头或结尾,并且不允许使用连续的句点。
实现版本是一个自由格式的字符串。它可以具有任何格式。
规范版本始终与包相关联。如果为整个清单而不是特定程序包指定它,则它将应用于.jar文件中的所有程序包。
规范版本被许多 Java 技术用作解决依赖关系的一种手段。如果某个程序说它需要 JMF 库的 2.1 版或更高版本,一些 Java 环境将使用匹配的规范标题分析每个清单的规范版本中的数字,并确保在运行时类路径中提供正确的版本(并且没有其他版本)。
实际上,Package.isCompatibleWith 方法会进行这种检查。您甚至可以使用它来检查最低Java版本:
if (System.class.getPackage().isCompatibleWith("1.6")) {
System.out.println("Running in Java 1.6 or later.");
}
更新
上述操作在 Java 9 模块化应用程序中不起作用。从 java.lang.Package 的文档:
为命名模块中的类自动定义的包具有以下属性:
...
• 规范和实现标题、版本和供应商未指定。
为未命名模块中的类自动定义的包具有以下属性:
...
• 规范和实现标题、版本和供应商未指定。
作为模块运行的 Java 9 程序应改用 ModuleDescriptor.version()。请注意,ModuleDescriptor.Version 类是可比较的:
Module libraryModule = SomeLibraryClass.class.getModule();
Optional<ModuleDescriptor.Version> libraryVersion =
libraryModule.getDescriptor().version();
ModuleDescriptor.Version minimumRequiredVersion =
ModuleDescriptor.Version.parse("2.0");
if (libraryVersion.isPresent() &&
minimumRequiredVersion.compareTo(libraryVersion.get()) >= 0) {
System.out.println(libraryModule + " is version " +
minimumRequiredVersion + " or later.");
}