Uma das coisas que sinto falta ao desenvolver em Java é a falta de um modo interativo (ou REPL), como os disponíveis em Python e Ruby. Um REPL é de grande ajuda quando queremos rapidamente testar a sintaxe de um método/função, ou executar uma tarefa simples. No projeto que estou trabalhando atualmente, que está sendo desenvolvido em Java me deparei com uma destas tarefas.
Uma das funcionalidades do sistema resulta na geração de um arquivo PDF a partir de algumas entidades do sistema. Isto foi implementado utilizando Jasper Reports. Basicamente, ela permite que se modele um relatório através de um arquivo XML, que é então compilado. O arquivo compilado pode então ser utilizado para gerar os arquivos PDF de forma dinâmica.
Ao entrar no projeto, a equipe utilizava a ferramenta iReport para modelar e compilar os relatórios. Como eu estava com preguiça de instalar esta aplicação, e precisava realizar mudanças pontuais, resolvi editar o XML e compilá-lo manualmente. Para isto, um REPL seria perfeito. Mas Java não possui um, então como fazer?
A resposta no meu caso foi utilizar Groovy, uma linguagem dinâmica para a JVM, que possui uma sintaxe própria, mas que permite fazer uso das classes e bibliotecas Java existentes. E, como era de se esperar, possui um REPL - Groovy Shell.
A única dificuldade seria configurar o classpath do Groovy Shell, para carregar as bibliotecas do Jasper Reports. Mas como o projeto utiliza Maven para gerenciar suas dependências, procurei uma forma de integrar os dois. E para nossa alegria, há um plugin para o Maven que viabiliza esta integração: Groovy-maven-plugin. Uma vez configurado, basta executar
mvn groovy:shell
e pronto, você poderá importar qualquer classe do seu projeto, ou de suas dependências, e brincar à vontade. Eis como ao final compilei meu relatório:
groovy:000> import net.sf.jasperreports.engine.JasperCompileManager
===> [import net.sf.jasperreports.engine.JasperCompileManager]
groovy:000> JasperCompileManager.compileReportToFile("src/main/resources/jrxml/relatorio.jrxml", "relatorio.jasper")