Java Policy: различия между версиями

Материал из ALT Linux Wiki
 
(не показаны 34 промежуточные версии 5 участников)
Строка 1: Строка 1:
{{викифицировать}}
{{Policy
{{DraftPolicy
|responsible=Игорь Власенко
|responsible=viy}}
|since_branch=5.0}}


__TOC__
'''ALT Linux Java Policy: Требования к сборке java-приложений'''


=== ALT Linux Java Policy: Требования к сборке java-приложений ===
== Сфера применения ==


==== Необходимо соблюдать JPackage Policy ====
Данное полиси описывает требования к сборке и упаковке java-приложений и java-библиотек в Сизифе,
и является расширением и толкованием JPackage Policy применительно к ALT Linux.


== Необходимо соблюдать JPackage Policy ==
Основное условие упаковки java-библиотек и приложений:
При упаковке приложений для сизифа '''необходимо''' соблюдать JPackage Policy.
При упаковке приложений для сизифа '''необходимо''' соблюдать JPackage Policy.
Ознакомиться с JPackage Policy можно в следующих местах:
Оригинал JPackagePolicy — можно найти в пакете jpackage-utils (в сизифе или на [http://www.jpackage.org/ www.jpackage.org])
[[Java/JPackagePolicyTranslation|Перевод JPackagePolicy на русский.]]
[[Java/JPackageSpecTemplate|JPackage Spec Template]] — шаблон spec-файла для java-приложений, адаптированный для сизифа.
см. также [[Java/ClassPathInManifest|Использование Class-Path в MANIFEST.MF]]


==== Необходимо обеспечивать максимальную запускаемость на разных JVM ====
Оригинал JPackagePolicy можно найти в пакете jpackage-utils (в Сизифе или на [http://www.jpackage.org/ www.jpackage.org]).
Есть [[Java/JPackagePolicyTranslation|перевод JPackagePolicy на русский.]]
 
== Необходимо обеспечивать максимальную запускаемость на разных JVM ==
 
В настоящее время в Сизифе поддерживаются JVM
: java6 (java-1.6.0-sun, java-1.6.0-openjdk),
 
Также присутствуют частично поддерживаемые JVM
: java5 (java-1.5.0-sun, java-1.5.0-gcj43).
и неподдерживаемые JVM
: java4 (java-1.4.2-sun, java-1.4.2-blackdown, java-1.4.2-gcj41).
 
Компиляторы старших версий java по умолчанию создают class-файлы, несовместимые с младшими версиями java.
Например, class-файл, собранный под java6 по умолчанию, не будет работать под java5 и ниже.
Более того, если код приложения собран под java5, но хотя бы одна из используемых им библиотек собрана под
java6, то и все приложение не сможет работать под java5 и ниже (class version poisoning).
 
Пользовательские приложения '''должны запускаться и работать под всеми поддерживаемыми JVM''' (java5, java6).
Поэтому '''необходимо''' следить, чтобы в сборочных скриптах для maven, ant или make компилятор вызывался
с параметрами '''source и target в значении 1.5 или меньше''', если код не требует иного, либо использовать
BuildRequires: java-devel-default
Эта зависимость заведомо поставит в сборочную среду компилятор, который генерирует код, работающий на всех поддерживаемых JVM.
 
Исключением являются приложения, явно использующие особенности диалекта java6 и требующие для сборки java6 и выше. Однако и
для них рекомендуется явно указывать source и target в значении 1.6, поскольку со временем в сизифе появится java7.
 
Для библиотек дополнительно рекомендуется source и target в значении 1.4 или меньше, поскольку java4 JVM еще присутствуют
в сизифе, если их код это поддерживает.


11.03.2006
== Необходимо избегать зависимостей на конкретную JVM ==
mhz: В связи с появлением в Sisyphus пакетов j2se1.5-sun{,-devel}, которые теперь
выбираются по умолчанию в сборочной среде, появилась новая особенность при сборке пакетов на Java.
Компилятор JDK 1.5 по умолчанию создает class-файлы, несовместимые с ранними версиями J2SE.
Поэтому необходимо следить, чтобы в сборочных скриптах для ant или make компилятор вызывался
с параметрами source и target в значении 1.3 или меньше (так как у нас в Sisyphus есть еще j2se1.3-sun),
если код не требует иного. Если в коде используется ключевое слово assert, нужно ставить как
минимум 1.4; пакетов, использующих нововведения Java SE 5, в Sisyphus пока не отмечено.


viy: это актуально всегда, только сейчас у нас наименьшая JVM — это java-1.5.0 sun.
=== Установочные зависимости ===
соответственно, фраза выглядит теперь так: source и target в значении 1.5 или меньше.
Программы '''не должны''' иметь явные зависимости Requires: java-X.Y.Z-vendor — это '''ЗЛО'''.
если пакет использует нововведения Java SE 6, то source и target в значении 1.6.
(Не злоупотреблять. только если код написан под Java 6)
пакетов, использующих нововведения Java SE 7 и выше, в Sisyphus пока не отмечено.


==== Необходимо избегать зависимостей на конкретную JVM ====
===== Установочные зависимости. =====
viy: явные зависимости Requires: java-X.Y.Z-vendor это ЗЛО.
В пакете единственно допустимы зависимости вида
В пакете единственно допустимы зависимости вида
  Requires: java
  Requires: java
Requires: java-devel (if really required).
Замечание. для указания минимальной версии JVM, под которой может работать программа,
Замечание. для указания минимальной версии JVM, под которой может работать программа,
следует использовать конструкцию
следует использовать конструкцию
  Requires: java  >= 1.x.y
  Requires: java  >= 1.x.y
например, Requires: java >= 1.6.0
например,
Requires: java >= 1.6.0
Если программа работает под текущую минимальную поддерживаемую JVM
Если программа работает под текущую минимальную поддерживаемую JVM
(сейчас у нас наименьшая JVM — это java-1.5.0).
(сейчас у нас наименьшая JVM — это java-1.5.0),
то рекомендуется писать просто Requires: java без версии.
то '''рекомендуется''' писать просто Requires: java без версии.
 
В старых пакетах вместо Requires: java может встретиться Requires: j2se.
В старых пакетах вместо Requires: java может встретиться Requires: j2se.
Эти provides устарели, поэтому все такие вхождения следует заменить на
Эти provides устарели, поэтому все такие вхождения следует заменить на
Requires: java.
Requires: java.
===== Сборочные зависимости =====
 
viy: явные зависимости BuildRequires: java-X.Y.Z-vendor-devel это ЗЛО.
Для чистых библиотек, не являющихся одновременно приложениями, рекомендуется
Рекомендуется всегда собирать программы компилятором наименьшей подходящей версии.
вообще избегать каких-либо зависимостей на java. (Они им и не нужны).
 
=== Сборочные зависимости ===
Программы '''не должны''' иметь явные зависимости BuildRequires: java-X.Y.Z-vendor-devel это ЗЛО.
 
Рекомендуется всегда собирать программы компилятором наименьшей подходящей версии
(см. выше, /Необходимо обеспечивать максимальную запускаемость на разных JVM/).
Однако если программа будет иметь явную зависимость на такой компилятор,
Однако если программа будет иметь явную зависимость на такой компилятор,
то когда компилятор уйдет в obsolete, программа перестанет собираться.
то когда компилятор уйдет в obsolete, программа перестанет собираться.
Строка 57: Строка 78:
должна быть виртуальной.
должна быть виртуальной.


Официально рекомендуемая зависимость - это
Официально рекомендуемая зависимость это
  BuildRequires: java-devel-default
  BuildRequires: java-devel-default
В настоящее время это вызовет установку java-devel = 1.5.0.
В настоящее время это вызовет установку java-devel = 1.5.0.
Строка 66: Строка 87:
  BuildRequires: java-devel >= 1.6.0
  BuildRequires: java-devel >= 1.6.0


==== Пакеты из репозиториев jpackage.org ====
== Пакеты из репозиториев jpackage.org желательно сопровождать роботом ==


'''Не желательно''' собирать в Сизиф java-пакеты из репозиториев jpackage.org а также fedora.org вручную.
'''Не желательно''' собирать в Сизиф java-пакеты из репозиториев jpackage.org а также fedora.org вручную.
Для этого есть робот сопровождения. Его можно взять в git, viy/packages/jppimport.git.
Для этого есть робот сопровождения. Его можно взять в git, viy/packages/jppimport.git.


==== Устаревшие макросы. ====
Если пакет из репозиториев jpackage.org сопровождается вручную, он обязан быть совместимым с
пакетом из jpackage по альтернативам, Provides и названиям упакованных jar.
 
== Использование сторонних бинарных сборок крайне не рекомендуется ==
Крайне не рекомендуется использование бинарных кодов, взятых откуда либо кроме Сизифа.
* Пакеты должны собираться из исходных текстов, если это позволяет лицензия.
Если пакет не собран из исходных текстов, а инсталлирует готовый jar, несмотря на присутствие исходных текстов,
то лучше его в Сизиф не класть (но можно положить в Дедал в ожидании доработки).
* Пакеты не должны использовать при сборке чужие библиотеки.
Очень часто вместе с исходными текстами идут готовые собранные сторонние библиотеки.
Пакеты не должны использовать при сборке эти готовые сторонние собранные библиотеки,
а должны использовать вместо них библиотеки, собранные в Сизифе.
Если какой-то готовой сторонней собранной библиотеки в Сизифе нет, ее необходимо сначала туда собрать.
 
== Другие ограничения ==
 
=== В MANIFEST.MF не должно быть атрибута Class-Path ===
см. [[Java/ClassPathInManifest]]


Макросы %ant_build %set_classpath %add_classpath объявлены устаревшими.
=== Устаревшие макросы ===
 
Макросы <tt>%ant_build</tt>, <tt>%set_classpath</tt>, <tt>%add_classpath</tt> объявлены устаревшими.
В пакетах конструкции вида
В пакетах конструкции вида
%set_classpath /usr/share/java/foo.jar
%set_classpath /usr/share/java/foo.jar
%add_classpath /usr/share/java/bar.jar
%add_classpath /usr/share/java/bar.jar
можно заменить на
нужно заменить на
export CLASSPATH=$(build-classpath foo bar)
export CLASSPATH=$(build-classpath foo bar)
а %ant_build на %ant.
а <tt>%ant_build</tt> — на %ant</tt>.
 
== Дополнительные требования к сборке библиотек ==
 
=== требуется упаковывать pom файлы ===
 
Если для библиотеки существует pom файл, в самом ли проекте, либо в центральном maven2 репозитории
[http://repo1.maven.org/maven2], то его требуется упаковать, а также добавить фрагмент depmap с
помощью %add_to_maven_depmap.
 
== Ссылки ==
 
=== ALT Linux Java Packaging HOWTO ===
{{Main|Java/HOWTO}}
=== ALT Linux Java Packaging FAQ ===
{{Main|Java/JavaPackagingFAQ}}
=== Шаблоны spec-файлов ===
[[Java/JPackageSpecTemplate|JPackage Spec Template]] — шаблон spec-файла для java-приложений из JPackage, адаптированный для сизифа.
 
[[SampleSpecs/javalib| javalib Spec Template]] — шаблон spec-файла для java-библиотеки, собираемой с помощью ant.


=== Java Packaging FAQ ===
=== Другие ресурсы ===
[[Java/JavaPackagingFAQ|Обсуждение вопросов упаковки java пакетов]] в Сизифе
(([[Java/JavaPackagingFAQ|JavaPackagingFAQ]])) вынесено в отдельную страницу.


=== Ссылки ===
[http://fedoraproject.org/wiki/Java Java on FedoraWiki]


==== Обсуждение определителя зависимостей и загрузчика классов ====
{{Category navigation|title=Java|category=Java|sortkey=*}}
[http://lists.altlinux.org/pipermail/devel/2008-January/subject.html [devel]] Java: no magic wand / [devel] Java: no magic wand, no magic hammer
начиная с [http://lists.altlinux.org/pipermail/devel/2008-January/068361.html http://lists.altlinux.org/pipermail/devel/2008-January/068361.html].

Текущая версия от 13:22, 18 декабря 2021

Stamp90cw.png
Действующая политика Sisyphus

Политика действует, начиная со стабильного бранча 5.0 и выше.

Ответственный за проведение политики в жизнь — Игорь Власенко.


ALT Linux Java Policy: Требования к сборке java-приложений

Сфера применения

Данное полиси описывает требования к сборке и упаковке java-приложений и java-библиотек в Сизифе, и является расширением и толкованием JPackage Policy применительно к ALT Linux.

Необходимо соблюдать JPackage Policy

Основное условие упаковки java-библиотек и приложений: При упаковке приложений для сизифа необходимо соблюдать JPackage Policy.

Оригинал JPackagePolicy можно найти в пакете jpackage-utils (в Сизифе или на www.jpackage.org). Есть перевод JPackagePolicy на русский.

Необходимо обеспечивать максимальную запускаемость на разных JVM

В настоящее время в Сизифе поддерживаются JVM

java6 (java-1.6.0-sun, java-1.6.0-openjdk),

Также присутствуют частично поддерживаемые JVM

java5 (java-1.5.0-sun, java-1.5.0-gcj43).

и неподдерживаемые JVM

java4 (java-1.4.2-sun, java-1.4.2-blackdown, java-1.4.2-gcj41).

Компиляторы старших версий java по умолчанию создают class-файлы, несовместимые с младшими версиями java. Например, class-файл, собранный под java6 по умолчанию, не будет работать под java5 и ниже. Более того, если код приложения собран под java5, но хотя бы одна из используемых им библиотек собрана под java6, то и все приложение не сможет работать под java5 и ниже (class version poisoning).

Пользовательские приложения должны запускаться и работать под всеми поддерживаемыми JVM (java5, java6). Поэтому необходимо следить, чтобы в сборочных скриптах для maven, ant или make компилятор вызывался с параметрами source и target в значении 1.5 или меньше, если код не требует иного, либо использовать

BuildRequires: java-devel-default

Эта зависимость заведомо поставит в сборочную среду компилятор, который генерирует код, работающий на всех поддерживаемых JVM.

Исключением являются приложения, явно использующие особенности диалекта java6 и требующие для сборки java6 и выше. Однако и для них рекомендуется явно указывать source и target в значении 1.6, поскольку со временем в сизифе появится java7.

Для библиотек дополнительно рекомендуется source и target в значении 1.4 или меньше, поскольку java4 JVM еще присутствуют в сизифе, если их код это поддерживает.

Необходимо избегать зависимостей на конкретную JVM

Установочные зависимости

Программы не должны иметь явные зависимости Requires: java-X.Y.Z-vendor — это ЗЛО.

В пакете единственно допустимы зависимости вида

Requires: java

Замечание. для указания минимальной версии JVM, под которой может работать программа, следует использовать конструкцию

Requires: java  >= 1.x.y

например,

Requires: java >= 1.6.0

Если программа работает под текущую минимальную поддерживаемую JVM (сейчас у нас наименьшая JVM — это java-1.5.0), то рекомендуется писать просто Requires: java без версии.

В старых пакетах вместо Requires: java может встретиться Requires: j2se. Эти provides устарели, поэтому все такие вхождения следует заменить на Requires: java.

Для чистых библиотек, не являющихся одновременно приложениями, рекомендуется вообще избегать каких-либо зависимостей на java. (Они им и не нужны).

Сборочные зависимости

Программы не должны иметь явные зависимости BuildRequires: java-X.Y.Z-vendor-devel — это ЗЛО.

Рекомендуется всегда собирать программы компилятором наименьшей подходящей версии (см. выше, /Необходимо обеспечивать максимальную запускаемость на разных JVM/). Однако если программа будет иметь явную зависимость на такой компилятор, то когда компилятор уйдет в obsolete, программа перестанет собираться. Поэтому зависимость на компилятор java (в пакетах java*-devel) должна быть виртуальной.

Официально рекомендуемая зависимость — это

BuildRequires: java-devel-default

В настоящее время это вызовет установку java-devel = 1.5.0.

В крайне редких случаях исходные тексты программы могут иметь особенности диалекта java6. Только в этом случае допускается указывать версионированную зависимость на компилятор версии не ниже 6:

BuildRequires: java-devel >= 1.6.0

Пакеты из репозиториев jpackage.org желательно сопровождать роботом

Не желательно собирать в Сизиф java-пакеты из репозиториев jpackage.org а также fedora.org вручную. Для этого есть робот сопровождения. Его можно взять в git, viy/packages/jppimport.git.

Если пакет из репозиториев jpackage.org сопровождается вручную, он обязан быть совместимым с пакетом из jpackage по альтернативам, Provides и названиям упакованных jar.

Использование сторонних бинарных сборок крайне не рекомендуется

Крайне не рекомендуется использование бинарных кодов, взятых откуда либо кроме Сизифа.

  • Пакеты должны собираться из исходных текстов, если это позволяет лицензия.

Если пакет не собран из исходных текстов, а инсталлирует готовый jar, несмотря на присутствие исходных текстов, то лучше его в Сизиф не класть (но можно положить в Дедал в ожидании доработки).

  • Пакеты не должны использовать при сборке чужие библиотеки.

Очень часто вместе с исходными текстами идут готовые собранные сторонние библиотеки. Пакеты не должны использовать при сборке эти готовые сторонние собранные библиотеки, а должны использовать вместо них библиотеки, собранные в Сизифе. Если какой-то готовой сторонней собранной библиотеки в Сизифе нет, ее необходимо сначала туда собрать.

Другие ограничения

В MANIFEST.MF не должно быть атрибута Class-Path

см. Java/ClassPathInManifest

Устаревшие макросы

Макросы %ant_build, %set_classpath, %add_classpath объявлены устаревшими. В пакетах конструкции вида

%set_classpath /usr/share/java/foo.jar
%add_classpath /usr/share/java/bar.jar

нужно заменить на

export CLASSPATH=$(build-classpath foo bar)

а %ant_build — на %ant.

Дополнительные требования к сборке библиотек

требуется упаковывать pom файлы

Если для библиотеки существует pom файл, в самом ли проекте, либо в центральном maven2 репозитории [1], то его требуется упаковать, а также добавить фрагмент depmap с помощью %add_to_maven_depmap.

Ссылки

ALT Linux Java Packaging HOWTO

Основная статья: Java/HOWTO

ALT Linux Java Packaging FAQ

Основная статья: Java/JavaPackagingFAQ

Шаблоны spec-файлов

JPackage Spec Template — шаблон spec-файла для java-приложений из JPackage, адаптированный для сизифа.

javalib Spec Template — шаблон spec-файла для java-библиотеки, собираемой с помощью ant.

Другие ресурсы

Java on FedoraWiki