piątek, 26 marca 2010

Grails - wdrożenie war na tomcat + utrwalenie danych w MySQL/DB2


W ciągu ostatnich kilku dni zajmowałem się powyższym tematem, w końcu mogę się podzielić z Wami wynikami mojej pracy w postaci "krótkiego" tutorialu. Myślę, że warto poświęcić Grailsowi trochę czasu, szczególnie jeżeli ktoś zajmuje się tworzeniem aplikacji webowych, których programowanie ułatwia omawiana tu platforma. Co jest takiego fajnego w Grails? Przede wszystkim to, że zapewnia wysoką produktywność w tworzeniu aplikacji webowych opartych o platformę Java, wykorzystuje sprawdzone technologie takie jak Hibernate i Spring oraz zbudowany jest w oparciu o dynamiczny język Groovy. Jest łatwy w nauce w szczególności dla programistów Java(ale nie tylko), ukrywa przed użytkownikiem wiele szczegółów konfiguracji i posiada wbudowane kompletne środowisko programistyczne(serwer aplikacji, bazę danych itp.).


Zakładam, że zmienne środowiskowe wskazujące na Grails i JDK są ustawione(jeżeli nie - wróć do poprzedniej notki). Otwieramy konsole Windows start>uruchom i tam wpisujemy cmd. Wybieramy dysk, na którym chcemy umieścić naszą aplikację, u mnie dysk D, wpisujemy:
C:\Documents and Settings\X>d:
Tworzymy naszą aplikację:
D:\>grails create-app Biblioteka
Chcemy mieć, co utrwalać, więc przechodzimy do katalogu naszej aplikacji, dalej będziemy tworzyć dwie domain-class i proste powiązanie między nimi:
D:\>cd biblioteka
D:\Biblioteka>grails create-domain-class Ksiazka
WARNING: You have not specified a package... (y, Y, n, N)

Zatwierdzamy ostrzegający komunikat(przez który wcześniej miałem problemy w Netbeans IDE) bo do prostej aplikacji nie potrzebujemy pakietów.

Tak jak poprzednio, tworzymy kolejną domain-class - Czytelnik.

Każda biblioteka ma swoich czytelników, w tym przykładzie również przyda nam się czytelnik, aby pokazać relację pomiędzy dwoma klasami, która będzie miała odzwierciedlenie w naszej bazie danych. Teraz chcemy powiązać te dwie klasy - wypożyczamy książkę czytelnikowi, w Groovy robimy to podobnie jak w Javie dodając pole Czytelnik do klasy Ksiazka. Każdy czytelnik może wypożyczyć wiele książek, a jedna książka może mieć maksymalnie jednego czytelnika, aby otrzymać relację wiele-do-jednego(ang. many-to-one LINK) wystarczy w klasie Czytelnik dodać jedną linijkę kodu. Dodamy jeszcze inne pola klasy, przejdź do katalogu z nowo utworzonymi domain-class, czyli D:\Biblioteka\grails-app\domain\

Otwieramy najpierw klasę Ksiazka i uzupełniamy ją o poniższy kod: 
class Ksiazka {
       
        String autor
        String tytul
        String rokWydania
        Czytelnik czytelnik
       
    static constraints = {
            autor()
            tytul()
            rokWydania()
            czytelnik(nullable : true)
    }
Dla zainteresowanych deklaracją constraints - LINK.
Uzupełniamy klasę Czytelnik kodem:
class Czytelnik {

        String imie
        String nazwisko
       
        static hasMany = [ ksiazki : Ksiazka ]
       
