Michał Mech – W stronę Java

Zapiski programisty

Archiwum miesięczne: Styczeń, 2009

Wstrzykiwanie zależności – serce Seam’a

Ilość komentarzy: 4

We wstępie do dokumentacji autorzy frameworka JBoss Seam piszą, że jednym ze wzorców, którym hołdowali budując Seam’a jest wstrzykiwanie zależności (ang. Dependency Injection, DI). Wzorzec DI został nie tylko zastosowany w Seam’ie ale również rozszerzony i nazwany Bijection.

Bijection od DI różnią trzy cechy:

  1. contextual – wstrzykiwane do komponentów zależności są wybierane z odpowiedniego kontekstu w jakim występują. Seam posiada kilka kontekstów i zanim wstrzyknie zależność do komponentu szuka jej w odpowiednim miejscu;
  2. bidirectional – mechanizm Bijection pozwala nie tylko na wstrzykiwanie zależności do komponentów ale również na wystrzeliwanie ich na zewnątrz do dowolnego kontekstu;
  3. dynamic – twórcy Seam’a gwarantują, że mechanizm Bijection jest bardziej elastyczny.

Autorzy Seam’a wyżej cenią adnotacje niż konfigurację za pomocą XML‘a, stąd właśnie one posłużą nam informowaniu kontenera o zależnościach między komponentami i jak powinny być one wstrzykiwane i wystrzeliwane.

Za mechanizm bijection odpowiedzialne są dwie adnotacje: @In i @Out. Lecz, żeby dobrze je zrozumieć zacznijmy od prostej adnotacji @Name. Za pomocą @Name możemy nadać nazwę dowolnemu komponentowi w aplikacji. Nazwa musi być unikalna dla całej aplikacji. Krótki przykład zastosowania:

@Entity
@Name("article")
public class Article implements Serializable {

    private long id;

    private String title;

    ...
}

Jeśli jakiś komponent (lub nawet JSF) odwoła się do obiektu o nazwie article, Seam przeszuka obowiązujący kontekst i dostarczy zależność. W powyższym przykładzie mamy jeszcze adnotację @Entity, która w opisywanym zagadnieniu nie gra większej roli. Wskazuje ona, że klasa jest encją reprezentującą trwały obiekt w bazie danych.

Przejdźmy teraz do wstrzykiwania i wystrzeliwania zależności. Oto komponent sesyjny (ang. Session Bean), który wykona dla nas trochę logiki biznesowej:

@Stateless
@Name("paper")
public class PaperAction implements Paper {
    @In @Out
    private Article article;

    @Out
    private List lt;Articlegt; articles;

    @PersistenceContext
    private EntityManager em;

    public String addArticle () {
        em.persist (article);
        article = new Article ();

        articles = em.createQuery("select a from Article a")
            .getResultList();

        return null;
    }
}

Adnotacja @Stateless informuje nas, że komponent jest bezstanowy co oznacza, że będzie tworzony od nowa za każdym razem kiedy kontener zostanie poproszony o jego dostarczenie. Nazwą komponentu (określoną przez adnotację @Name) jest paper.

Skupmy się teraz na zależnościach. Widzimy przy polu article adnotację @In. Oznacza to, że zanim zostanie wykonana jakakolwiek metoda komponentu, kontener ma wstrzyknąć do tego pola zależność o nazwie article. Jeśli chcemy do pola article wstrzyknąć zależność o innej nazwie niż pole powinniśmy do adnotacji dodać parametr value, np.: @In(value=”favoriteArticle”) (Adnotacja @In oraz @Out posiada kilka innych prostych parametrów. Polecam zapoznanie się z nimi.) Oczywiście komponent może zawierać dowolną ilość elementów z adnotacją @In. Pamiętać należy o tym, że za każdym razem będą one wstrzykiwane.

W dalszej kolejności widzimy adnotacje @Out, opisujące pola article oraz articles. Oznaczają one, że po zakończeniu pracy komponentu kontener powinien pobrać zawartość tych oraz umieścić w odpowiednich kontekstach. Obiekty te, będą teraz dostępne dla innych komponentów. Zostaną wystrzelone na zewnątrz komponentu.

Komponent paper zawiera jeszcze jedną adnotację: @PersistenceContext. Informuje ona, że do opisanego za jej pomocą pola kontener ma wstrzyknąć managera encji. Podobnie jak w przypadku @Entity nie jest to w tej chwili meritum sprawy.

Jedyna metoda komponentu addArticle() ma za zadanie zapisać artykuł znajdujący się polu article do bazy danych a później pobrać wszystkie artykuły i zapisać je w polu articles.

