12 marca 2009

Grails na Mor.ph

Po namowach dałem się przekonać do sprawdzenia usługi Mor.ph rejestrując uruchomienie aplikacji grailsowej nauczyciel.

Jest to pierwsze moje spotkanie z usługą PaaS (ang. Platform as a Service) i nawet nie przypuszczałem, że pójdzie tak gładko. Teraz zdecydowanie łatwiej będzie mnie przekonać do tych nie-javowych rozwiązań dla moich javowych poczynań.

Zacząłem od Java Cookbook (odnośnik w prawym dolnym rogu), a w nim "Preparing a Grails Application for Deployment". Warto przeczytać owe 21 stron (właściwie o samym Grails znacznie mniej, bodajże 2-3 strony), bo opisują nie tylko samą pracę z platformą Mor.ph, ale również sposób konfiguracji dostępu do bazy danych PostgreSQL lub MySQL w Grails. Szybki skan po forum Mor.ph i trafiłem na dwie dyskusje Grails deployment using the Mor.ph plugin oraz Private github and deployment. Z pierwszej dowiedziałem się o Mor.ph Deploy Plugin. Pobrałem plik properties oraz jar (oba z sekcji Java Tools for Morph AppSpace Deployment w panelu administracyjnym) i zgodnie z instrukcją do wtyczki umieściłem je w katalogu głównym projektu.

Następnie instalacja wtyczki morph-deploy.
 jlaskowski@work /cygdrive/c/projs/sandbox/nauczyciel
$ grails install-plugin morph-deploy
Welcome to Grails 1.1 - http://grails.org/
Licensed under Apache Standard License 2.0
Grails home is set to: c:/apps/grails

Base Directory: C:\projs\sandbox\nauczyciel
Running script c:\apps\grails\scripts\InstallPlugin.groovy
Environment set to development
Reading remote plugin list ...
Reading remote plugin list ...
[get] Getting: http://plugins.grails.org/.plugin-meta/plugins-list.xml
[get] To: ...\.grails\1.1\plugins-list-default.xml
.....................
[get] last modified = Thu Mar 12 08:37:25 CET 2009
[get] Getting: http://plugins.grails.org/grails-morph-deploy/tags/RELEASE_0_1/grails-morph-deploy-0.1.zip
[get] To: ...\.grails\1.1\plugins\grails-morph-deploy-0.1.zip
...
[get] last modified = Thu Jan 22 00:21:40 CET 2009
[copy] Copying 1 file to ...\.grails\1.1\projects\nauczyciel\plugins
Installing plug-in morph-deploy-0.1
[mkdir] Created dir: ...\.grails\1.1\projects\nauczyciel\plugins\morph-deploy-0.1
[unzip] Expanding: ...\.grails\1.1\plugins\grails-morph-deploy-0.1.zip
into ...\.grails\1.1\projects\nauczyciel\plugins\morph-deploy-0.1
Executing morph-deploy-0.1 plugin post-install script ...
Plugin morph-deploy-0.1 installed
Plug-in provides the following new scripts:
------------------------------------------
grails deploy
Found events script in plugin morph-deploy
Wtyczka morph-deploy bazuje na wtyczce Ant, która jest po prostu przesłonięta przez Grails (wbudowana w jego architekturę przez wywołanie odpowiedniego skryptu Groovy z pomocą Gant). Analiza źródła wtyczki zdecydowanie poprawia zrozumienie jej działania - %userprofile%\.grails\1.1\projects\nauczyciel\plugins\morph-deploy-0.1\scripts\Deploy.groovy i nie powinna nastręczać problemów nawet dla początkujących.

Kolejny krok to grails war.
 jlaskowski@work /cygdrive/c/projs/sandbox/nauczyciel
$ grails war
Welcome to Grails 1.1 - http://grails.org/
Licensed under Apache Standard License 2.0
Grails home is set to: c:/apps/grails

