28 grudnia 2006

Tworzenie aplikacji Java EE 5 z Eclipse IDE i GlassFish

Rozczytując się w specyfikacji JSR 220: Enterprise JavaBeans 3.0, a szczególnie w jej wersji uproszczonej (EJB 3.0 Simplified) postanowiłem sprawdzić, co do zaoferowania ma Eclipse IDE. Do tej pory do tworzenia oprogramowania korzystając z Java EE 5 jako zintegrowane środowisko programistyczne (ang. IDE - integrated development environment) zawsze wybierałem NetBeans IDE 5.5 ze względu na jego zaawansowanie we wsparciu dla tej specyfikacji (bądź służbowo IBM Rational Application Developer V7.0). Skoro wymagania Java EE 5 znacznie zmalały, tj. komponenty EJB mogą być (i zazwyczaj są) dystrybuowane jako pliki jar bez dodatkowych elementów (np. /META-INF/ejb-jar.xml) zmieniają się nasze wymagania dla zintegrowanych środowisk programistycznych. Nadeszła pora, aby sprawdzić, co można stworzyć w Java EE 5 korzystając z Eclipse IDE 3.3 i GlassFish v2.

Nie było lekko. Najwięcej czasu zajęło mi zestawienie działającego środowiska - Eclipse i wtyczki. Okazało się w międzyczasie, że nawet najnowsza wersja GlassFish'a ma swoje niedogodności, więc po 2 dniach ciężkich bojów udało mi się w końcu nie tylko zestawić środowisko, ale również opisać je w moim kolejnym artykule - Tworzenie aplikacji Java EE 5 z Eclipse IDE i GlassFish.

Chętnych zapraszam do lektury (i zgłaszania niedociągnięć, jeśli takie się pojawią).

Wracam tym samym do lektury specyfikacji EJB3 Simplified. Udało mi się, w międzyczasie, przeczytać kolejne 3 rozdziały o komponentach sesyjnych i sterowanych komunikatami, jednakże walka z Eclipse nie pozwoliła mi opisać moich wrażeń. W zasadzie nie ma nic nowego, o czym nie pisałbym poprzednio, więc wiele informacji powtórzyłoby się. Teraz, kiedy ujarzmiłem Eclipse czuję, że i najwyższa pora zakończyć lekturę specyfikacji w jej uproszczonej postaci. Najwyższa pora zabrać się za prawdziwy hard-core - EJB Core Contracts and Requirements! ;-)

