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

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

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

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

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

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

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

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

Переменная Значение
JAVA_PORT Название порта JDK (к примеру, 'java/openjdk6').
JAVA_PORT_VERSION Полное наименовании версии порта JDK (к примеру, '1.6.0'). Если вам нужны только первые две цифры номера версии, используйте конструкцию ${JAVA_PORT_VERSION:C/^([0-9])\.([0-9])(.*)$/\1.\2/}.
JAVA_PORT_OS Операционная система, используемая портом JDK (к примеру, 'native').
JAVA_PORT_VENDOR Разработчик порта JDK (к примеру, 'openjdk').
JAVA_PORT_OS_DESCRIPTION Описание операционной системы, используемой портом JDK (к примеру, 'Native').
JAVA_PORT_VENDOR_DESCRIPTION Описание разработчика порта JDK (к примеру, 'OpenJDK BSD Porting Team').
JAVA_HOME Маршрут к установочному каталогу JDK (к примеру, '/usr/local/openjdk6').
JAVAC Маршрут к используемому компилятору Java (к примеру, '/usr/local/openjdk6/bin/javac'.
JAR Маршрут к используемой утилите jar (к примеру, '/usr/local/openjdk6/bin/jar' или '/usr/local/bin/fastjar').
APPLETVIEWER Маршрут к утилите appletviewer (к примеру, '/usr/local/openjdk6/bin/appletviewer').
JAVA Маршрут к выполняемому файлу java. Используйте его для запуска Java-программ (к примеру, '/usr/local/openjdk6/bin/java').
JAVADOC Маршрут к вспомогательной программе javadoc.
JAVAH Маршрут к программе javah.
JAVAP Маршрут к программе javap.
JAVA_KEYTOOL Маршрут к вспомогательной программе keytool.
JAVA_N2A Маршрут к утилите native2ascii.
JAVA_POLICYTOOL Маршрут к программе policytool.
JAVA_SERIALVER Маршрут к вспомогательной программе serialver.
RMIC Маршрут к генератору каркаса программ RMI, утилите rmic.
RMIREGISTRY Маршрут к программе регистрации RMI, rmiregistry.
RMID Маршрут к программе-даемону RMI rmid.
JAVA_CLASSES Маршрут к архиву, который содержит файлы классов JDK, ${JAVA_HOME}/jre/lib/rt.jar.

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

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

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

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

Соответствующие записи определяются в обоих переменных PLIST_SUB (описана в Разд. 7.1) и SUB_LIST.

6.11.2. Построение с Ant

Если построение порта производится с использованием Apache Ant, то необходимо определить USE_ANT. Таким образом Ant становится подкомандой make. Если в порте не определена цель do-build, то будет установлена цель по умолчанию, которая просто запускает Ant в соответствии со значением MAKE_ENV, MAKE_ARGS и ALL_TARGET. Это похоже на механизм USE_GMAKE, который описан в Разд. 6.3.

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

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

PLIST_FILES+= %%JAVAJARDIR%%/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 (это описано в Разд. 7.1), так что вы сможете использовать %%DATADIR%% непосредственно в pkg-plist.

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

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

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

Похожим образом определена политика по отношению к CATEGORIES порта Java, которая подробно описана в Разд. 5.3.

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