Файл манифеста JAR - Разница между спецификацией и реализацией

Я хочу добавить информацию о версии (и, возможно, некоторые другие метаданные о банке) в банку библиотеки, которую я создал. Однако я не уверен, какой атрибут использовать. Я обнаружил, что спецификация, а также документация объясняет что могут быть Specification-Version и Implementation-Version (и заголовок и поставщик для обоих). Но ни один из них не объясняет, какова разница между спецификацией и реализацией.

Я также рассмотрел разные примеры.

В чем же разница между метаданными Спецификация и Реализация? Как следует использовать эти разные атрибуты (особенно номера версий)? Как имеет смысл, что поставщик спецификации и реализация различны?

Разве это даже играет роль, которую я там вложил?

Ответ 1

Значение каждого объясняется в документации java.lang.Package.

Спецификация-Версия должна состоять из последовательностей цифр ASCII, разделенных периодами ASCII. Никакие другие символы не допускаются, периоды не могут быть в начале или в конце значения, а последовательные периоды не допускаются.

Version-Version - это строка свободной формы. Он может иметь любой формат.

Спецификация-версия всегда связана с пакетом. Если вы укажете его для всего манифеста вместо определенного пакета, он применим ко всем пакетам в файле .jar.

Спецификация-версия используется рядом технологий Java как средство разрешения зависимостей. Если какая-либо программа говорит, что ей требуется, скажем, версия 2.1 или новее библиотеки JMF, некоторые среды Java будут анализировать номера в спецификации-версии каждого манифеста с соответствующим типом-спецификацией и будут уверены, что правильная версия (и никакая другая версия) доступна в пути к классам во время выполнения.

Фактически, метод Package.isCompatibleWith выполняет эту проверку. Вы даже можете использовать его для проверки минимальной версии Java:

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

Ответ 2

Ну, спецификация - это ваш контракт, например:

  • стандарт, такой как JAXB, JDBC или один из различных стандартов Java EE (например, EJB 2.x, EJB 3.0, EJB 3.1).
  • API для вашей библиотеки, структуры или службы

Реализация - это реализация этой спецификации.

И хотя API спецификации (и, следовательно, версия спецификации) может не измениться, версия реализации может измениться, поскольку вы исправляете ошибки и т.д.

Ответ 3

Рассмотрим манифест servlet-api.jar из Apache Tomcat:

Manifest-Version: 1.0
Ant-Version: Apache Ant 1.8.4
Created-By: 1.7.0_40-b43 (Oracle Corporation)
X-Compile-Source-JDK: 1.7
X-Compile-Target-JDK: 1.7

Name: javax/servlet/
Specification-Title: Java API for Servlets
Specification-Version: 3.1
Specification-Vendor: Sun Microsystems, Inc.
Implementation-Title: javax.servlet
Implementation-Version: 3.1.FR
Implementation-Vendor: Apache Software Foundation

Apache - один из нескольких исполнителей спецификации сервлета 3.1, определяемый JCP (основанный Sun.)