Seit meinem letzten Grails Projekt verfolge ich aufmerksam jede Neuigkeit zum Thema Groovy und Grails. Aber auch die Entwicklung von Portlets für den freien Portal Server Liferay liegt im Bereich meines Interesses. Als ich dann auf groovyblogs.org (empfehlenswerte Quelle!) laß, dass ein Grails Plugin released wurde, mit dem man Portlets für Liferay erstellen kann, war klar, dass ich das ausprobieren muss. Die Vorstellung davon, Portlet- und Deploymentdeskriptoren nicht alle händisch erstellen zu müssen, Actions sowie Views generieren zu lassen und dazu noch in Groovy entwickeln zu können erschien mir durchaus als vielversprechend.
Doch als Erstes mussten die Hürden einer Installation und eines lauffähigen Deployments genommen werden, was ich im Folgenden dokumentieren möchte:
1. Liferay ab Version 5.2 installieren
2. Grails ab Version 1.1.1 installieren
3. Umgebungsvariable für Liferay setzen:
LIFERAY_HOME=/your_path_to/liferay-portlet-5.2.1
4. Grails Application erstellen:
grails create-app demoportlets
5. In App Verzeichnis wechseln und Portlet Plugins installieren:
grails install-plugin portlets
grails install-plugin portlets-liferay
grails install-plugin liferay-exploded
6. Portlet erstellen: Hierbei sollte man darauf achten, keine Großbuchstaben im Namen (z.B. demoportlet) zu verwenden, da die gsp`s zur Laufzeit in einem Verzeichnis ohne Großbuchstaben gesucht werden.
grails create-portlet demoportlet
Ergebnis dieses Befehls ist, dass im Verzeichnis "portlets" eine lauffähige Portletklasse mit dem Namen DemoPortlet.groovy mit folgendem Inhalt liegt:
import javax.portlet.* class DemoportletPortlet { def title = 'Portlet Title' def description = ''' Description about the portlet goes here. ''' def displayName = 'Display Name' def supports = ['text/html':['view', 'edit', 'help']] // Liferay server specific configurations def liferay_display_category = 'MyCategory' def actionEdit = { //TODO Define action phase portletResponse.setPortletMode(PortletMode.VIEW) } def renderEdit = { //TODO Define render phase. Return the map of the variables bound to the view ['mykey':'renderEdit called'] } def actionView = { //TODO Define action phase } def renderView = { //TODO Define render phase. Return the map of the variables bound to the view ['mykey':'renderView called'] } def actionHelp = { //TODO Define action phase portletResponse.setPortletMode(PortletMode.VIEW) } def renderHelp = { //TODO Define render phase. Return the map of the variables bound to the view ['mykey':'renderHelp called'] } }
7. Ich hatte das Problem, dass beim Generieren der Views ein Fehler flog, weil native2ascii nicht gefunden werden konnte. Das kann man beheben, in dem man JAVA_HOME auf ein JDK zeigen lässt. Alternativ kann man folgende Option in der config.groovy ausschalten um den Fehler zu umgehen:
grails.enable.native2ascii = false
8. Views generieren - netter Befehl, um edit.gsp, view.gsp und help.gsp vorzugenerieren:
grails generate-portlet-views demoportlet
9. Bauen und Deployen: An der Stelle hatte ich die größten Probleme, da auf meinem Rechner standardmäßig Java 1.6 läuft, Liferay jedoch seine eigene JRE mit der Version 1.5 mitbringt. Deswegen lautet meine Empfehlung: Bauen mit Java 1.5!
grails war
Danach kann man das fertige war-File aus dem App-Verzeichnis nach "liferay/deploy" kopieren, was bei einem laufenden Liferay dazu führen sollte, dass das Portlet automatisch deployed wird.
Alternativ kann man zum Deployen auch das Liferay Exploded Plugin verwenden, was bei mir aber leider nicht funktioniert hat und beim Deployen mit einem Fehler quittiert wurde:
grails liferay-deploy
und folgend grails liferay-update
Nach dem Deployen sollte man das Portlet in der Kategorie "MyCategory" finden und auf einer beliebigen Seite instantiieren können.

Getestet habe ich das Deployment in Liferay Version 5.2.1 und 5.2.3, was dank Java 1.5 auch für beide Versionen funktioniert hat.
Für das ganze Prozedere habe ich am Ende doch länger gebraucht als erwartet und war einige Male kurz davor aufzugeben. Jetzt bin ich aber wieder zuversichtlich und werde mich demnächst damit befassen, was man denn nun alles von der Grails-Funktionaliät im Portlet verwenden kann. Das Portlet selber bringt immerhin 23 MB auf die Waage und enthält sämtliche Libraries die Grails auch sonst so benötigt, wie Core, Crud, Gorm, Webflow etc. Das lässt zumindest hoffen, dass man auch Domainobjekte im Portlet verwenden kann.
Links:
http://grails.org/plugin/portlets
http://grails.org/plugin/portlets-liferay
http://grails.org/plugin/liferay-exploded
Beim generieren des war Ordners oder beim generieren der portlet-views erhalte ich jeweils die Fehlermedlung "Unable to generate portlet.xml". Laut Foren und JIRA sollte der Fehler behoben sein.
Meine Umgebung: Windows 7, Grails 1.3.1
Vielen Dank für die interessanten Beiträge!
Gruss Peter
Hallo,
ich bekomme genau die gleiche Fehlermeldung wie Peter, gibt es dafür eine Lösung?
Windows Vista, Grails 1.3.4
Gruss Sandy
Hallo,
also es liegt daran, dass das Portlet im Default package liegen muss. Was ich persönlich nicht so toll finde. 🙁
Selbst mit der aktuellen Version (0.8) des Plugins ist der Bug noch vorhanden, also nicht gefixed!! 🙁
GRuß Sandy