Michał Mech – W stronę Java

Zapiski programisty

Archiwum tagu ‘Ant’

Budowanie aplikacji za pomocą Mavena

Ilość komentarzy: 4

Kiedy pisałem o instalacji Seama wspomniałem, o instalacji narzędzia Maven, które może mi się przydać w przyszłości. I oto nadeszła ta chwila. Czytając jakiś czas temu poradnik Developing a Spring Framework MVC application pomyślałem, że fajnie byłoby zamienić narzędzie do budowania projektu z Anta na Mavena, który zajmie się przy okazji zależnościami.

Korzystam z Eclipse‘a jako IDE więc do zabawy przydadzą mi się dwa pluginy:

  1. Spring IDE – Przyda się do utworzenia Hello World oraz na przyszłość;
  2. Maven Integration for Eclipse – Zautomatyzuje nam to trochę czynności oraz dostaniemy bardzo ładny edytor plików POM.

New Spring Project (3)Po zainstalowaniu powyższych tworzymy zalążek projektu w Eclipse. Wybieramy File > New > Other a później Spring Project. Podajemy nazwę projektu, niech to jExample oraz zmieniamy lokalizację Source Folder Name z src na src/main/java a Output Folder Name z bin na target/classes. Zmiany te wynikają z domyślnych ustawień pluginów Mavena, z których będziemy korzystać.

Create new POMW następnej kolejności aktywujemy zarządzanie projektem za pomocą Mavena. W tym celu wybieramy Maven Enable Dependency Managment po uprzednim kliknięciu prawym klawiszem myszy na projekcie.

Kluczowym elementem pracy z Mavenem jest plik POM, który stanowi konfigurację zawierającą informacje o projekcie, jego zależnościach, e.t.c. Kreator tworzenia pliku POM uruchomi się zaraz po aktywacji Mavena. Jedyną zmianą jakiej dokonujemy to zamiana pakowania projektu z jar na war. Oto plik, który będzie wynikiem:

<project xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
        http://maven.apache.org/maven-v4_0_0.xsd">

    <modelVersion>4.0.0</modelVersion>
    <groupId>jExample</groupId>
    <artifactId>jExample</artifactId>
    <packaging>war</packaging>
    <version>0.0.1-SNAPSHOT</version>
</project>

Utwórzmy teraz naprawdę bardzo prostą aplikację internetową. Niech jej jedyną funkcją będzie przywitanie nas słowami … Hello World. W pierwszej kolejności tworzymy deskryptory.

src/main/webapp/WEB-INF/web.xml:

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
        http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">

    <servlet>
        <servlet-name>jExample</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>jExample</servlet-name>
        <url-pattern>*.html</url-pattern>
    </servlet-mapping>

    <welcome-file-list>
        <welcome-file>index.html</welcome-file>
    </welcome-file-list>
</web-app>

src/main/webapp/WEB-INF/jExample-servlet.xml:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">

    <bean name="/index.html" class="pl.michalmech.jexample.web.HelloController"/>
</beans>

Oraz src/main/webapp/WEB-INF/applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:aop="http://www.springframework.org/schema/aop"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xsi:schemaLocation="http://www.springframework.org/schema/beans

http://www.springframework.org/schema/beans/spring-beans-2.0.xsd

http://www.springframework.org/schema/aop

http://www.springframework.org/schema/aop/spring-aop-2.0.xsd

http://www.springframework.org/schema/tx

        http://www.springframework.org/schema/tx/spring-tx-2.0.xsd">
</beans>

Dodajemy jeszcze szybko widok (src/main/webapp/index.jsp):

<html>
    <head>
        <title>jExample</title>
    </head>
    <body>
        <h1>jExample :: Hello World</h1>
    </body>
</html>

Oraz na koniec niewielki kontroler:

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;

public class HelloController implements Controller {

    protected final Log logger = LogFactory.getLog(getClass());

    public ModelAndView handleRequest(HttpServletRequest request,
            HttpServletResponse response) throws Exception {

        logger.info("Returninag hello view");

        return new ModelAndView("index.jsp");
    }
}

Niestety jedyne co ma dla nas Eclipse to błędy wynikające z braku klas, których potrzebujemy:

HelloController

Jest to okazja do wykorzystania wreszcie Mavena, który dostarczy nam zależności, których potrzebujemy. Chcielibyśmy przede wszystkim skorzystać ze Spring MVC (niech to będzie najnowsza wersja) oraz API związanego z sewletami. Dodajemy do pliku POM następujący wpis (możemy oczywiście w tym celu użyć edytora plików POM):

<dependencies>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
        <version>2.5.6</version>
    </dependency>
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>servlet-api</artifactId>
        <version>2.5</version>
        <scope>provided</scope>
    </dependency>
</dependencies>