Base Directory: C:\projs\sandbox\nauczyciel
Running script c:\apps\grails\scripts\War.groovy
Environment set to production
Warning, target causing name overwriting of name startLogging
Removing JDBC 2 Extensions JAR from WAR for Mor.ph deployment
Error executing script War: No such property: stagingDir for class: _Events
gant.TargetMissingPropertyException: No such property: stagingDir for class: _Events
at gant.Gant$_dispatch_closure4.doCall(Gant.groovy:329)
at gant.Gant$_dispatch_closure6.doCall(Gant.groovy:334)
at gant.Gant$_dispatch_closure6.doCall(Gant.groovy)
at gant.Gant.withBuildListeners(Gant.groovy:344)
at gant.Gant.this$2$withBuildListeners(Gant.groovy)
at gant.Gant$this$2$withBuildListeners.callCurrent(Unknown Source)
at gant.Gant.dispatch(Gant.groovy:334)
at gant.Gant.this$2$dispatch(Gant.groovy)
at gant.Gant.invokeMethod(Gant.groovy)
at gant.Gant.processTargets(Gant.groovy:495)
at gant.Gant.processTargets(Gant.groovy:480)
Caused by: groovy.lang.MissingPropertyException: No such property: stagingDir for class: _Events
at _Events$_run_closure1.doCall(_Events.groovy:6)
at War$_run_closure1.doCall(War.groovy:38)
at gant.Gant$_dispatch_closure4.doCall(Gant.groovy:324)
... 10 more
No cóż, nie idzie gładko, ale ku dobru ogólnemu znalazłem w tym pewien ukryty cel - nie od dzisiaj wiadomo, że nie ma to jak uczyć się przy dobrej zabawie ;-) Zaglądamy do skryptu _Events.groovy (w katalogu %userprofile%\.grails\1.1\projects\nauczyciel\plugins\morph-deploy-0.1\scripts), gdzie można znaleźć
 Ant.delete(file:"${stagingDir}/WEB-INF/lib/jdbc2_0-stdext.jar")
Już wcześniej, w samym dokumencie Java Cookbook, wspomina się o usunięciu pliku jdbc2_0-stdext.jar:

By default, Grails adds all dependencies in the WEB-INF/lib directory of the war. These dependencies include jdbc2_0-stdext.jar. This jar contains the JDBC 2.0 extensions, but these classes have been included in JDK 1.4 long time ago, and are only needed when running with JDK 1.3. By default, this obsolete jar is still included. This jdbc2_0-stdext.jar must be removed from the WEB-INF/lib directory of the war

ale, przynajmniej dla wersji Grails 1.1, nie jest to już w ogóle potrzebne - plik nie jest dodawany do paczki. Pomogło skasowanie pliku _Events.groovy (= zmieniłem nazwę na X_Events.groovy).

Następnie grails deploy.
 jlaskowski@work /cygdrive/c/projs/sandbox/nauczyciel
$ grails deploy
Welcome to Grails 1.1 - http://grails.org/
Licensed under Apache Standard License 2.0
Grails home is set to: c:/apps/grails

Base Directory: C:\projs\sandbox\nauczyciel
Running script ...\.grails\1.1\projects\nauczyciel\plugins\morph-deploy-0.1\scripts\Deploy.groovy
Environment set to development
Warning, target causing name overwriting of name default
This will deploy the file nauczyciel-0.1.war
Enter your Mor.ph username:
jacek
Enter your Mor.ph password:
****
Please wait...
[java] Uploading the code...
[java] Creating new appspace version...
[java] Deploying the application...
[java] Deploy Done.
[java] For more information on the status of this deployment, you
[java] can view the Deployment Logs by clicking 'Manage' located
[java] on your subscription widget and by clicking the Logs tab.
[java] In this same page, you can also view your Production logs
[java] and Scheduled task logs.
[java] ** transaction commit **
Tym razem wejście na http://nauczyciel.morphexchange.com/ i...

Działa!

Dzięki wszystkim za nieustanne przypominanie...ekhm...życzliwe namawianie, aby w końcu sprawdzić Mor.pha w działaniu! Niewiele trzeba, a jaka radość.

Zmiany oczywiście są już w projekcie nauczyciel w GitHubie. Pomoc przy rozwoju aplikacji mile widziana.