Na samym końcu zerknijmy na fragment widoku (JSF), który mógłby służyć do podania tytułu artykułu oraz miałby za zadanie wyświetlić wszystkie inne tytuły artykułów:

<h:form>
    Podaj tytuł artykułu:
    <h:inputText value="#{article.title}"/>
    <h:commandButton type="submit" value="Zapisz" action="#{paper.addArticle}" />
</h:form>

<h:dataTable value="#{articles}" var="article">
    <h:column>
        <h:outputText value="#{article.title}"/>
    </h:column>
</h:dataTable>

A teraz co się stanie kiedy klikniemy Zapisz:

  1. Seam postara się odnaleźć dwa komponenty: article oraz paper. Pierwszy jest wymagany ponieważ do komponentu o tej nazwie, a dokładniej do jego pola title, ma być zapisany tytuł wpisany w pole tekstowe. Drugi komponent jest poszukiwany aby wykonać jego metodę addArticle();
  2. Oba komponenty zostaną utworzone ponieważ nie ma ich w żadnym kontekście. Article jest encją, w której zapiszemy dane z formularza a paper jest komponentem bezstanowym, który wykona trochę logiki;
  3. Zostanie wykonana akcja a po jej zakończeniu pola oznaczone za pomocą @Out zostaną wystrzelone do kontenera, dzięki czemu będą dostępne dla innych komponentów oraz dla widoku.

Zastosowana w widoku notacja #{…} to Expression Language (EL), na który polecam zwrócić uwagę ponieważ jest wykorzystywany w Seam’ie niemal wszędzie gdzie się da.

Na koniec dodatkowa, ważna informacja. Za pomocą @In oraz @Out możemy adnotować również metody aby osiągnąć identyczny efekt jak w powyższym, przykładowym komponencie. Oto przykład jak wyglądałby komponent paper, gdybym adnotacji użył do opisania metod:

@Stateless
@Name("paper")
public class PaperAction {
    private Article article;

    private List lt;Articlegt; articles;

    @PersistenceContext
    private EntityManager em;

    public String addArticle () {
        em.persist (article);
        article = new Article ();

        articles = em.createQuery("select a from Article a")
            .getResultList();

        return null;
    }

    @In
    public function void setArticle(Article article) {
        this.article = article;
    }

    @Out
    public function Article getArticle() {
        return article;
    }

    @Out
    public function List lt;Articlegt; getArticles() {
        return articles;
    }
}

Opublikowany przez Michał Mech

2009-01-25 o 16:49:00

JBoss Tools – wsparcie dla Seam’a w Eclipse

Ilość komentarzy: 4

W poprzednim poście utworzyłem pierwszy projekt (HelloWorld) za pomocą seam-gen. Spróbujmy teraz skonfigurować sobie środowisko dla tego oraz innych projektów Seam‘owych.

Firma JBoss przyszła nam z pomocą i stworzyła JBoss Tools, czyli zestaw narzędzi dla Eclipse, które wspomagają pracę z frameworkiem JBoss Seam. Najszybszy sposób instalacji narzędzi wiedzie nas przez Update Manager’a, gdzie podajemy odpowiedni link i instalujemy wybrane narzędzia. Zestaw JBoss Tools poza wsparcie dla Seam’a zawiera narzędzia pomocne przy pracy między innymi z jBPM, Hibernate, Struts. Jeśli mamy już zainstalowany pakiet JBoss Tools, zabieramy się do pracy.

HelloWorld in Package ExplorerW pierwszej kolejności importujemy projekt do Eclipse’a. Wybieramy File > Import > Existing Projects into Workspace i szukamy projektu. Po poprawnym imporcie projekt HelloWorld powinien pojawić się w naszym eksploratorze paczek (ang. Package Explorer).

Następnie przełączamy perspektywę na Seam i przechodzimy do konfiguracji projektu. W sekcji Seam Settings w pierwszej kolejności zaznaczamy Seam support dalej przechodzimy do konfiguracji środowiska uruchomieniowego JBoss Seam – Seam runtime. W tym celu klikamy Add i w oknie, które się pojawi podajemy folder domowy Seam’a (C:\Program Files\JBoss-seam-2.1.1.GA), nazwę konfiguracji (np.: Seam runtime) oraz wersję frameworka (2.0).

W dalszej kolejności dodajemy i konfigurujemy połączenie z bazą danych projektu (Connection profile). Klikamy New… i w okienku podajemy wszystkie wymagane dane takie jak nazwę połączenia (np.: hello database) typ bazy, dane do połączenia, ścieżkę do sterownika, e.t.c. Poniżej prezentuję zrzut ekranu ukazujący ustawienia dla mojego projektu.

