Руководство FreeBSD по созданию портов
Пред. | Глава 6. Особые соглашения | След.

# 6.9. Использование Java

## 6.9.1. Задание переменных

Если вашему порту необходимо наличие Java™ Development Kit (JDK) для построения, работы или даже распаковки дистрибутивного файла, то в нём должна быть задана переменная `USE_JAVA`.

В Коллекции Портов присутствуют несколько JDK различных разработчиков и разных версий. Если ваш порт должен использовать одну из этих версий, то вы должны указать, какую именно. Самой последней версией является `java/jdk14`.

Таблица 6-5. Переменные, которые которые могут задаваться портами, использующими Java

Переменная | Значение
--- | ---
`USE_JAVA` | Должна быть определена для того, что последующие переменные вступили в действие.
`JAVA_VERSION` | Список версий Java, перечисленных через пробел, подходящих для порта. Опциональный знак `"+"` позволяет вам указать диапазон версий (возможные значения: `1.1[+] 1.2[+] 1.3[+] 1.4[+]`).
`JAVA_OS` | Список операционных систем, перечисленных через пробел, порты JDK для которых подходят для порта (возможные значения: `native linux`).
`JAVA_VENDOR` | Список разработчиков портов JDK, перечисленных через пробел, которые подходят для порта (возможные значения: `freebsd bsdjava sun ibm blackdown`).
`JAVA_BUILD` | Если задана, то означает, что выбранный порт JDK должен быть добавлен к зависимостям порта для его построения.
`JAVA_RUN` | Если задана, то означает, что выбранный порт JDK должен быть добавлен в зависимостям порта для его работы.
`JAVA_EXTRACT` | Если задана, то означает, что выбранный порт JDK должен быть добавлен в зависимостям порта для распаковки его дистрибутивных файлов.

`USE_JIKES`

Должен или нет порт использовать компилятор байт-кода `jikes` для своего построения. Если значение этой переменной не определено, то порт будет использовать `jikes` (при наличии последнего) для своего построения. Вы можете также явно запретить или принудить использовать `jikes` (указав в качестве значения `'no'` или `'yes'`). В последнем случае `devel/jikes` будет добавлен к зависимостям порта, нужным для его построения.

Ниже перечисляются все значения, которые принимают переменные после задания переменной `USE_JAVA`:

Таблица 6-6. Переменные, доступные в портах, использующих Java

Переменная | Значение
--- | ---
`JAVA_PORT` | Название порта JDK (к примеру, `'java/jdk14'`).
`JAVA_PORT_VERSION` | Полное наименовании версии порта JDK (к примеру, `'1.4.2'`). Если вам нужны только первые две цифры номера версии, используйте конструкцию `${JAVA_PORT_VERSION:C/^([0-9])\.([0-9])(.*)$/\1.\2/}`.
`JAVA_PORT_OS` | Операционная система, используемая портом JDK (к примеру, `'linux'`).
`JAVA_PORT_VENDOR` | Разработчик порта JDK (к примеру, `'sun'`).
`JAVA_PORT_OS_DESCRIPTION` | Описание операционной системы, используемой портом JDK (к примеру, `'Linux'`).
`JAVA_PORT_VENDOR_DESCRIPTION` | Описание разработчика порта JDK (к примеру, `'FreeBSD Foundation'`).
`JAVA_HOME` | Маршрут к установочному каталогу JDK (к примеру, `'/usr/local/jdk1.3.1'`).
`JAVAC` | Маршрут к используемому компилятору Java (к примеру, `'/usr/local/jdk1.1.8/bin/javac'` или `'/usr/local/bin/jikes'`).
`JAR` | Маршрут к используемой утилите `jar` (к примеру, `'/usr/local/jdk1.2.2/bin/jar'` или `'/usr/local/bin/fastjar'`).
`APPLETVIEWER` | Маршрут к утилите `appletviewer` (к примеру, `'/usr/local/linux-jdk1.2.2/bin/appletviewer'`).
`JAVA` | Маршрут к выполняемому файлу `java`. Используйте его для запуска Java-программ (к примеру, `'/usr/local/jdk1.3.1/bin/java'`).
`JAVADOC` | Маршрут к вспомогательной программе `javadoc`.
`JAVAH` | Маршрут к программе `javah`.
`JAVAP` | Маршрут к программе `javap`.
`JAVA_KEYTOOL` | Маршрут к вспомогательной программе `keytool`. Эта переменная определена, только если JDK соответствует Java 1.2 или более старшей версии.
`JAVA_N2A` | Маршрут к утилите `native2ascii`.
`JAVA_POLICYTOOL` | Маршрут к программе `policytool`. Эта переменная определена, только если JDK соответствует Java 1.2 или более старшей версии.
`JAVA_SERIALVER` | Маршрут к вспомогательной программе `serialver`.
`RMIC` | Маршрут к генератору каркаса программ RMI, утилите `rmic`.
`RMIREGISTRY` | Маршрут к программе регистрации RMI, `rmiregistry`.
`RMID` | Маршрут к программе-даемону RMI `rmid`. Эта переменная определена, только если JDK соответствует Java 1.2 или более старшей версии.
`JAVA_CLASSES` | Маршрут к архиву, который содержит файлы классов JDK. Для JDK 1.2 и более старших версий её значение соответствует `${JAVA_HOME}/jre/lib/rt.jar`. JDK предыдущих версий использовали `${JAVA_HOME}/lib/classes.zip`.

