terça-feira, 7 de julho de 2009

Montagem dinâmica de classpath

Se existe um negócio chato no mundo é executar Java por linha de comando quando é necessário acrescentar um monte de jars no classpath. Enquanto a linha de comando está estável, tudo bem, você faz uma vez e utiliza sempre a mesma coisa. Porém quando começa a ser necessário adicionar jars, atualizar versões o negócio começa a ficar desagradável.

A solução que encontrei foi montar dinamicamente uma lista dos jars existentes em um diretório e concatenar tudo na variável de ambiente CLASSPATH. Para isso foi utilizando o comando FOR do MS-DOS (sim no DOS tem FOR, IF, só nao tem CLASS ;)).

Para conseguir isto, o interessante é adotar um padrão como o a seguir.

meuAplicativo
- lib
- executa.bat
- addpath.bat


Na pasta lib mantenha todos os jars do seu projeto.

O arquivo executa.bat segue o modelo abaixo:

@echo off
SET CLASSPATH=
dir /b "lib\*.jar" > temp.tmp
FOR /F %%I IN (temp.tmp) DO CALL addpath.bat lib\%%I
DEL temp.tmp
set CLASSPATH=.;%CLASSPATH%
java meupacote.MinhaClasse

O arquivo addpath.bat tem o conteúdo abaixo:

set CLASSPATH=%CLASSPATH%;%1

Você provalmente está se perguntando porque criar um outro bat só para setar o CLASSPATH e não fazer o set direto no FOR. Bem, pergunte ao Bill Gates, porque isso realmente não funciona.

Em Linux, como as coisas funcionam, é necessário apenas um arquivo de script para o mesmo efeito.

#!/bin/sh

export CLASSPATH=

for jarfile in ./lib/*.jar; do
CLASSPATH=$CLASSPATH:./lib/$jarfile
done
export CLASSPATH=.:$CLASSPATH
java meupacote.MinhaClasse

Também existe a possibilidade de fazer a carga dinâmica de jars pelo próprio java, usando um ClassLoader que irá aceitar a adição dos jars que você quiser. Já fiz alguns testes com essa técnica, mas ainda não funcionou do jeito que eu gostaria, então fica para um próximo post...

então é isso, abraços a todos

Nenhum comentário: