Java Policy

Материал из ALT Linux Wiki

(Различия между версиями)
Перейти к: навигация, поиск
(Установочные зависимости.)
(Необходимо обеспечивать максимальную запускаемость на разных JVM)
 
(32 промежуточные версии не показаны)
Строка 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 на русский.]]
-
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.
+
В настоящее время в Сизифе поддерживаются JVM
-
соответственно, фраза выглядит теперь так: source и target в значении 1.5 или меньше.
+
: java6 (java-1.6.0-sun, java-1.6.0-openjdk),
-
если пакет использует нововведения Java SE 6, то source и target в значении 1.6.
+
 
-
(Не злоупотреблять. только если код написан под Java 6)
+
Также присутствуют частично поддерживаемые JVM
-
пакетов, использующих нововведения Java SE 7 и выше, в Sisyphus пока не отмечено.
+
: 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 — это '''ЗЛО'''.
-
==== Необходимо избегать зависимостей на конкретную JVM ====
 
-
===== Установочные зависимости. =====
 
-
viy: явные зависимости Requires: java-X.Y.Z-vendor это ЗЛО.
 
В пакете единственно допустимы зависимости вида
В пакете единственно допустимы зависимости вида
  Requires: java
  Requires: java
Строка 41: Строка 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, программа перестанет собираться.
Строка 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.
-
Макросы %ant_build %set_classpath %add_classpath объявлены устаревшими.
+
== Использование сторонних бинарных сборок крайне не рекомендуется ==
 +
Крайне не рекомендуется использование бинарных кодов, взятых откуда либо кроме Сизифа.
 +
* Пакеты должны собираться из исходных текстов, если это позволяет лицензия.
 +
Если пакет не собран из исходных текстов, а инсталлирует готовый jar, несмотря на присутствие исходных текстов,
 +
то лучше его в Сизиф не класть (но можно положить в Дедал в ожидании доработки).
 +
* Пакеты не должны использовать при сборке чужие библиотеки.
 +
Очень часто вместе с исходными текстами идут готовые собранные сторонние библиотеки.
 +
Пакеты не должны использовать при сборке эти готовые сторонние собранные библиотеки,
 +
а должны использовать вместо них библиотеки, собранные в Сизифе.
 +
Если какой-то готовой сторонней собранной библиотеки в Сизифе нет, ее необходимо сначала туда собрать.
 +
 
 +
== Другие ограничения ==
 +
 
 +
=== В MANIFEST.MF не должно быть атрибута Class-Path ===
 +
см. [[Java/ClassPathInManifest]]
 +
 
 +
=== Устаревшие макросы ===
 +
 
 +
Макросы <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].
+

Текущая версия на 16:10, 28 сентября 2010

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</tt>.

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

требуется упаковывать 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

 
Личные инструменты