HelloWorld settings

Pakiet narzędzi JBoss Tools pozwala również na utworzenie projektu bez korzystania z seam-gen‘a. Wybieramy File > New > Seam Web Project. Kreator przeprowadzi nas przez proces konfiguracji projektu podczas, którego możemy utworzyć konfigurację serwera, połączenia do bazy danych i środowiska uruchomieniowego.

Dzięki JBoss Tools mamy możliwość szybkiego tworzenia encji, akcji, konwersacji, e.t.c. Narzędzie to jest między innymi nakładką na seam-gen’a. Ponadto dostajemy kilka dodatkowych edytorów (np.: dla facelets) oraz ładne widoki deskryptorów. Postaram się dostarczać więcej informacji wraz z poznawaniem JBoss Tools’ów.

Opublikowany przez Michał Mech

2009-01-23 o 20:47:00

JBoss Seam – pierwszy projekt

jeden komentarz

Skoro już udało mi się zainstalować Seam’a czas na pierwszy projekt.

JBoss Seam dostarcza nam narzędzie seam-gen, które pozwala między innymi na utworzenie szkieletu aplikacji (ang. scaffolding) oraz reverse engineering aplikacji dla istniejącej już bazy danych. Skorzystamy z tego narzędzia aby utworzyć pierwszy projekt w JBoss Seam.

W linii komend wpisujemy:

seam setup

Aby polecenie to zadziałało lokalizacja, w której jest Seam powinna być dodana do zmiennej środowiskowej Path. Po wywołaniu polecenia uruchomiony zostanie konfigurator środowiska oraz projektu. Na każde pytanie konfiguratora odpowiadamy podając wymagane przez niego dane. Jeśli odpowiada nam zaproponowana wartość (podana w nawiasach kwadratowych) wciskamy Enter. Pojawi się komunikat:

SEAM_HOME: C:\Program Files\JBoss-seam-2.1.1.GA
Using seam-gen sources from: C:\Program Files\JBoss-seam-2.1.1.GA\seam-gen
Buildfile: C:\Program Files\JBoss-seam-2.1.1.GA\seam-gen\build.xml

init:

Oraz rozpocznie proces konfigurowania projektu.

setup:
[echo] Welcome to seam-gen :-)
[input] Enter your Java project workspace (the directory that contains your Seam projects) [F:/workspace] [F:/workspace]

Wybieramy ścieżkę do katalogu gdzie znajdują się nasze projekty. U mnie jest to workspace Eclipse‘a: F:/workspace. Projekt zostanie później utworzony w podanej lokalizacji.

[input] Enter your JBoss AS home directory [C:/Program Files/JBoss-4.2.2.GA] [C:/Program Files/JBoss-4.2.2.GA]

Podajemy ścieżkę do katalogu domowego serwera JBoss. U mnie jest to: C:/Program Files/JBoss-4.2.2.GA