Spring Project (dependencies)POM Editor (dependencies_Zapisanie pliku sprawi, że Maven pobierze ze swojego lokalnego repozytorium wymagane zależności i dostarczy do projektu. W przypadku braku wymaganych paczek, zostaną one wcześniej pobrane z sieci (http://repo2.maven.org/maven2) oraz zainstalowane w repozytorium lokalnym Mavena. Warto zaznaczyć, że Maven dostarczył nam również inne wymagane pośrednio zależności: commons-logging, spring-core, e.t.c. My nie musimy się niczym martwić. Projekt już nie świeci się na czerwono od błędów.

W związku z tym, że dążymy do ujrzenia naszej aplikacji działającej przydałoby sie teraz utworzyć plik WAR. W tym celu wykonujemy w konsoli (będąc w loklizacji, w której znajduje się nasz projekt) polecenie:

mvn clean package

Wynikiem wykonania tego polecenia powinno być coś takiego:

F:\workspace\jExample>mvn clean package
[INFO] Scanning for projects...
[INFO] ------------------------------------------------------------------------
[INFO] Building Unnamed - jExample:jExample:war:0.0.1-SNAPSHOT
[INFO]    task-segment: [clean, package]
[INFO] ------------------------------------------------------------------------
[INFO] [clean:clean]
[INFO] Deleting directory F:\workspace\jExample\target
[INFO] [resources:resources]
[INFO] Using default encoding to copy filtered resources.
[INFO] [compiler:compile]
[INFO] Compiling 1 source file to F:\workspace\jExample\target\classes
[INFO] [resources:testResources]
[INFO] Using default encoding to copy filtered resources.
[INFO] [compiler:testCompile]
[INFO] No sources to compile
[INFO] [surefire:test]
[INFO] No tests to run.
[INFO] [war:war]
[INFO] Packaging webapp
[INFO] Assembling webapp[jExample] in [F:\workspace\jExample\target\jExample-0.0.1-SNAPSHOT]
[INFO] Processing war project
[INFO] Webapp assembled in[171 msecs]
[INFO] Building war: F:\workspace\jExample\target\jExample-0.0.1-SNAPSHOT.war
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESSFUL
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 5 seconds
[INFO] Finished at: Wed Apr 08 23:51:16 CEST 2009
[INFO] Final Memory: 11M/20M
[INFO] ------------------------------------------------------------------------

Teraz krótkie wyjaśnienie. Maven w pierwszej kolejności wyczyścił wszystko to co mogło być do tej pory skompilowane i umieszczone w folderze target. Po to było polecenie clean. W dalszej części Maven zajmuje się pakowaniem projektu (polecenie package). Plan tej czynności zakłada wykonanie kilku czynności wcześniej. Jest to przede wszystkim kompilacja źródeł, zebranie zasobów, wykonanie testów jednostkowych oraz wreszcie zebranie wszystkiego do kupy w WAR Pomimo tego, że w tym przypadku niewiele faktycznie jest do zrobienia, Maven informuje nas o każdej czynności i wynikach jej wykonania.
Każda z czynności jest realizowana przez oddzielny plugin Mavena, który możemy w szczególności skonfigurować wedle naszych życzeń.

Do Hello World krzyczącego do nas z okna przeglądarki zostało bardzo niewiele. Podobnie jak w tutorialu, o którym wspomniałem na początku, my również skorzystamy z kontenera aplikacji Apache Tomcat (instalacja jest niezwykle prosta więc pominę jej opis).

Przy tej okazji chciałbym zwrócić uwagę na konfigurację zależności servlet-api. Przestrzeń (ang. scope) jest zdefiniowana jako provided. Dzieje się tak ponieważ Tomcat dostarcza już tą paczkę wśród swoich bibliotek więc aplikacja, która jest rozmieszczana (ang. deploy) na serwerze nie musi jej zawierać.

W folderze domowym instalacji Mavena, w folderze conf znajduje się plik z globalną konfiguracją: settings.xml. W bloku zawierającym definicje serwerów servers/servers dodajmy opis lokalnego Tomcata:

<server>
    <id>tomcat.local</id>
    <username>admin</username>
    <password></password>
</server>

Identyfikator serwera jest dowolny natomiast login oraz hasło (a dokładniej jego brak) wynika z domyślnych wartości dla standardowej instalacji Tomcataa. Aby umieścić naszą aplikację na serwer skorzystamy z pluginu Tomcat Maven Plugin. Aby wykonać całą robotę, czyli kompilację, spakowanie oraz rozmieszczenie (ang. deploy) projektu na serwer wystarczy wykonać polecenie:

mvn clean package tomcat:deploy

W zasadzie to wystarczy ponieważ Maven pobierze ze swojego repozytorium i zainstaluje wspomniany plugin jak tylko będzie go potrzebował. Podczas wykonywania polecenia zobaczymy to w konsoli:

[INFO] Searching repository for plugin with prefix: 'tomcat'.
[INFO] org.codehaus.mojo: checking for updates from central
[INFO] artifact org.codehaus.mojo:tomcat-maven-plugin: checking for updates from central
Downloading: http://repo1.maven.org/maven2/org/codehaus/mojo/tomcat-maven-plugin/1.0-beta-1/tomcat-maven-plugin-1.0-beta-1.pom
5K downloaded
Downloading: http://repo1.maven.org/maven2/org/codehaus/mojo/mojo-parent/20/mojo-parent-20.pom
18K downloaded
Downloading: http://repo1.maven.org/maven2/org/codehaus/mojo/tomcat-maven-plugin/1.0-beta-1/tomcat-maven-plugin-1.0-beta-1.jar
48K downloaded

Niemniej jednak gdybyśmy chcieli wskazać jakieś inne repozytorium, które Maven ma przeszukiwać w chwili kiedy czegoś potrzebuje, możemy je zdefiniować w pliku POM:

<repositories>
    <repository>
        <id>mojo</id>
        <name>Mojo Project</name>
        <url>http://repository.codehaus.org</url>
    </repository>
</repositories>

Podobnie ma się rzecz z uruchomieniem plugin. Użyta będzie domyślna konfiguracja. Aby ją zmienić powinniśmy odpowiednio zmodyfikować POM. Oto przykład jak jawnie podać nazwę serwera, na którym umieszczamy (ang. deploy) aplikację:

<build>
    <plugins>
        <plugin>
            <groupid>org.codehaus.mojo</groupid>
            <artifactid>tomcat-maven-plugin</artifactid>
            <configuration>
                <server>tomcat.local</server>
            </configuration>
        </plugin>
    </plugins>
</build>

Konfiguracja oczywiście będzie będzie wzięta z ustawień globalnych Mavena.

W zasadzie to wszystko. Wykonanie wspomnianego polecenia (mvn clean package tomcat:deploy) powinno dać następujący wynik:

...
[INFO] Building war: F:\workspace\jExample\target\jExample-0.0.1-SNAPSHOT.war
[INFO] [tomcat:deploy]
[INFO] Deploying war to http://localhost:8080/jExample
[INFO] OK - Deployed application at context path /jExample
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESSFUL
[INFO] ------------------------------------------------------------------------

Uruchomienie w przeglądarce adresu http://localhost:8080/jExample/index.html pozwoli nam upewniść się, że aplikacja działa.

jExample Hello  World

To co opisałem, to zaledwie kropla w morzu możliwości Mavena, który posiada ich oczywiście dużo więcej, dzięki różnorodnym pluginom. Możemy dzięki niemu nie tylko zarządzać budowaniem projektu i zależnościami ale również generować dokumentację czy nawet sprawdzać styl kodowania.

Opublikowany przez Michał Mech

2009-04-08 o 21:19: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

W stronę J2EE

Ilość komentarzy: 16

Jest to pierwszy post, który tu zamieszczam i jednocześnie jest to swego rodzaju “o blogu”.

Programowanie to mój zawód, który wykształcił się z pasji, którą było tworzenie stron www. Od kilku lat pracuję nieustannie jako programista PHP. Miałem w swojej karierze również epizod z Javą (ten epizod to ponad półtora roku programowania) lecz nie były to zastosowania webowe lecz programowanie aplikacji standalone.

Od jakiegoś czasu, chciałbym powrócić do Javy tyle, że w kontekście aplikacji www. Przejście takie nie jest łatwe, nawet pomimo pewnego doświadczenia, które posiadam. Praca w ciągu dnia zawodowo w jednej technologii pochłania dużo czasu, który jest potrzebny na nauczenie się drugiej. Z tego powodu czekają mnie długie, pasjonujące wieczory oraz z tęsknotą wyczekiwane weekendy, kiedy będę mógł zgłębiać tajniki J2EE. W skrócie: ciężka praca. Praca, na którą bardzo się cieszę.

W pierwszej kolejności postanowiłem opanować framework JBoss Seam, który jest typowym frameworkiem webowym, w przeciwieństwie, na przykład do Springa. Oczywiście, jeśli chcę myśleć poważnie o odnalezieniu się w świecie J2EE Spring jest jazdą obowiązkową ale na początek uraczę się czymś mniejszym. Myślę, że to dobry początek. Nauka frameworka JBoss Seam będzie świetną okazją do odświeżenia sobie wiedzy związanej z narzędziami takimi jak Hibernate, Maven czy Ant. Poza tym Seam łączy w sobie przede wszystkim JSF (podstawy znam) oraz EJB, których znajomość wydaje mi się podstawą. Jak już opanuję Seama w stopniu mnie satysfakcjonującym przejdę dalej.

Na końcu, po co jest ten blog? Otóż postanowiłem go założyć żeby mieć miejsce na publikowanie własnych spostrzeżeń, pytań oraz wniosków nasuwających mi się podczas nauki J2EE. Mam nadzieję, że będzie to taki notatnik. Czy będę publikował często i sensownie? Nie wiem, ja tu dopiero ledwie sprzątam.

P.S.
W miejscu tego bloga prowadziłem kiedyś bloga związanego z PHP. Nie była to długa przygoda ale udało mi się “popełnić” kilka ciekawych (w moim mniemaniu) tekstów. Jeśli ktoś chciałby je odnaleźć może skorzystać z serwisu Internet Archive, gdzie znajduje się ostatnia wersja tamtego bloga.

Opublikowany przez Michał Mech

2009-01-17 o 16:06:00