E como prometí, segue mais um capítulo da série “Desenvolvendo Software com Ferramentas Livres“, focando hoje tecnologias Java. Mas…Por que Java?
- Porque é uma plataforma de desenvolvimento de qualidade, madura, de uso gratuito e de código aberto.
- Porque tem excelentes frameworks de código aberto e de igual competência, que facilitam minha vida, sendo o Genesis um deles.
- Porque tem excelentes ambiente de desenvolvimento de código aberto (sim, eu adoro essa expressão) que são de igual ou melhor qualidade que muitas soluções proprietárias.
- Porque tem ficado cada vez mais fácil desenvolver de forma decente com Java!
Por que o Genesis?Java sempre foi mais utilizado para desenvolver aplicativos Web pois ERA muito mais viável e produtivo do que fazê-lo para aplicativos Desktop. Tendo em vista este problema, foi criado então o framework Genesis. E o que ele faz, na prática:
- TE POUPA DO TRABALHO SUJO: Você não precisa se preocupar em como vai mostrar informações que estão nos Objetos nas Telas do seu programa (Seja uma simples propriedade que precisa ser mostrada num JTextField ou uma Lista de Objetos que precisam ser mostradas numa JList, JTable ou similares). Basta escrever 2 ou 3 linhas de código e algumas anotações java nos lugares certos para que o Genesis faça todo o resto pra você, tudo isso de forma limpa e organizada (nada mais de misturar o código de interface com o código de negócios).
- INTERFACE E CONDIÇÕES DE FORMA FÁCIL: Sabe aquelas tarefinhas chatas, como desabilitar campo X quando o campo Y não estiver preenchido? ERAM chatas. Agora você simplesmente usa uma anotação – que nesse caso seria a @EnableWhen(’<expressão condicional>’) – e tudo se resolve. O mesmo se aplica à tarefas parecidas, como “Limpar campo quando…” (@CleanOn) ou “Mostrar campo quando…” (@VisibleWhen).
- TE SALVA DA CHATEAÇÃO: Torna Validação, Formatação, Internacionalização, Testes na lógica de interface e Paginação de listas de dados fáceis como nunca.
- SWING, SWT e THINLET: Qual dos três você mais gosta? Não faz diferença, pois o Genesis suporta os três!
- E PARA AS APLICAÇÕES PARRUDAS: Integração com Hibernate, Remotabilidade transparente (e bota transparente nisso… quer executar um método remotamente? @Remotable neles e tá resolvido) e suporte à transações para os aplicativos mais sérios.
Quer mais detalhes? Visite o site oficial: http://genesis.dev.java.netPor que o Netbeans?
- Porque com ele eu construo telas mais fácil e melhor que em qualquer outra IDE (sim, Delphi e VB não são os mais fáceis nesse quesito).
- Porque tem refactoring.
- Porque tenho a opção de escolher o idioma que quero usar.
- Porque é completo out-of-the-box.
- E porque eu gosto e é produtivo pra mim, e talvez seja pra você também!
Interessante, mas e agora?E agora mostramos tudo isso que falamos de forma prática. Que tal criarmos juntos um Genesis Hello World, utilizando Java e Genesis no Netbeans? Clique na image a seguir e acompanhe o screencast:
Apenas uma observação: Para a galera das aplicações parrudas, que precisam usar hibernate com jboss ou outro servidor de aplicações, salientamos que é necessário o uso da estrutura chamada empty-project, que é um esqueleto de projeto que já vem na distribuição do Genesis. Não usamos o empty project nesse exemplo para que o primeiro contato com o Genesis fosse mais rápido e fácil, porém não é possível usar as features de remotabilidade e transacionalidade transparente, além da integração com o hibernate dessa forma.Espero que tenham apreciado esse primeiro contato essas tecnologias e aguardamos seus comentários que certamente nos motivarão para um próximo screencast. Sugestões são mais que bem vindas!Até a próxima!
Tags: Desenvolvimento, Desktop, Java, Screencast

