6.15. Usando Java

6.15.1. Definições de Variáveis

Se o port precisar de um Java™ Development Kit (JDK) para compilar, executar ou até mesmo extrair o distfile, então defina USE_JAVA.

Existem vários JDKs na coleção de ports, de vários fornecedores e em várias versões. Se o port precisar usar uma versão específica, especifique-a usando a variável JAVA_VERSION. A versão mais atual é java/openjdk8, java/openjdk6 e java/openjdk7 também estão disponíveis.

Tabela 6.20. Variáveis ​​Que Podem ser Definidas por Ports Que Usam Java
VariávelSignifica
USE_JAVADefina para as variáveis ​​restantes para ter algum efeito.
JAVA_VERSIONLista das versões Java adequadas separadas por espaço para o port. Um opcional "+" permite especificar um intervalo de versões (valores permitidos: 1.5[+] 1.6[+] 1.7[+]).
JAVA_OSLista de sistemas operacionais adequados do port JDK separados por espaço para o port (valores permitidos: native linux).
JAVA_VENDORLista de fornecedores adequados de ports JDK separados por espaços para o port (valores permitidos: freebsd bsdjava sun openjdk).
JAVA_BUILDQuando definido, adiciona o port JDK selecionado às dependências de compilação.
JAVA_RUNQuando definido, adicione o port JDK selecionado às dependências de execução.
JAVA_EXTRACTQuando definido, adicione o port JDK selecionado às dependências de extração.

Abaixo está a lista de todas as configurações que um port receberá após a configuração de USE_JAVA:

Tabela 6.21. Variáveis ​​Fornecidas para Ports que Usam Java
VariávelValor
JAVA_PORTO nome do port do JDK (por exemplo,java/openjdk6).
JAVA_PORT_VERSIONA versão completa do port do JDK (por exemplo,1.6.0). Somente os dois primeiros dígitos deste número de versão são necessários, use ${JAVA_PORT_VERSION:C/^([0-9])\.([0-9])(.*)$/\1.\2/}.
JAVA_PORT_OSO sistema operacional usado pelo port do JDK (por exemplo, 'native').
JAVA_PORT_VENDORO fornecedor do port JDK (por exemplo,'openjdk').
JAVA_PORT_OS_DESCRIPTIONDescrição do sistema operacional usado pelo port JDK (por exemplo, 'Native').
JAVA_PORT_VENDOR_DESCRIPTIONDescrição do fornecedor do port JDK (por exemplo,'OpenJDK BSD Porting Team').
JAVA_HOMECaminho para o diretório de instalação do JDK (por exemplo, '/usr/local/openjdk6').
JAVACCaminho para o compilador Java (por exemplo, '/usr/local/openjdk6/bin/javac').
JARCaminho para ferramenta jar a ser usada (por exemplo, '/usr/local/openjdk6/bin/jar' ou '/usr/local/bin/fastjar').
APPLETVIEWERCaminho para o utilitário appletviewer (por exemplo,'/usr/local/openjdk6/bin/appletviewer').
JAVACaminho para o executável Java. Use isto para executar programas Java (por exemplo, '/usr/local/openjdk6/bin/java').
JAVADOCCaminho para o utilitário javadoc.
JAVAHCaminho para o programa javah.
JAVAPCaminho para o programa javap.
JAVA_KEYTOOLCaminho para o utilitário keytool.
JAVA_N2ACaminho para a ferramenta native2ascii.
JAVA_POLICYTOOLCaminho para o programa policytool.
JAVA_SERIALVERCaminho para o utilitário serialver.
RMICCaminho para o gerador de stub/skeleton RMI, rmic.
RMIREGISTRYCaminho para o programa de registro RMI, rmiregistry.
RMIDCaminho para o daemon do RMI rmid.
JAVA_CLASSESCaminho para o arquivo que contém os arquivos de classe do JDK, ${JAVA_HOME}/jre/lib/rt.jar.

Use o java-debug make target para obter informações para depurar o port. Ele exibirá o valor de muitas das variáveis ​​listadas anteriormente.

Além disso, essas constantes são definidas para que todos os ports Java possam ser instalados de maneira consistente:

Tabela 6.22. Constantes definidas para os ports que usam Java
ConstanteValor
JAVASHAREDIRO diretório base para tudo relacionado ao Java. Padrão: ${PREFIX}/share/java.
JAVAJARDIRO diretório onde os arquivos JAR são instalados. Padrão: ${JAVASHAREDIR}/classes.
JAVALIBDIRO diretório onde os arquivos JAR instalados por outros ports estão localizados. Padrão: ${LOCALBASE}/share/java/classes.

As entradas relacionadas são definidas em ambos PLIST_SUB (documentado em Seção 8.1, “Alterando o pkg-plist Baseado em Variáveis Make”) e SUB_LIST.

6.15.2. Compilando com Ant