Вы можете воспользоваться make-целью `java-debug` для получения информации, необходимой для отладки вашего порта. При её выполнении будут выданы значения многих упомянутых выше переменных.

Кроме того, для единообразия установки всех портов Java определены следующие константы:

Таблица 6-7. Константы, определённые для портов, использующих Java

Константа | Значение
--- | ---
`JAVASHAREDIR` | Корневой каталог для всего, что связано с Java. По умолчанию: `${PREFIX}/share/java`.
`JAVAJARDIR` | Каталог, в который должны устанавливаться JAR-файлы. По умолчанию: `${JAVASHAREDIR}/classes`.

## 6.9.2. Практические рекомендации

При портировании Java-библиотеки ваш порт должен устанавливать JAR-файл(ы) в каталог `${JAVAJARDIR}`, а все остальные данные в каталог `${JAVASHAREDIR}/${PORTNAME}` (за исключением документации, о которой пойдёт речь ниже). Для уменьшения размера упакованного файла вы можете сослаться на JAR-файл(ы) непосредственно в файле `Makefile`. Просто воспользуйтесь следующей директивой (в которой `myport.jar` является именем JAR-файла, устанавливаемого как часть порта):

    PLIST_FILES+= ${JAVAJARDIR:S,^${PREFIX}/,,}/myport.jar

При портировании Java-приложения порт обычно устанавливает всё в один каталог (в том числе все свои JAR-зависимости). В этом отношении настоятельно рекомендуется использование `${JAVASHAREDIR}/${PORTNAME}`. На усмотрение создателя порта остаётся решение вопроса о том, устанавливать ли дополнительные JAR-зависимости в этот каталог или напрямую использовать уже установленные (из каталога `${JAVAJARDIR}`).

Вне зависимости от типа вашего порта (библиотека это или приложение), дополнительная документация должна быть устанавливаться в тоже самое место, что и для других портов. Известно, что в зависимости от используемой версии JDK утилита JavaDoc генерирует различные наборы файлов. Для портов, которые не привязаны к использованию определённой версии JDK, таким образом становится проблематичным определить список файлов для упаковки (`pkg-plist`). Это одна из причин, по которой создателям портов настоятельно рекомендуется использовать макрос `PORTDOCS`. Более того, даже если вы сможете угадать набор файлов, который будет сгенерирован утилитой `javadoc`, размер получающегося файла `pkg-plist` голосует за использование `PORTDOCS`.

Значением по умолчанию для переменной `DATADIR` является `${PREFIX}/share/${PORTNAME}`. Хорошей идеей является переопределение для Java-портов значения `DATADIR` как `${JAVASHAREDIR}/${PORTNAME}`. На самом деле `DATADIR` автоматически добавляется к `PLIST_SUB` (это описано здесь), так что вы сможете использовать `%%DATADIR%%` непосредственно в `pkg-plist`.

Что касается выбора между построением портов Java из исходных текстов или их прямой установкой из бинарных дистрибутивов, то на момент создания этого текста определённой политики на этот счёт не существует. Однако участники Проекта FreeBSD Java рекомендуют создателям портов строить их из исходных текстов, если эта задача является несложной.

Все возможности, которые были описаны в этом разделе, реализованы в файле `bsd.java.mk`. Если вы предположите, что вашему порту требуется менее тривиальная поддержка Java, пожалуйста, взгляните сначала на журнал изменений bsd.java.mk в CVS, так как для документирования последних изменений требуется какое-то время. Затем, если вы думаете, что не хватающая вам поддержка окажется полезной для многих других портов Java, обсудите ваш вопрос в Список рассылки, посвящённый поддержке Java во FreeBSD.

Хотя в базе сообщений об ошибках для соответствующих PR имеется категория `java`, она относится к работе над портированием JDK, которые проводит Проект FreeBSD Java. Таким образом, вы должны относить свой Java-порт, как и любой другой, к категории `ports`, если решаемый вами вопрос не относится ни к реализации JDK, ни к `bsd.java.mk`.

Пред. | Начало | След.
Использование Bison | Уровень выше | Использование Python

По вопросам связанным с системой портов для FreeBSD, пишите по адресу <ports@FreeBSD.org>.
По вопросам, связанным с этой документацией, пишите по адресу <doc@FreeBSD.org>.