JBoss Forge – Projeto Exemplo JSF / CDI / Connection Pool / Scaffolding / I18N

O título já fala praticamente tudo sobre o post. O que faremos aqui é utilizar o JBoss Forge para a geração de:

– Projeto Web padrão JavaEE;
– JSF;
– CDI (Context and Dependency Injection);
– Connection Pool para o MySQL com GlassFish 3.1.2;
– Scaffolding para uma entidade simples.

O que você precisa ter instalado de antemão (com as variáveis de ambiente devidamente configuradas):
– Apache Maven: http://maven.apache.org/download.html (a página tem as instruções todas);
– JBoss Forge: https://docs.jboss.org/author/display/FORGE/Installation
– Glassfish Community: http://glassfish.java.net/public/downloadsindex.html#top
– Plugin do Glassfish configurado no Eclipse
– Driver JDBC do MySQL: http://cdn.mysql.com/Downloads/Connector-J/mysql-connector-java-5.1.22.tar.gz
– Um schema no MySQL com o nome que você definir. Não, não precisa criar tabela nenhuma.

Vamos parar com o trelelê e gerar logo esse negócio, antes que acabe o horário de almoço aqui na empresa e eu me arrependa de ter começado o post, post esse que já ando postergando há milênios.

1º passo: O Pool no GlassFish:
– Coloque o driver JDBC do MySQL na pasta lib do GlassFish; no meu caso aqui: /home/leonardo/Tools/servers/glassfish3/glassfish/lib;
– Não vou perder tempo explicando como faz a configuração em si, porquê ela é ridícula de simples; na dúvida, Pai-Google-de-Logum-Edê lhe responde, mizinfí: http://rafaelomarques.wordpress.com/2011/01/31/configurando-pool-de-conexoes-com-mysql-e-glassfish-v3/
– Batize o JDBC Resource de jdbc/ProjetoExemplo

2º passo: O projeto no Forge:
Abra o forge (no terminal: forge; no prompt do windows: forge; no mac: sou pobre, não faço ideia);
Crie o novo projeto, de nome ProjetoExemplo, com o pacote base br.com.develoraptor e o nome final de ProjetoExemplo; o forge vai pedir confirmação pra criar a pasta. Você sabe o que fazer (eu espero).

new-project --named ProjetoExemplo --type war --topLevelPackage br.com.develoraptor --finalName ProjetoExemplo

Projeto criado, ok. Agora vamos configurar o danado pra se entender com o JSF e o CDI. Há um plugin pro primefaces, mas eu já testei e te garanto: não funciona. É completamente bugado e não vale o uso. Então vamos com o padrão, que é mais jogo.
O forge vai pedir confirmação pra instalação das libs. O asterisco que aparece nas opções é sempre a versão mais atual, e é a padrão. Use a mais atual, por favor. Vai ser melhor pra você, confia no tio.

scaffold setup --scaffoldType faces

Configurando a internacionalização (I18N para os íntimos – e preguiçosos)

i18n setup --bundleName messages

E adicionando um bundle pro locale pt_BR, porquê eu sou patriota

i18n add-locale --locale pt_BR

Vamos configurar a persistência decentemente, agora, apontando pro nosso pool pré-configurado

persistence setup --provider HIBERNATE --container GLASSFISH_3 --jndiDataSource jdbc/ProjetoExemplo

Criamos, então, a entidade Usuario, que vamos usar como exemplo. O forge é tão simpático que já lhe oferece o pacote “model” como destino da entidade nova.

entity --named Usuario --idStrategy AUTO

Criamos o campo ‘nome’ e o campo ‘dataNascimento’ pra essa entidade

field string --named nome
field temporal --type DATE --named dataNascimento

Criamos, então, as telas do CRUD desta entidade. OPCIONAL, claro, já que ninguém com cérebro usa scaffold em produção

scaffold from-entity br.com.develoraptor.model.Usuario

3º passo: A importação para o Eclipse (porquê uma hora você ia ter que trabalhar de verdade)
Ainda no forge, transforme esse negócio aí num projeto do Eclipse:

mvn eclipse:eclipse

Agora, importe esse projeto pro Eclipse.

File > Import > Existing Projects Into Workspace

Aqui a porca torce o rabo. Por algum motivo, esse projeto não vem como projeto Maven pra dentro do Eclipse. Daí é bem difícil de resolver:

Botão direito no projeto > Configure > Convert to Maven Project

Além disso, as dependências do Hibernate no pom.xml não estão configuradas para serem incluídas no build, e sim para estarem já publicadas no Glassfish. Assim, você tem duas opções: baixar manualmente e colocá-las na pasta lib do Glassfish OU alterar isso no pom, excluindo a linha do <scope>provided</scope> para os seguintes artefatos:

<artifactId>hibernate-entitymanager</artifactId>
<artifactId>hibernate-jpa-2.0-api</artifactId>
<artifactId>hibernate-entitymanager</artifactId>

4º passo: Execução, o Gran Finale
Execute o rapaz com o Glassfish:

Botão direito no projeto > Run as > Run on Server > Glassfish

5º passo: FUN FUN FUN
O CRUD você sabe usar. Uns screenshots aqui, só pra ninguém dizer que é mentira minha que funciona.

Este slideshow necessita de JavaScript.

O scaffold (essa geração de telas) é completamente opcional. O ‘scaffold setup’ executado após a criação do projeto não é; ela define os facets do projeto. Infelizmente a documentação do forge é pobre feito um mendigo de porta de igreja, então muita coisa é na base da tentativa e (muito) erro.

Dúvidas, tente os comentários e/ou use o google (apesar de que, pro Forge, infelizmente ele não ajuda muito).