8 komentarzy:

  1. Jestem pełen podziwu dla ludzi, którzy pracują i mają czas na blogi :)
    Mam pytanie co do artykułu - czy Sunowski server SJAS będzie podobnie konfigurowalny w eclipse? Wiem, że SJAS to prawie to samo co Glassflish, więc stąd moje pytanie.

    OdpowiedzUsuń
  2. Nie mam bladego pojęcia. Wierzę, jednak, że długo nie będę czekał na odpowiedź ;-)

    Jacek

    OdpowiedzUsuń
  3. Witam.

    Jacku, przeraża mnie Twoja produkcyjność w święta :/ przeraża bo sam jedyne co zrobiłem to zjadłem dużo ryby i barszczu z pierożkami.

    zaczynam mieć kompleksy. więc czas rozpocząć je zwalczać -> czytam Twoje artykuły a potem lecę dalej się uczyć do SCJP.

    gratuluję wytrwałości i pozdrawiam serdecznie :)

    OdpowiedzUsuń
  4. Hej Michał!

    Produkcyjność w święta? Nie żartuj. Sam jestem po dawce pierogów z kapustą i zupie śliwkowej, więc chciałem jedynie odsapnąć. Ot, w wolnej chwili, zestawiłem środowisko, które czychało na mnie od miesięcy. Jakoś więcej czasu się zrobiło przed końcem roku, ludziska oczekują prezentów, to im je daję ;-)

    p.s. Koniec roku, a ja już myślę o spotkaniu Warszawa JUG 9-tego. Koniecznie przyjdź! Będzie i o SCJP i o EJB3 i o Eclipse i o GlassFish. Może nawet znajdzie się miejsce dla Seama? Koniecznie przyjdź!

    Jacek

    OdpowiedzUsuń
  5. Witam wszystkich,

    artykuł super, dzięki niemu udało mi się po raz pierwszy uruchomić sesyjne EJB 3.0. Może to dziwne bo zdawałoby się że nic prostrzego, a jednak, z trudnościami jestem na ty :) Robiłem dużo rzeczy inaczej niż Jacek, bo potrzebowałem zaimplementować inną aplikację i pewnie z tąd problemy, w każdym razie robiąc "run on server" dostaje:

    Buildfile: C:\Eclipse 3.2.1\workspace\.metadata\.plugins\org.eclipse.jst.server.generic.core\serverdef\sunappsrv-ant.xml
    deploy.j2ee.ear:
    [jar] Building jar: C:\Eclipse 3.2.1\workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\GetLinked.ear
    tools:
    deploy:
    [exec] Usage: deploy [--terse=false] [--echo=false] [--interactive=true] [--host localhost] [--port 4848|4849] [--secure | -s] [--user admin_user] [--passwordfile file_name] [--virtualservers virtual_servers] [--contextroot context_root] [--force=true] [--precompilejsp=false] [--verify=false] [--name component_name] [--upload=true] [--retrieve local_dirpath] [--dbvendorname dbvendorname] [--createtables=true|false | --dropandcreatetables=true|false] [--uniquetablenames=true|false] [--deploymentplan deployment_plan] [--enabled=true] [--generatermistubs=false] [--availabilityenabled=false] [--libraries jar_file[(pathseparator)jar_file]*] [--target target(Default server)] filepath
    [exec] CLI019 Invalid number of operands. Number of operands should be equal to 1.
    deploy-url-message:
    [echo] Application Deployed at: http://127.0.0.1:8080/GetLinked
    BUILD SUCCESSFUL
    Total time: 1 second

    no ale wystarczy że zrobie deployment przez konsole admina i wszystko gra, także aplikacja sama w sobie ku mojemu wielkiemu zdziwieniu DZIAŁA, w odróżnieniu od aplikacji o którą męczę w komentarzach do artykułu "Pierwsza aplikacja z JSF 1.2 i EJB 3.0".

    Przy okazji małe pytanko - skoro EJB 3 to takie zwykłe szare POJO, tyle że z adnotacjami, to czemu nie developuje się ich "zwyczajnie", w ramach jednego projektu "dynamic web"?

    OdpowiedzUsuń
  6. Cześć!!!
    Na wstępie dodam tylko że mam na imię Paweł i Wszystkich pozdrawiam.
    A więc do rzeczy. Jeśli chodzi o problem w poście napisanym przez Mariusz Lipiński to u mnie pomogło przeniesienie worckspace z domyślnie ustawionego na c:\workspace. Natomiast pojawił się nowy problem. Po wybraniu opcji Run As->Run On Server dostaję komunikaty że jest ok:

    Buildfile: C:\workspace\.metadata\.plugins\org.eclipse.jst.server.generic.core\serverdef\sunappsrv-ant.xml
    deploy.j2ee.ear:
    [jar] Building jar: C:\workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\EgzaminyEAR.ear
    tools:
    deploy:
    [exec] Command deploy executed successfully.
    deploy-url-message:
    [echo] Application Deployed at: http://127.0.0.1:8080/EgzaminyEAR
    BUILD SUCCESSFUL
    Total time: 4 seconds


    ale mimo tego, że BUILD SUCCESSFUL Eclipse odpala przeglądarkę, próbuje otworzyć stronę http://localhost8138/EgzaminyWeb/
    i niestety komunikat:
    Akcja anulowana
    Program Internet Explorer nie może utworzyć łącza do żądanej strony sieci Web. Strona może być tymczasowo niedostępna.


    Czy wie ktoś może co jest nie tak ??

    OdpowiedzUsuń
  7. nie mam pojecia, jak udalo Ci sie uruchomic DI w webkontenerze na Glassfishu :( Glassfish uzywa przeciez tomcata 5 (a przynajmniej Glassfish v2 milestone 4 build 33), na ktorym sprawdzalem, a nie bylem dotad na tyle zdeterminowany, zeby zrobic testy na roznych wersjach...

    OdpowiedzUsuń
  8. Zbadalem problem dokladniej. Jest jeszcze dziwniej. Problem wystepuje tylko przy uzyciu strutsow (1.3.8) pod glassfishem. Jesli kod z @EJB umieszcze w akcji strutsowej, w stosie wywolan pojawia sie tomcat (???). Jest wkladam w/w wprost do serwleta, dziala ok, zgodnie z Twoim opisem. Dolaczam stacktrace (1). Poniewaz problem zaintrygowal mnie (wystepowanie w stosie tomcata!), lekko zmodyfikowalem kod doGet() serweta - po wyslaniu i zflushowaniu do klienta calego contentu, generuje RunTimeException (rowniez dolaczam stacktrace). I jestem w szoku - znow widac tomcata. Moze sie myle, ale wyglada na to, ze nie istnieje cos takiego, jak wlasny sunowski webserwer, a jest tylko sunowski wrapper dla starego dobrego tomcata.

    stacktrace 1:
    [#|2007-04-08T21:35:43.609+0200|SEVERE|sun-appserver9.1|javax.enterprise.system.container.web|_ThreadID=21;_ThreadName=httpSSLWorkerThread-8080-1;_RequestID=fca60ea6-2c37-4a89-8933-691801e10271;|StandardWrapperValve[ActionServlet]: PWC1406: Servlet.service() for servlet ActionServlet threw exception
    java.lang.NullPointerException
    at pl.xxx.yyy.test3.web.action.Hello2Action.doExecute(Hello2Action.java:37)
    at pl.xxx.yyy.test3.web.action.AbstractAction.execute(AbstractAction.java:36)
    at org.apache.struts.chain.commands.servlet.ExecuteAction.execute(ExecuteAction.java:58)
    at org.apache.struts.chain.commands.AbstractExecuteAction.execute(AbstractExecuteAction.java:67)
    at org.apache.struts.chain.commands.ActionCommandBase.execute(ActionCommandBase.java:51)
    at org.apache.commons.chain.impl.ChainBase.execute(ChainBase.java:190)
    at org.apache.commons.chain.generic.LookupCommand.execute(LookupCommand.java:304)
    at org.apache.commons.chain.impl.ChainBase.execute(ChainBase.java:190)
    at org.apache.struts.chain.ComposableRequestProcessor.process(ComposableRequestProcessor.java:283)
    at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1913)
    at org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:449)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:707)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:820)
    at org.apache.catalina.core.ApplicationFilterChain.servletService(ApplicationFilterChain.java:398)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:277)
    at org.apache.catalina.core.StandardContextValve.invokeInternal(StandardContextValve.java:255)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:188)
    at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:611)
    at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:564)
    at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:81)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:207)
    at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:611)
    at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:564)
    at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:558)
    at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:1067)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:137)
    at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:611)
    at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:564)
    at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:558)
    at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:1067)
    at org.apache.coyote.tomcat5.CoyoteAdapter.service(CoyoteAdapter.java:249)
    at com.sun.enterprise.web.connector.grizzly.DefaultProcessorTask.invokeAdapter(DefaultProcessorTask.java:618)
    at com.sun.enterprise.web.connector.grizzly.DefaultProcessorTask.doProcess(DefaultProcessorTask.java:549)
    at com.sun.enterprise.web.connector.grizzly.DefaultProcessorTask.process(DefaultProcessorTask.java:790)
    at com.sun.enterprise.web.connector.grizzly.DefaultReadTask.executeProcessorTask(DefaultReadTask.java:326)
    at com.sun.enterprise.web.connector.grizzly.DefaultReadTask.doTask(DefaultReadTask.java:248)
    at com.sun.enterprise.web.connector.grizzly.DefaultReadTask.doTask(DefaultReadTask.java:199)
    at com.sun.enterprise.web.portunif.PortUnificationPipeline$PUTask.doTask(PortUnificationPipeline.java:328)
    at com.sun.enterprise.web.connector.grizzly.TaskBase.run(TaskBase.java:252)
    at com.sun.enterprise.web.connector.grizzly.ssl.SSLWorkerThread.run(SSLWorkerThread.java:93)
    |#]

    stacktrace 2:
    [#|2007-04-08T21:51:15.046+0200|SEVERE|sun-appserver9.1|javax.enterprise.system.container.web|_ThreadID=18;_ThreadName=httpSSLWorkerThread-8080-0;_RequestID=b94e1d65-8671-4695-a49b-acecce1f9875;|StandardWrapperValve[HelloServlet]: PWC1406: Servlet.service() for servlet HelloServlet threw exception
    java.lang.RuntimeException: wymuszony wyjatek!
    at pl.xxx.yyy.test3.web.servlet.HelloServlet.doGet(HelloServlet.java:44)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:707)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:820)
    at org.apache.catalina.core.ApplicationFilterChain.servletService(ApplicationFilterChain.java:398)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:277)
    at org.apache.catalina.core.StandardContextValve.invokeInternal(StandardContextValve.java:255)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:188)
    at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:611)
    at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:564)
    at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:81)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:207)
    at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:611)
    at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:564)
    at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:558)
    at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:1067)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:137)
    at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:611)
    at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:564)
    at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:558)
    at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:1067)
    at org.apache.coyote.tomcat5.CoyoteAdapter.service(CoyoteAdapter.java:249)
    at com.sun.enterprise.web.connector.grizzly.DefaultProcessorTask.invokeAdapter(DefaultProcessorTask.java:618)
    at com.sun.enterprise.web.connector.grizzly.DefaultProcessorTask.doProcess(DefaultProcessorTask.java:549)
    at com.sun.enterprise.web.connector.grizzly.DefaultProcessorTask.process(DefaultProcessorTask.java:790)
    at com.sun.enterprise.web.connector.grizzly.DefaultReadTask.executeProcessorTask(DefaultReadTask.java:326)
    at com.sun.enterprise.web.connector.grizzly.DefaultReadTask.doTask(DefaultReadTask.java:248)
    at com.sun.enterprise.web.connector.grizzly.DefaultReadTask.doTask(DefaultReadTask.java:199)
    at com.sun.enterprise.web.portunif.PortUnificationPipeline$PUTask.doTask(PortUnificationPipeline.java:328)
    at com.sun.enterprise.web.connector.grizzly.TaskBase.run(TaskBase.java:252)
    at com.sun.enterprise.web.connector.grizzly.ssl.SSLWorkerThread.run(SSLWorkerThread.java:93)
    |#]

    OdpowiedzUsuń