Pular para o conteúdo principal

Hello Roo

Durante o segundo semestre de 2009 tomei conhecimento a respeito da iniciativa de produtividade da Springsource conhecida como Spring Roo. Posteriormente, tive um contato muito convincente com essa ferramenta durante a passagem de Rod Johnson no Brasil no evento TDC 2009.
Atualmente utilizo essa ferramenta em um projeto, e espero compartilhar algumas experiências no Casual Class de Spring, dia 26 fev 2010. Este evento marcará o lançamento do Spring Brasil User Group.

 O que é Spring Roo ?
 - Roo é uma ferramenta Open Source de produtividade Java, baseada em
    - uma plataforma modularizável capaz de evoluir através de add-ons
    - um terminal de comandos, chamado Roo Shel.
 - Sem dúvida o principal atrativo de produtividade do Roo é a geração de código. Justamente por utilizar uma plataforma modularizável não podemos dizer que o Roo é apenas um gerador de código, e entendo que muitas etapas do ciclo de vida de um projeto Java poderão se beneficiar dessa ferramenta. Por exemplo, Roo já oferece suporte para automação de testes.
 - Roo representa uma evolução em relação a outros geradores de código, ao suportar desenvolvimento interativo, onde o código gerado (camadas web, persistência e testes) não é definitivo. Em outras palavras, através do Roo, o código gerado evolui automaticamente, junto com o modelo de entidades.
 - A distribuição atual do Roo (1.0.1):
    - fornece geradores de código para aplicações web baseadas em Spring MVC 3.0, AspectJ e nos padrões Bean Validation e JPA
    - fornece geradores de testes JUnit e Selenium
    - é baseada no Apache Maven
 - Além do terminal de comandos (Roo Shell) há o suporte no IDE SpringSoruce Tools Suite (STS), onde encontramos um Roo Shell embutido.
 - Outro destaque é o grau de dependência introduzido: mínimo. Um projeto iniciado com o Roo não precisa utilizá-lo eternamente, sendo razoavelmente simples continuar o projeto desenvolvendo "na mão", sem utilizar o Roo Shell.

O que não é Spring Roo:
 - Roo não é um framework: um projeto criado em Roo não necessita de nenhuma biblioteca Roo em tempo de execução. Sim, existem annotations @Roo, entretanto estas possuem retenção no código fonte, e servem para orientar o gerador de código do Roo e o AspectJ.
 - Roo não determina uma arquitetura para seus projetos: como foi dito a distribuição atual gera aplicações Spring MVC / JPA, mas não tardatá surgir add-ons para outras arquiteturas (a Springsource tem demonstrado um interesse muito grande em add-ons para GWT).
 - Roo não é a salvação para desastres iminentes em projetos, onde pelo menos dois dos seguintes fatores estão presentes: requisitos mal especificados / cronogramas e orçamentos surreais / equipes de desenvolvimento inexperientes. Suspeito que, nesses casos a salvação não se encontrá em uma ferramenta, em um framework ou em promessa alguma de mágica tecnológica.

Gostinho de Produtividade
No vídeo abaixo, Massimiliano Dessi (Spring Framework Italian Group) demonstra a construção de um projeto com o Roo Shell.
Notem que o vídeo utiliza uma versão antiga (Milestone 2) do Roo, e a versão atual (Release) possui vários comandos simplificados, como veremos a seguir.



Preparando seu Hello World
- JDK 6
- Apache Tomcat 6
- Apache Maven 2.0.9 ou superior
   -  http://maven.apache.org/index.html
   -  http://docs.codehaus.org/display/MAVENUSER/Getting+Started+with+Maven
- instale o Roo 1.0.x com Roo Shell (terminal de comandos)
  - download em http://www.springsource.com/download/community?project=Spring%20Roo
  - descompacte o zip em um diretório de sua preferência
  - crie uma variável de ambiente ROO_HOME, apontando para o diretório de instalação
  - ajuste sua variável de ambiente PATH, acrescentando o caminho ROO_HOME/bin

Criando um projeto via terminal de comandos
Como exemplo criaremos um cadastro de bookmarks. Na primeira execução do Roo o Maven será acionado para fazer diversos downloads de bibliotecas - uns 10 minutos de paciência.
- crie um diretório (ex: roo_teste1) posicione-se (cd roo_teste1)
- inicie o Roo Shell (aqui começa a diversão), digitando roo.sh ou roo.bat

