gpt4 book ai didi

java - JAR list 文件 - 规范和实现之间的区别

转载 作者:太空狗 更新时间:2023-10-29 22:45:46 26 4
gpt4 key购买 nike

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

我也看了不同的例子。

  • 来自 documentation 的那个使用人类可读的名称作为 Specification-Title,并使用包名称作为 Implementation-Title。以点分隔的版本号用于规范版本,而简单的内部版本号用于实现版本。
  • gradle 教程似乎只使用一个 Implementation-Version 和一个人类可读的字符串作为 Implementation-Title
  • another question我找到了一个例子,其中有几个不同包的实现版本。

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

它甚至会发挥我放入其中的作用吗?

最佳答案

每个的含义在 documentation of java.lang.Package 中解释。 .

Specification-Version必须由 ASCII 数字序列组成,由 ASCII 句点分隔。不允许使用其他字符,句点不能位于值的开头或结尾,并且不允许连续的句点。

Implementation-Version是一个自由格式的字符串。它可以是任何格式。

Specification-Version 始终与包相关联。如果您为整个 list 而不是为特定包指定它,则它适用于 .jar 文件中的所有包。

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

事实上,Package.isCompatibleWith方法非常检查。您甚至可以使用它来检查最低 Java 版本:

if (System.class.getPackage().isCompatibleWith("1.6")) {
System.out.println("Running in Java 1.6 or later.");
}

更新

以上内容不适用于 Java 9 模块化应用程序。来自documentation for java.lang.Package :

A Package automatically defined for classes in a named module has the following properties:

• The specification and implementation titles, versions, and vendors are unspecified.

A Package automatically defined for classes in an unnamed module has the following properties:

• The specification and implementation titles, versions, and vendors are unspecified.

作为模块运行的 Java 9 程序应该使用 ModuleDescriptor.version()反而。请注意 ModuleDescriptor.Version class是可比较的:

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

关于java - JAR list 文件 - 规范和实现之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20994766/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com