JAR清单文件-规范和实现之间的区别

约阿希姆·库兹(Joachim Kurz):

我想将版本信息(以及可能有关该jar的其他一些元数据)添加到我创建的库的jar中。但是,我不确定要使用什么属性。我发现规范以及文档都说明可以有一个Specification-Version和一个Implementation-Version(以及两个的标题和供应商)。但是,两者都没有正确解释规范和实现之间的区别。

我也看了不同的例子。

  • 文档中的一个使用易于理解的名称作为“规范标题”,并使用包名称作为“实现”标题。以小数点分隔的版本号用于规范版本,而简单的内部版本号用于实现版本。
  • gradle教程似乎只使用了一个Implementation-Version和一个人类可读的字符串作为Implementation-Title
  • 另一个问题中,我找到了一个示例,其中针对不同的软件包有多个实现版本。

这里的规范和实现元数据之间到底有什么区别?应如何使用这些不同的属性(尤其是版本号)?规范的供应商和实现方式不同有何意义?

它甚至发挥了我在其中发挥的作用吗?

VGR:

每个的含义在java.lang.Package文档中进行了解释

部分规格版本必须由ASCII数字,由ASCII句点分隔的序列。不允许使用其他字符,句点不能在值的开头或结尾,并且不允许连续的句点。

实施-版本是无格式的字符串。它可以具有任何格式。

规范版本始终与包关联。如果为整个清单而不是为特定的软件包指定它,则它将应用于.jar文件中的所有软件包。

许多Java技术都使用Specification-Version作为解决依赖关系的一种方式。如果某个程序说需要2.1版或更高版本的JMF库,则某些Java环境将分析每个清单的Specification-Version中具有匹配的Specification-Title的数字,并确保使用正确的版本(和没有其他版本)在运行时在类路径中可用。

实际上,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文档中

为命名模块中的类自动定义的Package具有以下属性:

•未指定规范和实现的标题,版本和供应商。

为未命名模块中的类自动定义的Package具有以下属性:
...
•未指定规范和实现的标题,版本和供应商。

作为模块运行的Java 9程序应改用ModuleDescriptor.version()请注意,ModuleDescriptor.Version类是Comparable的:

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章