Dois comandos iniciais no Roo Shell: help e hint. O comando help exibe todos os comandos disponíveis no shell. Já comando hint fornece uma ajuda contextualizada, sugerindo o que você pode fazer em determinado estágio do seu projeto.
Não deixe de utilizar autocomplete do Roo Shell, que é ativado com a tecla TAB no terminal de comandos (ou com CTRL+SPACE no STS).
Digite no Roo Shell os seguintes comandos (em negrito).
Para criar o projeto e definir a esturura de pacotes principal:
project --topLevelPackage globalcoders.bookmarks
Para definir a camada de persistência:
persistence setup --database HYPERSONIC_IN_MEMORY --provider HIBERNATE
Para definir uma classe de entidade, para as categorias de bookmarks (o símbolo ~ significa o pacote top level)
entity --class ~.model.Categoria
Para definir um campo ná última entidade:
field string --fieldName nome
Mais uma entidade, para os bookmarks:
entity --class ~.model.Bookmark
Campos, com restrições e relacionamentos:
field string --fieldName url --sizeMin 5 --sizeMax 200 --notNull
field reference --fieldName categoria --type ~.model.Categoria
field date --fieldName dataCadastro --type java.util.Date
Para gerar a camada web, com controllers Spring MVC e views .jspx e Tiles:
controller all --package ~.web
Para compilar e gerar um .war (via Maven):
perform package
Para adaptar o projeto para o Eclipse:
perform eclipse
Para fechar o Roo Shell:
quit

Vamos executar a aplicação, colocando o Tomcat no ar e fazendo o deployment via Maven.
No terminal de comandos, com o Roo Shell fechado (quit), execute:
mvn tomcat:run
No browser de sua preferência: http://localhost:8080/bookmarks

Onde estão os métodos das Entidades e Controllers ?
Você pode conferir o código gerado na pasta src/main do seu projeto.
Ao inspecionar os arquivos Categoria.java e Bookmark.java verificamos que não existem métodos get/set ou toString().
E inspecionando os contollers CategoriaController.java e BookmarkController.java não encontramos métodos.
As implementações de tais métodos ocorrem através de um mecanismo suportado em AspectJ chamado Inter-type declarations (ITD). Ao navegar nos diretórios onde se encontram os arquivos .java das entidades e controllers encontraremos arquivos com a extensão .aj que implementam os métodos em questão.
Uma dica importante: os ITDs são gerados automaticamente pelo Roo e não devem ser editados. É possível editar os arquivos .java - no  vídeo do Massimiliano o método toString de uma das classes foi redefinido em um arquivo .java.
Outra dica: utilizar a IDE (baseada no Eclipse) Springsource Tool Suite 2.3.0 ou superior pois suporta AspectJ, e consequentemente os ITDs.

Sugestões para experiências adicionais
 - Edite diretamente o arquivo Bookmark.java, adicionando um atributo String descricao com annotations @Size e @NotNull (da especificação Bean Validation, JSR 303). Execute o Roo Shell novamente e observe as mensagens geradas. Saia do Roo Shell, e execute o tomcat (mvn tomcat:run) e via browser verifique o que mudou no formulário de criação de Bookmarks.
 - Em Categoria.java defina um método toString ao seu gosto  e remova a annotation @RooToString. Que mensagem surge no Roo Shell após salvar este arquivo código fonte ? Execute novamente o tomcat e verifique o combo box de Categorias no formulário de Bookmarks;
 - No Roo Shell digite finder list --class ~.model.Bookmark. Ainda no Roo Shell digite finder add findBookmarksByDataCadastroLessThan. Execute o tomcat e veja o que mudou no menu da aplicação.

Onde encontrar mais informações:
- Muitos links em http://forum.springsource.org/showthread.php?t=71985
- Não perca o Casual Class da Globalcode
- Acompanhe meu blog

Renato Bellia
http://twitter.com/renatobellia
http://notasingleshot.blogspot.com

Comentários

Yara Senger disse…
Parabéns pelo post Renato, ficou ótimo, completo. Adorei os videos que você incluiu no post.

Você vai mesmo utilizar Spring Roo em projetos reais ?

[]s
Yara
rbellia disse…
Opa, já estamos utilizando.
Melissa Villela disse…
Se você encontrar a mensagem 'Could not locate Maven executable; please ensure mvn command is in your path', acrescente na variável PATH o caminho do diretório bin de onde você instalou o maven.
Anônimo disse…
GC-CBR

Parabéns mesmo pelo post, ficou totalmente completo, até com videos para ajuda a entender melhor.
Robert Willian disse…
Não gostei muito do excesso de Aspect, onde eu vou colocar meus finders complexos, aqueles que só na unha é possivel de ser fazer?

Postagens mais visitadas deste blog

10 reasons why we love JSF

1. One-slide technology: it's so simple that I can explain basic JSF with one slide. 2. Easy to extend: components, listeners, render kit, Events, Controller, etc. 3. Real-world adoption: JBoss, Exadel, Oracle, IBM, ... 4. Architecture model: you can choose between more than 100 different architecture. 5. Open-mind community: using JSF you are going to meet very interesting people. 6. We are using JSF the last 5 years and we found very good market for JSF in Brazil 7. Progress: look to JSf 1.1 to JSF 1.2, JSF 1.2 to JSF 2.0. People are working really hard! 8. Many professionals now available 9. It's a standard. It's JCP. Before complain, report and help! 10. Ed Burns, spec leader, is an old Globalcode community friend! EXTRA: My wife is specialist in JSF. She's my F1 for JSF :) Nice job JSF community! -Vinicius Senger

Vem vindo novidade por ai... Minicurso de desenvolvimento iOS

