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

TDC BUSINESS, chega a São Paulo com novas trilhas de Inteligência Artificial e Inovação

Maior conferência de profissionais de tecnologia do Brasil abordará temas em alta no momento como, por exemplo, Inteligência Artificial, Segurança, Ciência de Dados e Inovação O TDC BUSINESS, a 17° edição do The Developer's Conference na cidade de São Paulo, que acontece entre os dias 19 e 21 de Setembro, reunirá profissionais e especialistas da área para troca de experiência, compartilhamento de conteúdos e networking. Com o tema central: “Tecnologia para negócios transformadores”, o evento será totalmente híbrido, ocorrendo presencialmente no espaço Pro Magno, e com transmissão simultânea e atividades de network pela internet. A expectativa é reunir mais de 14.000 pessoas, somando a participação presencial e online.   Segundo Yara Mascarenhas, Fundadora e Host do Evento, “nosso objetivo com o TDC é inspirar a colaboração entre os profissionais e empresas para construir uma nova realidade para o mercado de TI.  Vamos juntar tecnologia e negócios com as trilhas técnicas...

O que é Lógica de programação?

Este é o segundo de uma série de posts voltados aos leitores do blog que estão dando início à carreira de desenvolvimento de software. O assunto de hoje é a lógica de programação. Para ler antes: Entendendo como funciona a programação de computadores: linguagens de programação, lógica, banco de dados A lógica de programação é um pré-requisito para quem quer se tornar um desenvolvedor de software, independente da linguagem de programação que se pretende utilizar. Mas o que é de fato a Lógica de Programação e como saber se eu tenho esse pré-requisito? A lógica de programação nada mais é do que a organização coerente das instruções do programa para que seu objetivo seja alcançado. Para criar essa organização, instruções simples do programa, como mudar o valor de uma variável ou desenhar uma imagem na tela do computador, são interconectadas a estruturas lógicas que guiam o fluxo da execução do programa. Isso é muito próximo ao que usamos em nosso cotidiano para realizar atividad...

JSF 2 - Composite Components, você não precisa mais ser um ninja

Estamos em uma nova era da computação, os dados não estão mais localizados em um banco dentro de sua empresa, vivemos a explosão de redes sociais, informações são geradas a todo instante, e se torna essencial que sua aplicação conheça os serviços disponíveis na web e consumam suas APIs geralmente disponíveis por serviços REST. Legal, mas como ficam meus aplicativos Java EE neste novo cenário? Para quem vem acompanhando a evolução da plataforma, é notório que todo esforço vem sendo utilizado para aumentar a produtividade e a integração com novos serviços. Basicamente duas especificações surgem com muita força para atender este cenário, a JSR - 314 (JSF-2) e JSR - 311 (JAX-RS), neste post exploraremos a JSR-314 (JSF2) e sua nova forma de criar Composite Components. Uma das grandes queixas dos desenvolvedores JSF era a complexidade em criar composite components, era necessário um vasto conhecimento sobre o ciclo de vida de uma aplicação JSF. Agora, você não precisa ser mais um “ninja” em ...

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...

Saiba como programar para Arduino sem ter nenhum hardware disponível

O Arduino já é uma tecnologia muito difundida entre os amantes de tecnologia. É difícil encontrar um profissional da computação que não brincou um pouco com esta ferramenta de prototipagem ou, que gostaria de fazer isso. Porém, em alguns casos, o programador quer conhecer o arduino mas não dispõe de nenhum hardware, nem mesmo da placa. Como isso poderia ser resolvido? A primeira resposta seria aquela mais simples e direta: ir as compras. Isso pode ser feito em uma loja física ou pela internet. No meu caso, por exemplo, tive a felicidade de encontrar em um site (não me lembro qual) um kit arduino, com um conjunto de sensores e um DVD com 41 vídeo aulas. Mas digamos que o profissional não esteja passando por um bom momento financeiro, ou ainda, simplesmente não queira comprar o Arduino sem antes conhecê-lo um pouco melhor. Para a última situação também já existe uma resposta, e diga-se de passagem, uma excelente resposta. Trata-se do site 123D Circuits.io . Depois de criar seu u...

Google TV: Unboxing e Hello World

Recentemente recebemos um "presente" do Google Brasil, um dispositivo Google TV, modelo Sony NSZ-GT1, e coube a mim a honra de receber esse gadget e fazer o unboxing e um hello world para começar a explorar mais essa aposta do Google ! Conhecendo o Google TV Em maio de 2010, durante o Google I/O, a empresa anunciou a criação em conjunto com a Intel, Sony e Logitech a criação de uma plataforma de "Smart TV". Coube ao Google integrar a TV com o Android e também uma versão baseada em Linux do navegador Chrome. Porém, devido a uma série de fatores, como por exemplo a escassez de conteúdo e a ausência de aplicativos, o Google TV teve seu início competitivo um pouco abalado, inclusive alguns analistas na época diziam que o dispositivo era muito "beta". Pois bem, o Google percebeu que a plataforma não ia muito bem, mas não deixou de apostar na idéia, e durante o Google I/O desse ano eles apresentaram o Google TV 2.0 ! O dispositivo agora recebia um update d...