Java Policy
Материал из ALT Linux Wiki
(→Установочные зависимости.) |
(→Необходимо обеспечивать максимальную запускаемость на разных JVM) |
||
(21 промежуточная версия не показана) | |||
Строка 1: | Строка 1: | ||
- | {{ | + | {{Policy |
- | + | |responsible=Игорь Власенко | |
- | |responsible= | + | |since_branch=5.0}} |
+ | '''ALT Linux Java Policy: Требования к сборке java-приложений''' | ||
- | == | + | == Сфера применения == |
- | + | ||
- | + | Данное полиси описывает требования к сборке и упаковке java-приложений и java-библиотек в Сизифе, | |
+ | и является расширением и толкованием JPackage Policy применительно к ALT Linux. | ||
+ | == Необходимо соблюдать JPackage Policy == | ||
+ | |||
+ | Основное условие упаковки java-библиотек и приложений: | ||
При упаковке приложений для сизифа '''необходимо''' соблюдать JPackage Policy. | При упаковке приложений для сизифа '''необходимо''' соблюдать JPackage Policy. | ||
Строка 14: | Строка 18: | ||
Есть [[Java/JPackagePolicyTranslation|перевод JPackagePolicy на русский.]] | Есть [[Java/JPackagePolicyTranslation|перевод JPackagePolicy на русский.]] | ||
- | + | == Необходимо обеспечивать максимальную запускаемость на разных 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), |
- | + | ||
- | Также присутствуют неподдерживаемые JVM | + | Также присутствуют частично поддерживаемые JVM |
- | :java4 (java-1.4.2-sun, java-1.4.2-blackdown, java-1. | + | : 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. | ||
- | + | Исключением являются приложения, явно использующие особенности диалекта java6 и требующие для сборки java6 и выше. Однако и | |
- | + | ||
- | + | ||
- | Исключением являются приложения, явно использующие особенности диалекта java6 и требующие для сборки java6 и выше. Однако и | + | |
для них рекомендуется явно указывать source и target в значении 1.6, поскольку со временем в сизифе появится java7. | для них рекомендуется явно указывать source и target в значении 1.6, поскольку со временем в сизифе появится java7. | ||
- | + | Для библиотек дополнительно рекомендуется source и target в значении 1.4 или меньше, поскольку java4 JVM еще присутствуют | |
- | + | в сизифе, если их код это поддерживает. | |
- | Программы '''не должны''' иметь явные зависимости Requires: java-X.Y.Z-vendor | + | |
+ | == Необходимо избегать зависимостей на конкретную JVM == | ||
+ | |||
+ | === Установочные зависимости === | ||
+ | Программы '''не должны''' иметь явные зависимости Requires: java-X.Y.Z-vendor — это '''ЗЛО'''. | ||
В пакете единственно допустимы зависимости вида | В пакете единственно допустимы зависимости вида | ||
Строка 49: | Строка 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. | ||
- | + | Для чистых библиотек, не являющихся одновременно приложениями, рекомендуется | |
- | Программы '''не должны''' иметь явные зависимости BuildRequires: java-X.Y.Z-vendor-devel | + | вообще избегать каких-либо зависимостей на java. (Они им и не нужны). |
+ | |||
+ | === Сборочные зависимости === | ||
+ | Программы '''не должны''' иметь явные зависимости BuildRequires: java-X.Y.Z-vendor-devel — это ЗЛО. | ||
- | Рекомендуется всегда собирать программы компилятором наименьшей подходящей версии. | + | Рекомендуется всегда собирать программы компилятором наименьшей подходящей версии |
+ | (см. выше, /Необходимо обеспечивать максимальную запускаемость на разных JVM/). | ||
Однако если программа будет иметь явную зависимость на такой компилятор, | Однако если программа будет иметь явную зависимость на такой компилятор, | ||
то когда компилятор уйдет в obsolete, программа перестанет собираться. | то когда компилятор уйдет в obsolete, программа перестанет собираться. | ||
Строка 66: | Строка 78: | ||
должна быть виртуальной. | должна быть виртуальной. | ||
- | Официально рекомендуемая зависимость | + | Официально рекомендуемая зависимость — это |
BuildRequires: java-devel-default | BuildRequires: java-devel-default | ||
В настоящее время это вызовет установку java-devel = 1.5.0. | В настоящее время это вызовет установку java-devel = 1.5.0. | ||
Строка 75: | Строка 87: | ||
BuildRequires: java-devel >= 1.6.0 | BuildRequires: java-devel >= 1.6.0 | ||
- | + | == Пакеты из репозиториев 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, несмотря на присутствие исходных текстов, |
+ | то лучше его в Сизиф не класть (но можно положить в Дедал в ожидании доработки). | ||
* Пакеты не должны использовать при сборке чужие библиотеки. | * Пакеты не должны использовать при сборке чужие библиотеки. | ||
Очень часто вместе с исходными текстами идут готовые собранные сторонние библиотеки. | Очень часто вместе с исходными текстами идут готовые собранные сторонние библиотеки. | ||
Строка 90: | Строка 106: | ||
Если какой-то готовой сторонней собранной библиотеки в Сизифе нет, ее необходимо сначала туда собрать. | Если какой-то готовой сторонней собранной библиотеки в Сизифе нет, ее необходимо сначала туда собрать. | ||
- | + | == Другие ограничения == | |
- | + | === В 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 файлы === |
- | + | ||
- | + | ||
- | ==== Шаблоны spec-файлов | + | Если для библиотеки существует 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, адаптированный для сизифа. | [[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:// | + | |
- | + | [http://fedoraproject.org/wiki/Java Java on FedoraWiki] | |
+ | |||
+ | {{Category navigation|title=Java|category=Java|sortkey=*}} |
Текущая версия на 16:10, 28 сентября 2010
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
Устаревшие макросы
Макросы %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
ALT Linux Java Packaging FAQ
Шаблоны spec-файлов
JPackage Spec Template — шаблон spec-файла для java-приложений из JPackage, адаптированный для сизифа.
javalib Spec Template — шаблон spec-файла для java-библиотеки, собираемой с помощью ant.