Escolar Documentos
Profissional Documentos
Cultura Documentos
44 Gradle
44 Gradle
br : :
Cecilia Fernandes
(cecilia.fernandes@caelum.com.br): desenvolvedora, instrutora e
consultora pela Caelum, cursa Ciência da Computação na USP e
estagiou na IBM Research em Nova York. Entusiasta de métodos
ágeis, faz palestras sobre o assunto e aplica métodos ágeis ao
seu dia-a-dia, desde metodologias e práticas até ferramentas para
auxiliar times ágeis, como a apresentada neste artigo.
urante o desenvolvimento de software, todo desenvol- O Gradle é um sistema de builds cuja configuração é feita progra-
vedor precisa automatizar o build de seu projeto e mais maticamente, usando uma elegante DSL em Groovy. Isso significa
frequentemente do que deveria, esta atividade se torna que um build feito em Gradle pode ter métodos, closures e tudo o
uma grande “dor de cabeça” ao fugirmos minimamente dos pa- mais que a linguagem Groovy permite.
drões preestabelecidos.
Neste artigo, você verá como configurar o build de um projeto em
As abordagens mais comuns em Java para configuração do build Java usando o Gradle, inclusive customizando diversas opções.
de projetos dividem-se entre o XML programático do Ant e o uso Conforme avançamos, a própria sintaxe do Groovy será explicada,
de Maven, mas sabemos que nenhuma delas é ideal – muitas ve- para que você seja capaz de continuar explorando o Gradle, ainda
zes, apenas convivemos com essas ferramentas por falta de opção que nunca tenha programado em Groovy antes.
ou, melhor dizendo, falta de opção compatível com o restante do
mercado. Já era hora de trocarmos a programação de XML e os Descubra quais vantagens fizeram com que tanto o próprio Groo-
inúmeros problemas de customizações, sem mencionar o tempo vy quanto o Grails e até mesmo o Hibernate estejam optando por
desperdiçado sempre que aguardamos o Maven sincronizar com o essa nova ferramenta gratuita de build, distribuida sob a licença
repositório, por uma nova alternativa. Apache 2.0.
40
Instalação ta um padrão, o que evita configuração desnecessária. Também é
possível alterar esses valores através da configuração sourceSets.
A instalação do gradle é bastante simples: basta baixar o pacote
de www.gradle.org, descompactá-lo e colocar o seu diretório bin Para começar a usar a estrutura já preparada para Java, basta in-
dentro do seu path. Sua única dependência é um JRE 1.5+ insta- dicar que você usará esse plugin, adicionando ao build.gradle,
lado e configurado. Rodando gradle –v deve listar as versões do necessariamente no início do arquivo, a linha abaixo.
gradle e de suas dependências.
apply plugin: 'java'
Primeiros exemplos
À moda do build.xml do Ant, o arquivo que configura um build É necessário que essa linha esteja logo no início do arquivo, ou
no Gradle chama-se build.gradle. Ele é um arquivo em Groovy, ao menos antes da primeira task que utilize a infraestrutura do
que contém a configuração do projeto através de objetos do tipo plugin de Java, já que o Gradle, como qualquer código Groovy,
“task”, que o Gradle é capaz de executar. interpreta o arquivo sequencialmente. Isso significa que, se cha-
marmos qualquer dependência do plugin de Java antes de decla-
Iniciemos nosso contato com a ferramenta através de um clássico rar que utilizaremos esse plugin, o Gradle falhará, dizendo que
Hello World, para ilustrar nosso exemplo. Em um arquivo build. não conhece tal dependência.
gradle localizado na raiz do projeto, escreva as seguintes linhas:
A partir desse momento, algumas tasks e variáveis padrão passam
a estar disponíveis e, num momento inicial, se seu projeto não
task olaMundo << { depender de nenhuma biblioteca, já é possível chamar a criação
println 'Oi mundo!' de um build dele, rodando no terminal o comando:
}
41
: : www.mundoj.com.br : :
Os métodos from e into, inerentes de tasks do tipo Zip e do tipo [compileJava, compileTestJava]*.options*.encoding=’UTF-8’
Copy do Gradle, têm uma forma simples, que recebe um Object in-
Adicionando essas linhas, o Gradle interpretará seu código como UTF-8 na
dicando de ou para onde, respectivamente, vão os arquivos – você
compilação das classes.
pode ver essa forma sendo utilizada na primeira linha da task zip,
na Listagem 2.
Contudo, existe também uma sobrecarga desses métodos que re- Mais um pouco de Groovy
cebe, além desse parâmetro, uma closure que deve conter o lado
oposto dessa relação, isto é, se chamamos o from originalmente, Note, na Listagem 3, o código resumido para fazer o mesmo que
precisamos dizer onde os arquivos devem ser colocados e, no outro o código com blocos acima. Essa sintaxe também causa confusão
caso, vice-versa. ou estranheza, comumente. O que significa, entretanto, é bastante
simples.
Pode-se, inclusive, adicionar mais diretórios de origem e as subpas-
tas, usando essas closures. O Gradle cuida de montar o Zip da Os colchetes delimitam uma lista de dois itens, separados pela vír-
melhor forma possível, empacotando todos os arquivos indicados. gula. Em seguida, vemos uma incomum construção da forma *. que
significa “para cada item da lista cuja instrução se aplique, faça...”.
Isto é, lendo a sentença como um todo temos: “para cada item da
De volta ao exemplo lista de grupos de compilação, pegue as opções e, para cada opção
que tenha a propriedade encoding atribua UTF-8 a ele.” Esta é apenas
Adicionando a task de zip que acabamos de criar e entender ao
uma forma com características mais funcionais de lidar com objetos.
nosso build.gradle, basta rodar o build novamente para notar a dife-
rença: uma task zip surge entre as executadas pelo comando build.
Diferenciando JARs de testes
:compileJava Ao fazer testes automatizados, é frequente utilizarmos JARs, como
:processResources UP-TO-DATE Junit e Jmock ou Mockito, que servem exclusivamente para fazer
:classes rodar esses testes, e não serão usados na distribuição ou deploy. Já
:jar
que escrever testes automatizados é nada mais que obrigação de
:zip
um bom programador atual, o Gradle já vem preparado para lidar
:assemble
:compileTestJava com diferentes grupos de compilação.
:processTestResources UP-TO-DATE
:testClasses
Usando esse recurso, é fácil separar os JARs necessários para o
:test funcionamento da aplicação daqueles que são apenas usados pe-
:check los testes automatizados – e que, portanto, podem ficar fora do
:build pacote de produção.
BUILD SUCCESSFUL
Sempre que utilizamos o plugin de Java para o gradle, já obtemos
dois grupos de compilação padrão, o “compile” e o “testCompile”.
Problemas de encoding? Separando os JARs nesses grupos padrão, o próprio Gradle já é
capaz de separar corretamente os contextos.
Configurações de encoding são “pesadelos” na vida de muitos
programadores e, em particular, assombram os que configuram Mudando seu código da definição de dependências para usar am-
os builds de projetos. Misteriosas configurações que alteram ape- bos os grupos, então, teremos o código de dependências do build.
nas o escopo de compilação no Maven, mas não o de execução, gradle alterado como mostrado na Listagem 4.
confundem até o mais experiente programador. No Gradle, essa
configuração é trivial.
43
: : www.mundoj.com.br : :
44
Felizmente, o tempo de build de um projeto aumenta cada vez como base. Essa ferramenta também vale um teste por sua rapi-
a uma taxa menor conforme a complexidade e o tamanho dele dez, principalmente se já houver familiaridade com a linguagem.
aumenta, mas ainda assim o tempo necessário para rodar é um Ela é, juntamente com o Gradle, recomendada por Jez Humble e
dos pontos mais notoriamente negativos do Groovy. David Farley no livro Continuous Delivery.
Sua ideia perde apenas para a Simple Build Tool (SBT): outra
ferramenta de build, voltada para Scala, que permite interação
programática através de um shell. A ideia é que o SBT roda duran-
Para Saber Mais te todo o tempo de desenvolvimento e, com isso, tem mais chance
Na edição 42, o artigo Conhecendo as Principais Linguagens de ter seu script otimizado•
para JVM já falava de Groovy e seu uso para produzir elegan-
tes DSLs como o Gradle.
Referências
Considerações Finais • Por que Gradle? Grupo JBoss responde
http://community.jboss.org/wiki/Gradlewhy
• Migrando do Maven pro Gradle
Ainda que bastante recente, o Gradle é uma ferramenta promis- http://www.beeworks.be/maven-to-gradle-part-1/
sora ao trazer grandes melhorias quando comparado aos seus • Erro no pom.xml do Tomcat 7.0.2
predecessores, Ant e Maven. Finalmente podemos configurar http://www.apacheserver.net/tomcat-7-pom-listing-wrong-ECJ-dependency-
at232339.htm
builds de forma programática e declarativa, usando uma sintaxe • Site do Gradle
elegante que encapsula o Ivy. O Gradle também possui plugins http://gradle.org/
para compilar e trabalhar com projetos em Scala e Groovy. • Documentação da versão citada no artigo
http://www.gradle.org/0.9-rc-1/docs/userguide/userguide.html
Outra alternativa bastante similar é o Apache Buildr (http://buildr.
apache.org/), que tem a mesma proposta, mas usa sintaxe Ruby