Esse tutorial não funcionou comigo. Estou usando o genesis 3.0 final, JDK 5.0 Update 13 e Netbeans 6.0.1.
Na classe MySwingView, ao executar a linha
SwingBinder binder = new SwingBinder(this, new MyForm());
, dá um erro de execução:
Exception in thread “AWT-EventQueue-0″ java.lang.NoClassDefFoundError: org/apache/bsf/util/BSFEngineImpl
Procurei essa classe nas libs que vieram com o genesis e não achei. O que estou fazendo de errado?
Aqui é o yuri do blog.yuriteixeira.com
Sobre seu problema, acredito que seja uma dependência que você esqueceu de adicionar. Antes de postar esse tutorial, eu o testei inúmeras vezes, e muita gente já o executou sem problemas (apenas uma pessoa teve problemas, mas ele copiou o texto de forma errada). Para mais detalhes, inscreva-se no grupo usuarios@genesis.dev.java.net. Lá você terá respostas mais rápido e com mais precisão, caso minha dica sobre as dependências esteja errada.
Abraços
Também estou tendo esse mesmo problema do Bruno. Pra resolver essa dependência, coloquei essa lib chamada bsf-api-3.0-beta2.jar, porém apareceu outro erro:
Exception in thread “AWT-EventQueue-0″ java.lang.RuntimeException: The ‘messages.properties’ file was not found in classpath:
at net.java.dev.genesis.ui.UIUtils.getBundle(UIUtils.java:63)
at net.java.dev.genesis.ui.swing.SwingExceptionHandler.createStackTracePanel(SwingExceptionHandler.java:69)
.
.
.
O que pode ser?
Obrigado
eu inclui esse arquivo que estava pedindo “messages.properties” e vejo o outro erro que está dando:
06/03/2008 23:55:17 net.java.dev.genesis.ui.binding.AbstractDispatcherExceptionHandler handleException
SEVERE: Unexpected error occurred
java.lang.NullPointerException
at net.java.dev.genesis.script.javaxscript.JavaxScriptScriptContext.(JavaxScriptScriptContext.java:41)
at net.java.dev.genesis.script.javaxscript.JavaxScriptScript.newContext(JavaxScriptScript.java:41)
at net.java.dev.genesis.ui.controller.DefaultFormController.createScriptContext(DefaultFormController.java:154)
at net.java.dev.genesis.ui.controller.DefaultFormController.setup(DefaultFormController.java:136)
at net.java.dev.genesis.ui.binding.AbstractBinder.setupController(AbstractBinder.java:408)
at net.java.dev.genesis.ui.binding.AbstractBinder.bind(AbstractBinder.java:251)
at net.java.dev.genesis.ui.swing.SwingBinder.bind(SwingBinder.java:253)
at genesishelloworld.MySwingView.(MySwingView.java:23)
.
.
.
Mais pelo menos agora estou conseguindo visualizar a tela. Só não funciona as ações do MyForm.
O que pode ser esse erro?
Obrigado.
Boa tarde,
Estou querendo utilizar o framework Genesis em uma aplicação java/swing que irei desenvolver. Para isso, fui em busca de informações. Achei um tutorial muito interessante que dá uma introdução de como utilizar o Genesis ( Aqui está o exemplo ).
Porém está dando o seguinte erro:
Exception in thread “AWT-EventQueue-0″ java.lang.NoClassDefFoundError: org/apache/bsf/util/BSFEngineImpl
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:620)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:124)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:260)
at java.net.URLClassLoader.access$100(URLClassLoader.java:56)
at java.net.URLClassLoader$1.run(URLClassLoader.java:195)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:18
at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:26
at java.lang.ClassLoader.loadClass(ClassLoader.java:251)
at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:319)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:164)
at net.java.dev.genesis.script.bsf.BSFScriptFactory.class$(BSFScriptFactory.java:29)
at net.java.dev.genesis.script.bsf.BSFScriptFactory.(BSFScriptFactory.java:29)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:164)
at net.java.dev.genesis.reflection.ClassesCache.getClass(ClassesCache.java:44)
at net.java.dev.genesis.script.ScriptRegistry.newInstance(ScriptRegistry.java:111)
at net.java.dev.genesis.script.ScriptRegistry.initialize(ScriptRegistry.java:90)
at net.java.dev.genesis.script.ScriptRegistry.initialize(ScriptRegistry.java:75)
at net.java.dev.genesis.script.ScriptRegistry.getScript(ScriptRegistry.java:143)
at net.java.dev.genesis.script.ScriptRegistry.getScript(ScriptRegistry.java:159)
at net.java.dev.genesis.ui.metadata.DefaultFormMetadataFactory.getFormMetadata(DefaultFormMetadataFactory.java:40)
at net.java.dev.genesis.ui.controller.DefaultFormControllerFactory.getFormMetadata(DefaultFormControllerFactory.java:73)
at net.java.dev.genesis.ui.controller.DefaultFormControllerFactory.configure(DefaultFormControllerFactory.java:63)
at net.java.dev.genesis.ui.controller.DefaultFormControllerFactory.getFormController(DefaultFormControllerFactory.java:34)
at net.java.dev.genesis.ui.binding.AbstractBinder.getFormController(AbstractBinder.java:184)
at net.java.dev.genesis.ui.binding.AbstractBinder.(AbstractBinder.java:147)
at net.java.dev.genesis.ui.swing.SwingBinder.(SwingBinder.java:146)
at net.java.dev.genesis.ui.swing.SwingBinder.(SwingBinder.java:80)
at genesishelloworld.MySwingView.(MySwingView.java:1
at genesishelloworld.Main$1.run(Main.java:22)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:461)
at java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchThread.java:242)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:163)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:157)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:149)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:110)
Já coloquei até essa lib ‘bsf’ que é do projeto jakarta, porém ocorreu outro erro.
ERRO:
Exception in thread “AWT-EventQueue-0″ java.lang.RuntimeException: The ‘messages.properties’ file was not found in classpath.
at net.java.dev.genesis.ui.UIUtils.getBundle(UIUtils.java:63)
at net.java.dev.genesis.ui.swing.SwingExceptionHandler.createStackTracePanel(SwingExceptionHandler.java:69)
…
Dai inclui esse arquivo ‘messages.properties’, novamente outro erro:
07/03/2008 00:10:54 net.java.dev.genesis.ui.binding.AbstractDispatcherExceptionHandler handleException
SEVERE: Unexpected error occurred
java.lang.NullPointerException
at net.java.dev.genesis.script.javaxscript.JavaxScriptScriptContext.(JavaxScriptScriptContext.java:41)
at net.java.dev.genesis.script.javaxscript.JavaxScriptScript.newContext(JavaxScriptScript.java:41)
at net.java.dev.genesis.ui.controller.DefaultFormController.createScriptContext(DefaultFormController.java:154)
at net.java.dev.genesis.ui.controller.DefaultFormController.setup(DefaultFormController.java:136)
at net.java.dev.genesis.ui.binding.AbstractBinder.setupController(AbstractBinder.java:40
at net.java.dev.genesis.ui.binding.AbstractBinder.bind(AbstractBinder.java:251)
at net.java.dev.genesis.ui.swing.SwingBinder.bind(SwingBinder.java:253)
at genesishelloworld.MySwingView.(MySwingView.java:23)
at genesishelloworld.Main$1.run(Main.java:22)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:461)
at java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchThread.java:242)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:163)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:157)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:149)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:110)
Estou usando a mesma configuração descrita no tutorial. As mesmas versões de netbeans e genesis. Rodei até no netbeans 6 com a nova e a velha versão do genesis, mais ainda continua o mesmo erro.
O que eu posso fazer para resolver esse problema?
Se alguém puder me ajuda, ficarei muito grato.
Se o Michael Nascimento ( mister_m) também puder me dar uma força, ficarei grato.
Aléssio
Boa tarde a todos,
Estou querendo utilizar o framework Genesis em aplicações java/swing que irei desenvolver.
Porém está dando o seguinte erro:
Exception in thread “AWT-EventQueue-0″ java.lang.NoClassDefFoundError: org/apache/bsf/util/BSFEngineImpl
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:620)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:124)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:260)
at java.net.URLClassLoader.access$100(URLClassLoader.java:56)
at java.net.URLClassLoader$1.run(URLClassLoader.java:195)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:18
at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:26
at java.lang.ClassLoader.loadClass(ClassLoader.java:251)
at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:319)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:164)
at net.java.dev.genesis.script.bsf.BSFScriptFactory.class$(BSFScriptFactory.java:29)
at net.java.dev.genesis.script.bsf.BSFScriptFactory.(BSFScriptFactory.java:29)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:164)
at net.java.dev.genesis.reflection.ClassesCache.getClass(ClassesCache.java:44)
at net.java.dev.genesis.script.ScriptRegistry.newInstance(ScriptRegistry.java:111)
at net.java.dev.genesis.script.ScriptRegistry.initialize(ScriptRegistry.java:90)
at net.java.dev.genesis.script.ScriptRegistry.initialize(ScriptRegistry.java:75)
at net.java.dev.genesis.script.ScriptRegistry.getScript(ScriptRegistry.java:143)
at net.java.dev.genesis.script.ScriptRegistry.getScript(ScriptRegistry.java:159)
at net.java.dev.genesis.ui.metadata.DefaultFormMetadataFactory.getFormMetadata(DefaultFormMetadataFactory.java:40)
at net.java.dev.genesis.ui.controller.DefaultFormControllerFactory.getFormMetadata(DefaultFormControllerFactory.java:73)
at net.java.dev.genesis.ui.controller.DefaultFormControllerFactory.configure(DefaultFormControllerFactory.java:63)
at net.java.dev.genesis.ui.controller.DefaultFormControllerFactory.getFormController(DefaultFormControllerFactory.java:34)
at net.java.dev.genesis.ui.binding.AbstractBinder.getFormController(AbstractBinder.java:184)
at net.java.dev.genesis.ui.binding.AbstractBinder.(AbstractBinder.java:147)
at net.java.dev.genesis.ui.swing.SwingBinder.(SwingBinder.java:146)
at net.java.dev.genesis.ui.swing.SwingBinder.(SwingBinder.java:80)
at genesishelloworld.MySwingView.(MySwingView.java:1
at genesishelloworld.Main$1.run(Main.java:22)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:461)
at java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchThread.java:242)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:163)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:157)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:149)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:110)
- Já coloquei até essa lib ‘bsf’ que é do projeto jakarta, porém ocorreu outro erro.
ERRO:
Exception in thread “AWT-EventQueue-0″ java.lang.RuntimeException: The ‘messages.properties’ file was not found in classpath.
at net.java.dev.genesis.ui.UIUtils.getBundle(UIUtils.java:63)
at net.java.dev.genesis.ui.swing.SwingExceptionHandler.createStackTracePanel(SwingExceptionHandler.java:69)
…
- Dai inclui esse arquivo ‘messages.properties’, novamente outro erro:
07/03/2008 00:10:54 net.java.dev.genesis.ui.binding.AbstractDispatcherExceptionHandler handleException
SEVERE: Unexpected error occurred
java.lang.NullPointerException
at net.java.dev.genesis.script.javaxscript.JavaxScriptScriptContext.(JavaxScriptScriptContext.java:41)
at net.java.dev.genesis.script.javaxscript.JavaxScriptScript.newContext(JavaxScriptScript.java:41)
at net.java.dev.genesis.ui.controller.DefaultFormController.createScriptContext(DefaultFormController.java:154)
at net.java.dev.genesis.ui.controller.DefaultFormController.setup(DefaultFormController.java:136)
at net.java.dev.genesis.ui.binding.AbstractBinder.setupController(AbstractBinder.java:40
at net.java.dev.genesis.ui.binding.AbstractBinder.bind(AbstractBinder.java:251)
at net.java.dev.genesis.ui.swing.SwingBinder.bind(SwingBinder.java:253)
at genesishelloworld.MySwingView.(MySwingView.java:23)
at genesishelloworld.Main$1.run(Main.java:22)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:461)
at java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchThread.java:242)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:163)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:157)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:149)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:110)
Estou usando a mesma configuração descrita no tutorial. As mesmas versões de netbeans e genesis. Rodei até no netbeans 6 com a nova e a velha versão do genesis, mais ainda continua o mesmo erro.
O que eu posso fazer para resolver esse problema?
Me Dá uma ajuda!!!! Quero muito utilizar o Genesis em meus projetos mais tô apanhando com isso. Tô pensando em desistir.
Aléssio
Acho que vou largar esse Genesis de mão e mexer com JSR 295.
Aléssio,
Você está usando Java 6? Se for o 5, Provavelmente você deixou alguma dependência de lado. Dê uma olhada no arquivo da lista do genesis (http://genesis.dev.java.net) sobre Java 5 e suas dependências (se for o seu caso), pois há um post lá sobre isso (eu já passei por isso quando fui reproduzi o tutorial com Java 5). Não sei ao certo agora o link que possui uma tabela de features que vc vai usar versus libs que vc tem que por no seu projeto, mas nos post relacionados têm essa url com certeza.
Abraços!
Funcionou normal.
Valeu Yuri
(y)