domingo, 12 de julho de 2009

Bug no RecursiveTreeAdater do RichFaces

Estive fazendo alguns testes com o componente Tree do RichFaces usando a tag recursiveTreeAdator que permite alimentar a Tree com dados já em formato de árvore. Por algum motivo que fugia a minha compreensão, a Tree mostrava apenas 2 níveis de itens, sendo que os meus dados tinha 3 níveis. Para forçar os testes criei mais níveis com dados de teste e nada de funcionar.

Foi quando encontrei um bug registrado no Jira do Richfaces (https://jira.jboss.org/jira/browse/RF-6941) que dizia que isto era ocasionado por um bug na commons-collections 2.x, e na versão 3.x já estava corrigido.

Como eu infelizmente tinha as duas versões no meu classpath e obviamente a Lei de Murphy reina sobre o universo, a versão que estava valendo era que a poderia me causar problemas, a 2.x.

A solução foi simples, apaguei a 2.x e mantive a 3.2, funcionou que é uma beleza!

Então quem estiver tendo o mesmo problema, está ai a solução, rápida e indolor.

abraços

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