[input] Enter the project name [HelloWorld [HelloWorld]

Podajemy nazwę projektu. Jak inaczej nazwać pierwszy projekt, jeśli nie HelloWorld

[echo] Accepted project name as: HelloWorld

[input] Do you want to use ICEfaces instead of RichFaces [n] (y, [n])

Wybieramy do budowy widoku będzie używana biblioteka ICEfaces zamiast standardowego rozwiązania w Seamie jakim jest RichFaces? Domyślna opcja to n, czyli pozostajemy przy RichFaces.

[input] skipping input as property icefaces.home.new has already been set.
[input] Select a RichFaces skin [deepMarine] (blueSky, classic, [deepMarine], DEFAULT, emeraldTown, japanCherry, ruby, wine)

Wybieramy styl jaki będzie użyty dla RichFaces. Mamy kilka do wyboru, ja zdecydowałem się na domyślną wartość deepMarine

[input] Is this project deployed as an EAR (with EJB components) or a WAR (w ith no EJB support) [ear] ([ear], war)

Wybieramy sposób pakowania projektu. Wybieramy pomiędzy domyślną wartością ear a war. Zawierzę dokumentacji Seam’a i zdecyduję się na domyślną wartość ear. Dokumentacja informuje nas, że jeśli posiadamy serwer aplikacji zgodny z EJB 3.0 (JBoss taki jest) oraz posiadamy Javę EE 5 to powinniśmy zdecydować się na ear

[input] Enter the Java package name for your session beans [pl.michalmech.helloworld] [pl.michalmech.helloworld]

Podajemy nazwę paczki w aplikacji dla naszych beanów odpowiedzialnych za logikę biznesową, czyli dla Session Beans. Ja proponuję: pl.michalmech.helloworld

[input] Enter the Java package name for your entity beans [pl.michalmech.helloworld.model] [pl.michalmech.helloworld.model]

Podajemy nazwę paczki dla encji, reprezentujących dane w bazie, czyli dla Entity Beans. Proponuję: pl.michalmech.helloworld.model

[input] Enter the Java package name for your test cases [pl.michalmech.helloworld.test] [pl.michalmech.helloworld.test]

Podajemy nazwę paczki dla testów aplikacji. Niech będzie to pl.michalmech.helloworld.test

[input] What kind of database are you using? [hsql] ([hsql], mysql, oracle, postgres, mssql, db2, sybase, enterprisedb, h2)

Wybieramy typ bazy danych. Aplikacja HelloWorld nie będzie jej wymagała więc niech będzie to domyślna baza HSQL

[input] Enter the Hibernate dialect for your database [org.hibernate.dialect.HSQLDialect] [org.hibernate.dialect.HSQLDialect]

Wybieramy dialekt Hibernate‘a dla wybranej bazy danych. Dla HSQL’a jest to org.hibernate.dialect.HSQLDialect

code[input] Enter the filesystem path to the JDBC driver jar [C:\Program Files\JBoss-seam-2.1.1.GA/lib/hsqldb.jar] [C:\Program Files\JBoss-seam-2.1.1.GA/lib/hsqldb.jar]

Podajemy lokalizację sterownika, spakowanego do pliku JAR, dla JDBC, obsługującego wybraną przez nas bazę. U mnie jest to C:\Program Files\JBoss-seam-2.1.1.GA/lib/hsqldb.jar

code[input] Enter JDBC driver class for your database [org.hsqldb.jdbcDriver] [org.hsqldb.jdbcDriver]

Podajemy nazwę klasy sterownika dla JDBC, obsługującego wybraną przez nas bazę. W mojej sytuacji jest to org.hsqldb.jdbcDriver

[input] Enter the JDBC URL for your database [jdbc:hsqldb:.] [jdbc:hsqldb:.]

Podajemy URL do bazy danych: jdbc:hsqldb:.

[input] Enter database username [sa] [sa]

Użytkownik bazy danych: sa

[input] Enter database password [] []

Hasło użytkownika bazy danych: (brak hasła)

[input] Enter the database schema name (it is OK to leave this blank) [] []

Schemat bazy. Skoro piszą “it is OK to leave this blank” to ja jestem na OK.

[input] Enter the database catalog name (it is OK to leave this blank) [] []

Katalog bazy. Skoro piszą “it is OK to leave this blank” to ja jestem na OK.

[input] Are you working with tables that already exist in the database? [n] (y, [n])

Czy pracujemy z bazą danych, która już posiada tabele z danymi? Nie, czyli opcja: n

[input] Do you want to drop and recreate the database tables and data in import.sql each time you deploy? [n] (y, [n])

Czy jeśli rozmieszczamy aplikację na serwerze (ang. deploy) to baza danych ma zostać wyczyszczona i wykonana ma być zawartość pliku import.sql. Nie: n

[delete] Deleting: C:\Program Files\JBoss-seam-2.1.1.GA\seam-gen\build.properties
[propertyfile] Creating new property file: C:\Program Files\JBoss-seam-2.1.1.GA\seam-gen\build.properties
[echo] Installing JDBC driver jar to JBoss AS
[echo] Type 'seam create-project' to create the new project

BUILD SUCCESSFUL
Total time: 18 seconds

Jeden z ostatnich komunikatów informuje nas, że konfiguracja została zapisana w pliku C:\Program Files\JBoss-seam-2.1.1.GA\seam-gen\build.properties. Możemy zawsze go zmienić jeśli nie chcemy ponownie uruchamiać konfiguratora.

Zgodnie z kolejną informacją powinniśmy teraz wykonać instrukcję seam create-project. W pliku seam-gen\README, w folderze domowym Seam’a próżno szukać informacji o poleceniu seam new-project choć dokumentacja właśnie to polecenie zaleca wykonać. Jaka jest różnica? Prawdopodobnie żadna i jedno polecenie jest aliasem drugiego. Wykonajmy:

seam create-project

Wynik działania polecenia to:

C:\Program Files\JBoss-seam-2.1.1.GA>seam create-project
SEAM_HOME: C:\Program Files\JBoss-seam-2.1.1.GA
Using seam-gen sources from: C:\Program Files\JBoss-seam-2.1.1.GA\seam-gen
Buildfile: C:\Program Files\JBoss-seam-2.1.1.GA\seam-gen\build.xml

init:

init-properties:
[echo] C:/Program Files/JBoss-4.2.2.GA

validate-workspace:

validate-project:

icefaces-staging-copy:

initcopy:

initpoms:
[echo] Setting up dependencies
[copy] Copying 1 file to C:\Program Files\JBoss-seam-2.1.1.GA\classes\poms
[artifact:install] [INFO] Installing C:\Program Files\JBoss-seam-2.1.1.GA\classes\poms\root.pom to C:\Documents and Settings\Mike\.m2\repository\org\jboss\seam\root\2.1.1.GA\root-2.1.1.GA.pom
[copy] Copying 1 file to C:\Program Files\JBoss-seam-2.1.1.GA\classes\poms[artifact:install] [INFO] Installing C:\Program Files\JBoss-seam-2.1.1.GA\classes\poms\parent.pom to C:\Documents and Settings\Mike\.m2\repository\org\jboss\seam\parent\2.1.1.GA\parent-2.1.1.GA.pom
[copy] Copying 1 file to C:\Program Files\JBoss-seam-2.1.1.GA\classes\poms
[copy] Copying 1 file to C:\Program Files\JBoss-seam-2.1.1.GA\classes\poms
[copy] Copying 1 file to C:\Program Files\JBoss-seam-2.1.1.GA\classes\poms
[copy] Copying 1 file to C:\Program Files\JBoss-seam-2.1.1.GA\classes\poms
[copy] Copying 1 file to C:\Program Files\JBoss-seam-2.1.1.GA\classes\poms
[copy] Copying 1 file to C:\Program Files\JBoss-seam-2.1.1.GA\classes\poms
[copy] Copying 1 file to C:\Program Files\JBoss-seam-2.1.1.GA\classes\poms
[copy] Copying 1 file to C:\Program Files\JBoss-seam-2.1.1.GA\classes\poms
[copy] Copying 1 file to C:\Program Files\JBoss-seam-2.1.1.GA\classes\poms
[copy] Copying 1 file to C:\Program Files\JBoss-seam-2.1.1.GA\classes\poms
[copy] Copying 1 file to C:\Program Files\JBoss-seam-2.1.1.GA\classes\poms
[copy] Copying 1 file to C:\Program Files\JBoss-seam-2.1.1.GA\classes\poms
[copy] Copying 1 file to C:\Program Files\JBoss-seam-2.1.1.GA\classes\poms
[copy] Copying 1 file to C:\Program Files\JBoss-seam-2.1.1.GA\classes\poms[copy] Copying 1 file to C:\Program Files\JBoss-seam-2.1.1.GA\classes\poms

copyseam:

copyseamdependencies:

copyjbossembedded:

copy-icefaces-home:

copy-icefaces-maven:

copy-lib:
[echo] Copying Seam and dependencies to the F:/workspace/HelloWorld/lib directory...
[copy] Copying 120 files to F:\workspace\HelloWorld\lib
[copy] Copied 5 empty directories to 2 empty directories under F:\workspace\HelloWorld\lib
[echo] Copying JBoss Embedded configuration to the F:/workspace/HelloWorld/ bootstrap directory...
[copy] Copying 30 files to F:\workspace\HelloWorld\bootstrap

file-copy-war:

file-copy-ear:
[echo] Copying resources needed for EAR deployment to the F:/workspace/HelloWorld/resources directory...
[copy] Copying 1 file to F:\workspace\HelloWorld\resources\WEB-INF
[copy] Copying 1 file to F:\workspace\HelloWorld
[copy] Copying 1 file to F:\workspace\HelloWorld
[copy] Copying 1 file to F:\workspace\HelloWorld
[copy] Copying 1 file to F:\workspace\HelloWorld
[copy] Copying 7 files to F:\workspace\HelloWorld\resources

setup-filters:

file-copy:
[copy] Copying 1 file to F:\workspace\HelloWorld
[copy] Copying 3 files to F:\workspace\HelloWorld\resources
[copy] Copying 11 files to F:\workspace\HelloWorld\resources
[copy] Copying 4 files to F:\workspace\HelloWorld
[copy] Copying 1 file to F:\workspace\HelloWorld
[copy] Copying 1 file to F:\workspace\HelloWorld
[copy] Copying 1 file to F:\workspace\HelloWorld
[copy] Copying 1 file to F:\workspace\HelloWorld\.settings
[copy] Copying 1 file to F:\workspace\HelloWorld
[copy] Copying 1 file to F:\workspace\HelloWorld
[mkdir] Created dir: F:\workspace\HelloWorld\nbproject
[copy] Copying 3 files to F:\workspace\HelloWorld\nbproject
[copy] Copying 1 file to F:\workspace\HelloWorld\resources
[copy] Copying 1 file to F:\workspace\HelloWorld\resources
[copy] Copying 1 file to F:\workspace\HelloWorld\resources
[copy] Copying 1 file to F:\workspace\HelloWorld\resources
[copy] Copying 1 file to F:\workspace\HelloWorld\resources
[copy] Copying 1 file to F:\workspace\HelloWorld\resources
[copy] Copying 12 files to F:\workspace\HelloWorld\view
[copy] Copying 9 files to F:\workspace\HelloWorld\view
[copy] Copying 1 file to F:\workspace\HelloWorld\src\hot\pl\michalmech\helloworld
[copy] Copying 3 files to F:\workspace\HelloWorld
[mkdir] Created dir: F:\workspace\HelloWorld\src\main\pl\michalmech\helloworld\model
[mkdir] Created dir: F:\workspace\HelloWorld\src\test\pl\michalmech\helloworld\test
[copy] Copying 1 file to F:\workspace\HelloWorld\src\test

create-project:
[echo] A new Seam project named 'HelloWorld' was created in the F:/workspace directory
[echo] Type 'seam explode' and go to http://localhost:8080/HelloWorld
[echo] Eclipse Users: Import the project using File  Import...  Existing Projects into Workspace, set the root directory to F:/workspace, then select the project named HelloWorld
[echo] NetBeans Users: Open the project using File  Open project... and select the project folder F:/workspace/HelloWorld
[echo] IDEA Users: Open the project using File  Open project... and select the file F:/workspace/HelloWorld/HelloWorld.ipr

BUILD SUCCESSFUL
Total time: 17 seconds

Projekt został poprawnie utworzony. JBoss Seam był na tyle uprzejmy, że przygotował projekt tak by można było go zaimportować do dowolnego z trzech najpopularniejszych IDE dla Javy (Eclipse, NetBeans, IntelliJ IDEA).

Pozostało nam skompilować, spakować projekt i rozmieścić na serwerze (ang. deploy). Wykonujemy polecenie sugerowane nam przez seam-gen’a:

seam explode

Wynikiem powinno być:

SEAM_HOME: C:\Program Files\JBoss-seam-2.1.1.GA
Using seam-gen sources from: C:\Program Files\JBoss-seam-2.1.1.GA\seam-gen
Buildfile: C:\Program Files\JBoss-seam-2.1.1.GA\seam-gen\build.xml

init:

init-properties:
[echo] C:/Program Files/JBoss-4.2.2.GA

validate-workspace:

validate-project:

explode:
[echo] Deploying project 'HelloWorld' to JBoss AS as an exploded directory

init:
[mkdir] Created dir: F:\workspace\HelloWorld\exploded-archives\HelloWorld.ear\HelloWorld.jar
[mkdir] Created dir: F:\workspace\HelloWorld\exploded-archives\HelloWorld.ear\HelloWorld.war
[mkdir] Created dir: F:\workspace\HelloWorld\dist

groovy.compile:

groovy.copy:

compile:
[javac] Compiling 1 source file to F:\workspace\HelloWorld\exploded-archives\HelloWorld.ear\HelloWorld.jar

copyclasses:

jar:
[copy] Copying 2 files to F:\workspace\HelloWorld\exploded-archives\HelloWorld.ear\HelloWorld.jar
[copy] Copying 2 files to F:\workspace\HelloWorld\exploded-archives\HelloWorld.ear\HelloWorld.jar\META-INF
[copy] Copying 1 file to F:\workspace\HelloWorld\exploded-archives\HelloWorld.ear\HelloWorld.jar\META-INF
[copy] Copying 1 file to F:\workspace\HelloWorld\exploded-archives\HelloWorld.ear\HelloWorld.jar

war:
[copy] Copying 21 files to F:\workspace\HelloWorld\exploded-archives\HelloWorld.ear\HelloWorld.war
[copy] Copying 1 file to F:\workspace\HelloWorld\exploded-archives\HelloWorld.ear\HelloWorld.war\WEB-INF\classes
[copy] Copying 4 files to F:\workspace\HelloWorld\exploded-archives\HelloWorld.ear\HelloWorld.war\WEB-INF
[copy] Copying 13 files to F:\workspace\HelloWorld\exploded-archives\HelloWorld.ear\HelloWorld.war\WEB-INF\lib
[copy] Copying 1 file to F:\workspace\HelloWorld\exploded-archives\HelloWorld.ear\HelloWorld.war\WEB-INF\classes
[copy] Copying 6 files to F:\workspace\HelloWorld\exploded-archives\HelloWorld.ear\HelloWorld.war\WEB-INF\classes

ear:
[copy] Copying 1 file to F:\workspace\HelloWorld\exploded-archives\HelloWorld.ear
[copy] Copying 11 files to F:\workspace\HelloWorld\exploded-archives\HelloWorld.ear\lib
[copy] Copying 2 files to F:\workspace\HelloWorld\exploded-archives\HelloWorld.ear\META-INF

stage:

datasource:
[copy] Copying 1 file to C:\Program Files\JBoss-4.2.2.GA\server\default\deploy

explode:
[copy] Copying 67 files to C:\Program Files\JBoss-4.2.2.GA\server\default\deploy\HelloWorld.ear

BUILD SUCCESSFUL
Total time: 6 seconds

Sprawdźmy rezultat w przeglądarce. Wpisujemy adres http://localhost:8080/HelloWorld i cieszymy oczy (należy pamiętać o tym by serwer JBoss był uruchomiony) pierwszą aplikacją, którą “napisaliśmy” bazując na szkielecie JBoss Seam.

Seam new project

Opublikowany przez Michał Mech

2009-01-18 o 22:54:00

Instalacja frameworka JBoss Seam

Ilość komentarzy: 11

Pierwszą czynnością wymaganą do nauki frameworka JBoss Seam jest oczywiście jego instalacja. Framework to tylko narzędzie służące do budowania aplikacji, które przecież działają w jakimś środowisku, zaczniemy więc od instalacji środowiska, zarówno uruchomieniowego jak i środowiska programistycznego (Integrated Development Environment). Ja wybrałem serwer a JBoss, jako serwer aplikacji oraz Eclipse jako moje IDE. Instalację Eclipse’a pominę, skupię się na instalacji JBoss’a oraz JBoss Seam’a. Wszystkie opisy dotyczą systemu Windows.

Instalację serwera JBoss przeprowadzamy za pomocą JEMS Installer. Jest to narzędzie, służące do instalacji wszelkich produktów firmy JBoss. Aby uruchomić instalator wystarczy pobrać i uruchomić najnowszy plik JAR (w chwili pisania tego tekstu jest to plik 1.2.1.CR4.jar) lub uruchomić go poprzez Java Web Start.

JBoss AS Install (1)Pierwszym etapem instalacji jest ekran powitalny, na którym śmiało klikamy Next. Proces instalacji jest rozłożony na 17 ekranów i na niemal wszystkich zachowujemy domyślne, zaznaczone opcje i klikamy Next.

Jedynym odstępstwem od “domyślna wartość + Next” jakie poczyniłem to miejscem instalacji serwera uczyniłem lokalizację C:Program FilesJBoss-4.2.2.GA.

Po instalacji serwera JBoss należy ustawić zmienną środowiskową JBOSS_HOME. Jak łatwo się domyślić powinna to być ścieżka wskazująca na zainstalowany serwer. U mnie jest to C:Program FilesJBoss-4.2.2.GA. Na tym etapie warto ustawić zmienną środowiskową JAVA_HOME i jako wartość podać lokalizacją, w której zainstalowaliśmy Javę. U mnie zmienna ta ma wartość C:Program FilesJavajdk1.6.0_07

Pozostaje nam teraz uruchomić serwer wykonując polecenie:

C:\Program Files\JBoss-4.2.2.GA\bin>run

Po uruchomieniu serwera wpisujemy w przeglądarce adres http://localhost:8080. Powinniśmy ujrzeć stronę, której zrzut prezentuję obok.JBoss start page

Kolejnym etapem jest instalacja frameworka JBoss Seam. Słowo instalacja jest tutaj mocno nad wyraz ponieważ cały proces polega na pobraniu archiwum (w chwili pisania tego tekstu najnowszym plikiem był jboss-seam-2.1.1.GA.zip) i rozpakowaniu jego zawartości w wybranym przez nas miejscu. Ja wybrałem lokalizację C:Program FilesJBoss-seam-2.1.1.GA.

Do pracy będzie potrzebny również Anta. Pobieramy wersję 1.7.0 (w chwili pisania tego tekstu najnowszy jest jest to najnowsza wersja akceptowana przez Seam’a). Odradzam instalowanie wersji 1.7.1. Seam może nas później ukarać komunikatem:

You are using Apache Ant version 1.7.1 compiled on June 27 2008. You must use Ant 1.7.0 to build Seam. Ant 1.7.1 has known bugs.

Rozpakowujemy zawartość archiwum (apache-ant-1.7.0-bin.zip) w wybranym przez nas miejscu. Ja zdecydowałem się na C:Program FilesApache Software FoundationAnt. Przyda nam się zmienna środowiskowa ANT_HOME. Jej wartość w moim przypadku to oczywiście C:Program FilesApache Software FoundationAnt. Aby polecenie ant było dostępne należy do zmiennej środowiskowej Path dodać %ANT_HOME%/bin

Wykonanie polecenia:

ant -version

powinno spowodować wyświetlenie:

Apache Ant version 1.7.0 compiled on December 13 2006

Na przyszłość zainstalowałem sobie Mavena. Procedura identyczna jak w przypadku Anta. Pobieramy archiwum z binarkami i rozpakowujemy je do wybranej lokalizacji (u mnie jest to C:Program FilesApache Software FoundationMaven 2) oraz tworzymy zmienną środowiskową MAVEN_HOME (o wartości C:Program FilesApache Software FoundationMaven 2) a do zmiennej Path dodajemy %MAVEN_HOME%/bin

Polecenie:

mvn -version

powinno poskutkować wyświetleniem się:

Maven version: 2.1.0-M1
Java version: 1.6.0_07
Default locale: pl_PL, platform encoding: Cp1250
OS name: "windows xp" version: "5.1" arch: "x86" family: "windows"

Super! Mamy wszystko czego trzeba. Spróbujmy uruchomić jeden z przykładów dostarczonych razem z frameworkiem JBoss Seam. Przechodzimy do folderu examples/booking w folderze domowym Seam’a i uruchamiamy w konsoli polecenie:

ant deploy

Wynik tego polecenia to:

Buildfile: build.xml

initcopy:

initpoms:
[echo] Setting up dependencies
[copy] Copying 1 file to C:Program FilesJBoss-seam-2.1.1.GAclassespoms [artifact:install] [INFO] Installing C:Program FilesJBoss-seam-2.1.1.GAclassespomsroot.pom to C:Documents and SettingsMike.m2repositoryorgjbossseamroot2.1.1.GAroot-2.1.1.GA.pom
[copy] Copying 1 file to C:Program FilesJBoss-seam-2.1.1.GAclassespoms [artifact:install] [INFO] Installing C:Program FilesJBoss-seam-2.1.1.GAclassespomsparent.pom to C:Documents and SettingsMike.m2repositoryorgjbossseamparent2.1.1.GAparent-2.1.1.GA.pom
[copy] Copying 1 file to C:Program FilesJBoss-seam-2.1.1.GAclassespoms
[copy] Copying 1 file to C:Program FilesJBoss-seam-2.1.1.GAclassespoms
[copy] Copying 1 file to C:Program FilesJBoss-seam-2.1.1.GAclassespoms
[copy] Copying 1 file to C:Program FilesJBoss-seam-2.1.1.GAclassespoms
[copy] Copying 1 file to C:Program FilesJBoss-seam-2.1.1.GAclassespoms
[copy] Copying 1 file to C:Program FilesJBoss-seam-2.1.1.GAclassespoms
[copy] Copying 1 file to C:Program FilesJBoss-seam-2.1.1.GAclassespoms
[copy] Copying 1 file to C:Program FilesJBoss-seam-2.1.1.GAclassespoms
[copy] Copying 1 file to C:Program FilesJBoss-seam-2.1.1.GAclassespoms
[copy] Copying 1 file to C:Program FilesJBoss-seam-2.1.1.GAclassespoms
[copy] Copying 1 file to C:Program FilesJBoss-seam-2.1.1.GAclassespoms
[copy] Copying 1 file to C:Program FilesJBoss-seam-2.1.1.GAclassespoms
[copy] Copying 1 file to C:Program FilesJBoss-seam-2.1.1.GAclassespoms
[copy] Copying 1 file to C:Program FilesJBoss-seam-2.1.1.GAclassespoms
[copy] Copying 1 file to C:Program FilesJBoss-seam-2.1.1.GAclassespoms
copyseam:

copyseamdependencies:

gettrinidad:

getelri:

copyextradependencies:

init:
[echo] Building Seam on JBoss Booking Example 2.1

select-compiler:

compile:

jar:

init.war:

war:

jboss.war:

distributable.war:

ear:

archive:

datasource:

service:

meldware:

deploy:

BUILD SUCCESSFUL
Total time: 6 seconds

Jak widać wszystko poszło bez zakłóceń. W przeglądarce wpisujemy adres http://localhost:8080/seam-booking i cieszymy się pierwszą aplikacją napisaną w JBoss Seam, którą udało na się uruchomić.JBoss Seam - Booking example

Opublikowany przez Michał Mech

2009-01-18 o 15:24:00