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

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


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


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


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


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


Строка 14: Строка 18:
Есть [[Java/JPackagePolicyTranslation|перевод JPackagePolicy на русский.]]
Есть [[Java/JPackagePolicyTranslation|перевод JPackagePolicy на русский.]]


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


В настоящее время в Сизифе поддерживаются JVM
В настоящее время в Сизифе поддерживаются JVM
:java6 (java-1.6.0-sun, java-1.6.0-openjdk),
: java6 (java-1.6.0-sun, java-1.6.0-openjdk),
:java5 (java-1.5.0-sun, java-1.5.0-gcj43).


Также присутствуют неподдерживаемые jvm
Также присутствуют частично поддерживаемые JVM
:java4 (java-1.4.2-sun, java-1.4.2-blackdown, java-1.5.0-gcj41).
: 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.
Компиляторы старших версий java по умолчанию создают class-файлы, несовместимые с младшими версиями java.
Например, class-файл, собранный под java6 по умолчанию, не будет работать под java5 и ниже.
Например, class-файл, собранный под java6 по умолчанию, не будет работать под java5 и ниже.
Более того, если код приложения собран под java5, но хотя бы одна из используемых им библиотек собрана под  
Более того, если код приложения собран под java5, но хотя бы одна из используемых им библиотек собрана под
java6, то и все приложение не сможет работать под java5 и ниже.
java6, то и все приложение не сможет работать под java5 и ниже (class version poisoning).


Пользовательские приложения '''должны запускаться и работать под всеми поддерживаемыми JVM''' (java5, java6).
Пользовательские приложения '''должны запускаться и работать под всеми поддерживаемыми JVM''' (java5, java6).
Строка 34: Строка 39:
Эта зависимость заведомо поставит в сборочную среду компилятор, который генерирует код, работающий на всех поддерживаемых JVM.
Эта зависимость заведомо поставит в сборочную среду компилятор, который генерирует код, работающий на всех поддерживаемых JVM.


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


Исключением являются приложения, явно использующие особенности диалекта java6 и требующие для сборки java6 и выше. Однако и
== Необходимо избегать зависимостей на конкретную JVM ==
для них рекомендуется явно указывать source и target в значении 1.6, поскольку со временем в сизифе появится java7.
 
=== Установочные зависимости ===
Программы '''не должны''' иметь явные зависимости Requires: java-X.Y.Z-vendor — это '''ЗЛО'''.


=== Необходимо избегать зависимостей на конкретную JVM ===
==== Установочные зависимости. ====
viy: явные зависимости Requires: java-X.Y.Z-vendor это ЗЛО.
В пакете единственно допустимы зависимости вида
В пакете единственно допустимы зависимости вида
  Requires: java
  Requires: java
Строка 48: Строка 55:
следует использовать конструкцию
следует использовать конструкцию
  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, программа перестанет собираться.
Строка 64: Строка 78:
должна быть виртуальной.
должна быть виртуальной.


Официально рекомендуемая зависимость - это
Официально рекомендуемая зависимость это
  BuildRequires: java-devel-default
  BuildRequires: java-devel-default
В настоящее время это вызовет установку java-devel = 1.5.0.
В настоящее время это вызовет установку java-devel = 1.5.0.
Строка 73: Строка 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, несмотря на присутствие исходных текстов,
то лучше его в Сизиф не класть (но можно положить в Дедал в ожидании доработки).
* Пакеты не должны использовать при сборке чужие библиотеки.
* Пакеты не должны использовать при сборке чужие библиотеки.
Очень часто вместе с исходными текстами идут готовые собранные сторонние библиотеки.
Очень часто вместе с исходными текстами идут готовые собранные сторонние библиотеки.
Строка 88: Строка 106:
Если какой-то готовой сторонней собранной библиотеки в Сизифе нет, ее необходимо сначала туда собрать.
Если какой-то готовой сторонней собранной библиотеки в Сизифе нет, ее необходимо сначала туда собрать.


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


==== В MANIFEST.MF не должно быть атрибута Class-Path. ====
=== В MANIFEST.MF не должно быть атрибута Class-Path ===
см. [[Java/ClassPathInManifest]]
см. [[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 репозитории
==== ALT Linux Java Packaging HOWTO ====
[http://repo1.maven.org/maven2], то его требуется упаковать, а также добавить фрагмент depmap с
[[Java/JavaPackagingHOWTO|Руководство по упаковке java пакетов]] в Сизифе.
помощью %add_to_maven_depmap.
Вынесено в отдельную страницу.


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


==== Шаблоны spec-файлов ====
=== 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, адаптированный для сизифа.
[[Java/JPackageSpecTemplate|JPackage Spec Template]] — шаблон spec-файла для java-приложений из JPackage, адаптированный для сизифа.


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


==== Обсуждение определителя зависимостей и загрузчика классов ====
=== Другие ресурсы ===
[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].
[http://fedoraproject.org/wiki/Java Java on FedoraWiki]
 
{{Category navigation|title=Java|category=Java|sortkey=*}}

Текущая версия от 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