Quando o port deve ser compilado usando o Apache Ant, ele deve definir USE_ANT. Ant é, portanto, considerado o comando sub-make. Quando nenhum target do-build é definido pelo port, será definido um padrão que execute Ant de acordo com MAKE_ENV, MAKE_ARGS e ALL_TARGET. Isso é semelhante ao mecanismo USES=gmake, documentado em Seção 6.5, “Mecanismos de Compilação”.

6.15.3. Melhores Práticas

Ao portar uma biblioteca Java, o port precisa instalar o(s) arquivo(s) JAR em ${JAVAJARDIR} e o resto em ${JAVASHAREDIR}/${PORTNAME} (exceto para a documentação, veja abaixo). Para reduzir o tamanho do arquivo de empacotamento, faça referência aos arquivos JAR diretamente no Makefile. Use esta declaração (onde myport.jar é o nome do arquivo JAR instalado como parte do port):

PLIST_FILES+=	${JAVAJARDIR}/myport.jar

Ao portar um aplicativo Java, o port geralmente instala tudo em um único diretório (incluindo suas dependências JAR). O uso de ${JAVASHAREDIR}/${PORTNAME} é fortemente indicado neste caso. Cabe ao mantenedor do port decidir se o port instala as dependências JAR adicionais sob esse diretório ou utiliza as já instaladas (de ${JAVAJARDIR}).

Ao portar um aplicativo Java™ que requer um servidor de aplicação, como o www/tomcat7 para executar o serviço, é bastante comum que o fornecedor distribua um .war. Um .war é uma aplicação Web ARchive a qual é extraído quando chamado pelo aplicativo. Evite adicionar um .war no pkg-plist. Isto não é considerado a melhor prática. Um servidor de aplicação irá expandir o arquivo war mas não irá remove-lo se o port for desinstalado. Uma forma mais desejável de trabalhar com este arquivo é extrair o seu conteudo, depois instalar os arquivos e, por fim, adicionar esses arquivos ao pkg-plist.

TOMCATDIR=	${LOCALBASE}/apache-tomcat-7.0
WEBAPPDIR=	myapplication

post-extract:
	@${MKDIR} ${WRKDIR}/${PORTDIRNAME}
	@${TAR} xf ${WRKDIR}/myapplication.war -C ${WRKDIR}/${PORTDIRNAME}

do-install:
	cd ${WRKDIR} && \
	${INSTALL} -d -o ${WWWOWN} -g ${WWWGRP} ${TOMCATDIR}/webapps/${PORTDIRNAME}
	cd ${WRKDIR}/${PORTDIRNAME} && ${COPYTREE_SHARE} \* ${WEBAPPDIR}/${PORTDIRNAME}

Independentemente do tipo de port (biblioteca ou aplicativo), a documentação adicional é instalada na mesma localização como para qualquer outro port. A ferramenta Javadoc é conhecida por produzir um conjunto diferente de arquivos, dependendo da versão do JDK utilizado. Para ports que não impõem o uso de um determinado JDK, é uma tarefa complexa especificar a lista de empacotamento (pkg-plist). Esta é uma razão pela qual os mantenedores de ports são fortemente encorajados a usar PORTDOCS. Além disso, mesmo se o conjunto de arquivos que serão gerados pelo javadoc puder ser previsto, o tamanho do pkg-plist resultante irá encorajar o uso do PORTDOCS.

O valor padrão para DATADIR é ${PREFIX}/share/${PORTNAME}. É uma boa ideia sobreescrever DATADIR para ${JAVASHAREDIR}/${PORTNAME} para ports Java. De fato, DATADIR é automaticamente adicionado a PLIST_SUB (documentado emSeção 8.1, “Alterando o pkg-plist Baseado em Variáveis Make”) então use %%DATADIR%% diretamente em pkg-plist.

Quanto à escolha de compilar ports Java a partir do código fonte ou instalar diretamente a partir de uma distribuição binária, não há política definida no momento da escrita deste livro. No entanto, os membros do Projeto Java do FreeBSD encorajam os mantenedores de ports a terem seus ports compilados a partir do código fonte sempre que for possível.

Todos os recursos que foram apresentados nesta seção são implementados em bsd.java.mk. Se o port precisar de suporte Java mais sofisticado, por favor, primeiro dê uma olhada no log do bsd.java.mk no Subversion pois normalmente leva algum tempo para documentar os recursos mais recentes. Então, se o suporte necessário que estiver faltando for benéfico para muitos outros ports Java, sinta-se à vontade para discuti-lo na Lista de discussão do FreeBSD sobre Linguagem Java.

Embora haja uma categoria Java para PRs, isso refere-se ao esforço de portabilidade do JDK do projeto Java do FreeBSD. Portanto, envie o port Java na categoria ports como para qualquer outro port, a menos que o problema esteja relacionado a uma implementação do JDK ou ao bsd.java.mk.

Da mesma forma, existe uma política definida sobre as CATEGORIAS de um port Java, que é detalhada em Seção 5.3, “Categorização”.

All FreeBSD documents are available for download at https://download.freebsd.org/ftp/doc/

Questions that are not answered by the documentation may be sent to <freebsd-questions@FreeBSD.org>.
Send questions about this document to <freebsd-doc@FreeBSD.org>.