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

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

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

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

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

Он даже играет роль, что я положил туда?

3 ответов


значение каждого объясняется в документация java.ленг.Пакет.

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

на Реализация-Версии - строка свободной формы. Он может иметь любой формат.

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

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

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

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

обновление

вышеуказанное не будет работать в модульном приложении Java 9. От документация Ява.ленг.Пакет:

пакет, автоматически определенный для классов в именованном модуле, имеет следующие свойства:
...
* Названия спецификаций и реализации, версии и поставщики не указаны.

пакет, автоматически определенный для классов в неназванном модуле, имеет следующие свойства:
...
* Спецификации и названия реализации, версии и поставщики: неопределенный.

программы Java 9, работающие как модули, должны использовать ModuleDescriptor.version (). Обратите внимание, что ModuleDescriptor.Класс версии сравним:

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

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

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

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

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


рассмотрим сервлет-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 (основано солнцем.)