        static constraints = {
            imie()
            nazwisko()
            ksiazki(nullable : true)
        }
}
Po wpisaniu kodu, wracamy do konsoli i wpisujemy komendę:
D:\Biblioteka>grails generate-all Ksiazka

Tą samą komendę wywołujemy z parametrem Czytelnik, ta komenda generuje nam implementację elementu bardzo ułatwiającego życie programisty, czyli generuje interfejs CRUD (Create/Read/Update/Delete) dla wybranej klasy. LINK

Przed konfiguracją bazy danych przygotujemy tomcata do pracy, ściągamy LINK, rozpakowujemy i ustawiamy zmienne środowiskowe LINK.

W projekcie realizowanym na praktykach używać będę DB2, więc skonfiguruję sobie połączenie z bazą DB2 i MySQL(z którą miałem wcześniej do czynienia).

Jeżeli interesuje Cię tylko DB2 to omiń część notki poświęconą MySQL.

Konfiguracja MySQL

Dla tych, co zdecydowali się na MySQL LINK do pobrania. Ściągamy od razu bibliotekę, którą wrzucimy później do naszej aplikacji - LINK.

Uruchamiamy serwer - można to zrobić na dwa sposoby, włączyć usługę ręcznie w panelu sterowania>narzędzia administracyjne>usługi i znaleźć pozycję MySQL, lub wpisując komendę:
>net start mysql //uruchamiamy usługę
>net stop mysql //kończymy usługę
Jednak powyższa metoda u mnie nie działa, mimo, że mam poprawnie ustawioną zmienną PATH dla MySQL oraz serwer zainstalowany jako usługę systemu Windows.
Teraz czas na stworzenie bazy danych, otwieramy linie poleceń MySQL (start>programy>MySQL Command Line Client), logujemy się podając wcześniej ustalone hasło dla swojego profilu i wpisujemy:
MySQL>create database biblioteka;
Grails przygotował dla swoich użytkowników kolejne ułatwienie podążając za sloganem konwencja ponad konfiguracje (z ang. convention over configuration), tym razem zmieniając tylko kilka linijek kodu w pliku D:\Biblioteka\grails-app\conf\DataSource.Groovy konfigurujemy połączenie: 
dataSource {
    pooled = true
    driverClassName = "com.mysql.jdbc.Driver"
    username = "root"
    password = "root"
}

// environment specific settings
environments {
    development {
        dataSource {
            dbCreate = "update"
            url = "jdbc:mysql://localhost:3306/biblioteka"
        }
    }
}    
Zastępujemy bazowe ustawienia na powyższe, jeżeli będziemy korzystać z innych środowisk uruchomieniowych bazy danych to nadmieniamy tylko url do bazy danych dla danego środowiska. LINK
Mamy stworzoną aplikację, bazę danych, przygotowanego tomcata, odpaloną usługę MySQL, teraz tworzymy war uruchamiając komendę:
D:\Biblioteka>grails war Biblioteka.war
Kopiujemy utworzonego wara do katalogu \Apache Tomcat 6.0.20\webapps oraz wcześniej pobranego mysql-connector-java-5.1.12-bin.jar do folderu naszej aplikacji D:\Biblioteka\lib.
Komendą:
>startup
uruchamiamy tomcata.

Widzimy w konsoli tomcata, którego wcześniej uruchomiliśmy, że rozpoczeło się automatyczne wdrażanie war na serwer, jeżeli wszystko przebiegło pomyślnie otwieramy naszą aplikację podając link:
http://localhost:8080/Bilbioteka
Możemy teraz stworzyć czytelnika, potem dwie książki - wybierając w polu czytelnik wcześniej stworzoną osobę tak, aby upewnić się, że nasza relacja zachodzi - wracamy do czytelnika i widzimy, że w polu Książki ma podane dwie pozycję.

Konfiguracja DB2

Pobranie DB2 nawet w wersji darmowej, czyli Express-C wymaga rejestracji na stronie IBM, rejestrujemy się, logujemy i pobieramy LINK.
Instalujemy, zapamiętujemy użytkownika i hasło, które podaliśmy. Teraz jak poprzednio tworzymy bazę danych, ale najpierw uruchamiamy serwer, znowu na dwa sposoby albo uruchamiając usługę, albo start>IBM DB2>Command Line Tools>Command Window:
>db2start
Teraz IBM DB2>Command Line Tools>Command Line Processor i wpisujemy:
db2 =>create database biblio
Pamiętając o tym, że nasza baza danych może zawierać do 8 znaków bo inaczej otrzymamy błąd - LINK.

Znowu nadmieniamy kod w pliku
D:\Biblioteka\grails-app\conf\DataSource.Groovy:
dataSource {
    pooled = true
    driverClassName ="COM.ibm.db2.jdbc.app.DB2Driver"
    username = "MOJ_UZYTKOWNIK"
    password = "MOJE_HASLO"
}
environments {
    development {
    dataSource {
            dbCreate = "update"
            url = "jdbc:db2:biblio"
    }
}
Teraz część, z którą miałem więcej problemów, wybranie odpowiedniej biblioteki do połączenia z bazą danych. Na początku skonfigurowałem połączenie dla tomcata wbudowanego w Grails, kopiujemy plik z katalogu instalacyjnego DB2 u mnie \DB2express-c_971\SQLLIB\java\db2jcc4.jar do D:\Biblioteka\lib. Używając komendy: 
D:\Bilbioteka>grails run-app
powinno wszystko działać.

Jednak żeby działało połączenie z DB2 na osobnym serwerze tomcat musiałem się trochę bardziej natrudzić, wiecej rzeczy przetestować i przewertować trochę wiecej informacji, aby w końcu natrafić na użyteczny LINK. W kroku 6 podpunkcie 3 znalazłem odpowiedź, "wystarczy" przekopiować plik
\DB2express-c_971\SQLLIB\java\db2java.zip i zmienić jego rozszerzenie na .jar do katalogu \tomcat\lib. Teraz gdy wrzucimy nasz plik Biblioteka.war do webapps w tomcat i zrestartujemy serwer możemy się cieszyć działającą aplikacją.


Kolejnym krokiem realizowanym w ramach praktyk będzie zainstalowanie IBM WebSphere Process Server (WPS) na wirtualnej maszynie z systemem Linux.

piątek, 19 marca 2010

Grails - pierwsze kroki, podsumowanie

Stworzenie pierwszej aplikacji webowej w Grails jest bardzo proste więc myślę, że nie ma sensu opisywać szczegółowo jak to zrobić(tymbardziej, że jest już wiele dostępnych materiałów w sieci). Podam za to parę linków, które mogą pomóc początkującemu użytkownikowi Grails:

1. Pobieramy Grails (najlepiej najnowszą wersję, ja korzystam z wersji 1.3-M1) - http://www.grails.org/Download.

2. Ustawiamy zmienne środowiskowe - http://www.grails.org/Installation.

3. Możemy stworzyć naszą pierwszą aplikację:
a) najprostsza aplikacja z możliwych - HelloWorld.
b) trochę większa aplikacja - opis krok po kroku + utrwalanie danych w HSQL.
c) połączenie Grails z bazą danych MySQL - http://www.jaceklaskowski.pl/wiki/Grails_z_MySQL
d) zbiór tutoriali z developerWorks - http://www.grails.org/Tutorials