Ola pessoal, Depois de uma conversa com a Yara, resolvemos colocar em prática uma idéia que já tinhamos a um tempo, que é aumentar as opções de mobilidade no portifólio da Globalcode e também da iniciativa Open4Education. E nesse caso estamos falando de um minicurso sobre desenvolvimento para iPhone e iPad. O objetivo desse minicurso vai ser mostrar que desenvolver para iOS não é tão complicado como se pode pensar e que não é preciso ter medo do Objective-C ! Serão algumas horas onde os alunos poderão entender os fundamentos da plataforma, como funciona o programa para desenvolvedores da Apple, preparação do ambiente e dos devices de teste e também um overview dos layers de desenvolvimento do iOS. Além disso, o objetivo também vai ser passar um pouco da minha experiência na "migração" que fiz de Java (seja SE, ME ou Android) para o novo mundo do Objective-C e Cocoa Touch. O material está no começo e ainda não temos uma data certa (só sabemos que a primeira edição desse minicu...

JavaMail: Enviando e-mail com Java

Introdução Além da necessidade de envio de e-mail ser comum a várias aplicações, foi a pergunta de um aluno da Academia Java ,  “Como enviar um e-mail com Java?”, que me motivou a escrever este post sobre JavaMail. JavaMail Para realizar o envio de e-mail por meio de uma aplicação Java, precisamos da biblioteca JavaMail, pois ela não é incluída no Java SE. A biblioteca está disponível em http://www.oracle.com/technetwork/java/index-138643.html . Neste download, além da biblioteca mail.jar que inclui a implementação completa da API e providers, também é disponibilizada a documentação da biblioteca ( javadoc ) na pasta docs , alguns exemplos na pasta demo e partes da implementação em lib . A forma mais simples de utilizar a JavaMail e incluir o mail.jar , porém para uma aplicação que só envia e-mail como o nosso exemplo, necessitamos apenas dos arquivos mailapi.jar e smtp.jar , economizando 177KB. Como a economia é pouca e as aplicações evoluem, vamos adicionar o mail.j...

Facelets uma forma mais ágil para construção de telas – Parte I

A construção de telas ou camada de apresentação em um sistema MVC seja web ou desktop é uma tarefa complexa e de extrema importância. Nesse post vou comentar e mostrar algum exemplo do Facelets como solução para os desafios existentes nessa etapa especificamente para web. Com a web cada vez mais presente em nosso dia-a-dia, um fato é que com isso nossos usuários tornam-se mais exigentes em relação a usabilidade, agilidade, performance ou de uma forma bem resumida “o usuário espera uma navegação simples e agradável aonde uma determinado tarefa possa ser concluída em poucos passos e em um curto espaço de tempo”. Atender as expectativas em relação ao que o usuário espera com o que realmente ele precisa, definir uma estrutura flexível a mudanças sem engessar o desenvolvimento, acessibilidade, portabilidade em múltiplos navegadores, tudo isso e muito mais, num prazo que quase sempre é apertado. Um outro ponto fundamental é manter o time motivado e produtivo em um ambiente que favoreça a...

JavaOne Brasil, dicas para submissão de palestras

Não quero parecer pretensiosa dando dicas para submissão de palestras para o JavaOne Brasil, mas sim repassar os tantos conselhos e sugestões recebidas pelos vetaranos do JavaOne: Bruno Souza e Leonardo Galvão que revisaram dezenas de submissões para o JavaOne e ajudaram a aprovar tantas palestras, e também misturar um pouco da minha experiência na seleção de palestras nos eventos realizados pela Globalcode e SouJava . 10 anos de JavaOne: http://www.globalcode.com.br/noticias/Globalcode10AnosNoJavaOne Os palestrantes ganham a entrada! A submissão pode ser feita em português! O passo mais importante para ser aprovado como palestrante no JavaOne é sem dúvida nenhuma submeter pelo menos uma palestra. Então, independente de qualquer coisa, participe, arrisque, divulgue.  Mas, se quiser aumentar as suas chances...   1) Leve a sério: peça para amigos fazerem uma leitura crítica do texto, e claro uma boa revisão ortográfica. 2) Submissão de várias palestras ou variações do ...

Facelets ainda mais divertido! Parte II

De volta ao Facelets , na primeira parte mantive o foco na utilização de templates e técnicas de reutilização visando maior agilidade para desenvolver telas com JSF , mas o Facelets vai bem além disso! Nesse post vou comentar e mostrar um pouco sobre a criação de componentes UI (User Interface) usando xht ml - na minha opinião esse é o grande diferencial da tecnologia. Com esse recurso é possível customizar / padronizar componentes usando xhtml + tags JSF + JavaScript + Css, sem código Java. A ideia é bem próxima ao Tag File em uma rápida comparação com JSP (JavaServer Pages), mas no caso do Facelets feito de uma forma ainda mais simples e com aderência a (infra)estrutura do JSF. Vou descrever o mesmo cenário da primeira parte, um sistema composto por vários cadastros ( C reate R ead U pdate D elete). Pensando especificamente em cada formulário, usando como exemplo um rascunho ou protótipo para o cadastro de Fornecedores, podemos assumir o seguinte formato: campos para preenchi...