4. Możemy również zintegrować Grails z obsługującym go IDE i tam w jeszcze bardziej ułatwiony sposób tworzyć nasze aplikacje - http://www.grails.org/IDE+Integration.

Ja na początek wybrałem tą nieco łatwiejszą drogę, czyli Grails w środowisku Netbeans, chociaż praca przy samych tutorialach w konsoli windows jest równie prosta, ale bardziej czasochłonna. Miałem małe problemy, które jak się okazało później sam sobie przysporzyłem. Zainstalowałem Grails 1.2.1, zabrałem się do tworzenia pierwszej domain-class i w momencie tworzenia klasy, w oknie output w Netbeans pojawia się komunikat, ostrzeżenie, że nie powinno się tworzyć klas bez pakietów i czy chce kontynuować. W tym momencie Netbeans się zawiesza, można jedynie wpisać coś w okno tworzenia klasy i wtedy się odwiesza, tylko, że jedyne wyjście jakie pozostaje to wcisnąć cancel. :)

Jak się później okazało można było po prostu stworzyć klasy komendami Grails - prawym na projekt i run grails command. Jeszcze tego nie wiedząc zainstalowałem starszą wersję Grails 1.1.2. Co prawda naprawiło to wcześniejszy błąd, ale podczas późniejszej pracy z bazą danych MySQL pojawiły się kolejne błędy, które znowu naprawione były w nowszej wersji Grails.

Do nauki na początek polecam książkę, o której przeczytałem na blogu mojego mentora Jacka Laskowskiego - Dave Klein Grails A Quick Start Guide, Oct.2009. Jest w niej ciekawy przykład, książkę przyjemnie się czyta, a szczególnie zachęcająca jest ilość stron. :)

Wiem jak pracuje się nad Grailsem w Netbeans i konsoli Windows, jak skonfigurować Grails żeby korzystał z bazy danych MySQL. Następny krok to własnoręczne wdrożenie wygenerowanego pliku war na osobny serwer tomcat i skonfigurowanie bazy danych DB2 albo Oracle XE.

Notka wprowadzająca - praktyki IBM

Tytułem wstępu:

Witam wszystkich na moim blogu. :)

Jest to moja pierwsza styczność z notowaniem w internecie tego, co robię w swoim życiu, proszę o podwójną wyrozumiałość z tego względu, że będę się starał zamieszczać tutaj postępy moich prac nad nowo poznanymi technologiami, tworzonymi projektami itp., a nie jestem specjalistą w tej dziedzinie.

Jako, że niedługo kończę studia, a w CV nadal pusto, jakiś czas temu podjąłem decyzję o wzięciu udziału w praktykach IBM. Postaram się zamieszczać na swoim blogu postępy w mojej pracy nad tematem projektu jaki sobie wybrałem: "Creating user interface for Human Tasks in IBM WebSphere Process Server V7 with Grails".

Główne cele mojej pracy obejmować będą:

1. Naukę Grails.

2. Uruchomienie Grails na Websphere Process Server (WPS).

3. Stworzenie przykładowego procesu biznesowego w Websphere Integration Developer (WID) z zadaniem użytkownika (z ang. Human Task).

4. Rozpoznanie sposobu tworzenia interfejsu użytkownika dla procesu biznesowego w Grails.

5. Stworzenie interfejsu użytkownika, o którym mowa w powyższym punkcie.

6. Podsumowanie pracy w postaci dokumentu.

Cała praca wykonana będzie na VMware z Linuksem. Już od jakiegoś czasu realizuję pierwszy cel, niedługo postaram się napisać jak mi idzie.