Feb 03

Mein favorisiertes Web-Framework Grails hat die Major Version 2 erreicht. Bei der Fülle an neuen Funktionen ist die 2 vor dem Punkt mehr als gerechtfertigt. Einen guten Überblick, über das was sich geändert hat, bietet der Artikel “Das ist neu in Grails 2.0” von Dierk König.

Für mich war schon die neue interaktive Grails Console mit TAB- Vervollständigung, farbiger, einzeiliger Ausgabe und formatierten Fehlerausgaben das Upgrade wert. Sie ist vor allem bei der Befehlsausführung sehr viel schneller, da dafür keine eigene JVM gestartet werden muss.
Als Testkandidat musste meine Beispiel Grails Anwendung grum (sourcecode auf Google Code) herhalten. Doch so einfach wie ein upgrade von einer Minor Version auf eine andere war es nicht.

Als erstes sollte man die upgrade Hinweise verinnerlichen, denn ein einfaches grails upgrade führte bei mir erst einmal zu einem inkonsistentem Projekt in meiner Entwicklungsumgebung (SpringSource Tool Suite).

Schuld ist man meistens selbst. Doch wo liegen nun die Fallstricke?

Dependency Management

Ein Thema, was ich bis jetzt vollständig ignoriert hatte, war das Dependency Management. In den vorherigen Grails Versionen lagen alle benötigten Bibliotheken (wie der JDBC Treiber) im lib Verzeichnis. Sauberer ist es natürlich die Abhängigkeiten zu deklarieren. Bei Grails macht man dies in der BuildConfig Klasse.

conf/BuildConfig.groovy

dependencies {
   // specify dependencies here under either 
   //'build', 'compile', 'runtime', 'test' or 'provided' scopes eg.
 
   runtime 'mysql:mysql-connector-java:5.1.16'
   build "displaytag:displaytag:1.2"
   runtime "displaytag:displaytag-export-poi:1.2"
   runtime "displaytag:itext:1.3"
   runtime "displaytag:poi:3.2"
}

Danach sollte man in der IDE die Abhängigkeiten über Grails Tools -> Refresh Dependencies aktualisieren. Reicht dies nicht aus (wie bei mir) hilft es das Dependency Management zu stoppen und zu starten.

  • Grails Tools -> Disable Dependency Management
  • Grails Tools -> Enable Dependency Management

Alternativ kann man in der Grails Konsole folgende Befehle absetzen:

grails> clean
grails> war

Plugins

Dabei kam es bei mir zu Kompilierungs Problemen im Zusammenhang mit den automatisch installierten Plugins jquery und resources, was ich nur durch eine Neuinstallation der Plugins beheben konnte

grails> uninstall-plugin <plugin-name>
grails> install-plugin <plugin-name>

TagLibs

Und wo man schon mal beim Aufräumen ist. Das Tag createLinkTo ist depracted und sollte durch das Tag resources ersetzt werden. An dieser Stelle sollte man auch auf folgenden upgrade Hinweis achten:

If you install Resources (or it is installed automatically), tags like <g:javascript> won’t write anything to the page until you add the <r:layoutResources/> tags to your layout.

Content Negotiation

Ein Punkt warum ich Grails so mag ist, das sich damit sehr leicht REST APIs umsetzen lassen. Hier hat sich in der Version 2.0 auch etwas geändert. Die Content Negotiation richtet sich jetzt nicht mehr nach dem akzeptierten Format des Responses, sondern nach dem Content-Type des Requests.
Dafür muss man im Code withFormat durch request.withFormat ersetzen. Testen kann man diese Änderung mit curl. Z.B. mit:

curl --header Content-Type:text/xml http://localhost:8080/grum/contactData/list

Fazit:
Das Upgrade lohnt sich, auch wenn es mit etwas mehr Arbeit verbunden ist, als sonst.

Links:
grum – Grails 2.0 Beispiel Applikation

geschrieben von gklinkmann \\ tags: ,

May 25

Die diesjährige Jax (Fachkonferenz für Java) ist seit gut 2 Wochen vorbei. Ein Teil der Vorträge wurde auf Video aufgezeichnet und wird jetzt nach und nach unter JAX TV Channel auf Vimeo bereitgestellt.

Wie immer waren sehr interessante Vorträge aus allen Themenbereichen darunter. Für jeden Java Geschmack sollte also etwas dabei sein.

geschrieben von gklinkmann \\ tags: , , ,

Mar 18

Video – Tutorials sind neben einem Fachbuch ein guter Einstieg in ein Thema. Von Springsource gibt es zum Thema Grails zwei sehenswerte Tutorials auf youtube.
Wenn Ihr Euch für das Webframework Grails interessiert, solltet Ihr Euch eine halbe Stunde für diese zwei gut gemachten Videoanleitungen nehmen.

via:
Neues Video-Tutorial zu Grails – it-republik.de

geschrieben von gklinkmann \\ tags: , , ,

Mar 14

Ich habe in der letzten Zeit das Thema Grails in diesen Blog etwas vernachlässigt. So ist es nun nach dieser Durststrecke an der Zeit, wieder einen Blog Eintrag zu diesem Thema zu schreiben (weitere könnten folgen).
Einer meiner ersten Artikel zu Grails zeigte, wie man Grails und Eclipse zueinander bringt. Dieser Eintrag war so erfolgreich, dass ich ihn auch als feste Seite im Rahmen eines kleinen Tutorials in den Blog integriert habe.

Dies ist ein paar Monate her und die Unterstützung der Erstellung von Grails Anwendungen durch Eclipse ist stetig besser geworden.
War es zum Anfang so, dass die mit Abstand beste IDE für Grails IDEA war, so holt das freie Eclipse immer mehr auf. Spätestens mit dem Wechsel der Grails Entwickler zu Springsource und der damit verbundenen Einbettung in die Eclipse basierte Springsource Tool Suite (STS) hat sich eine Menge getan.

Mal abgesehen von dem Hauptspeicher – Hunger von STS fühle ich mich als alter Eclipse Nutzer gut aufgehoben. Mit Netbeans und IDEA konnte ich mich nie so richtig anfreunden.

Um den Grails Support zu aktivieren müssen die Grails und Groovy Extensions über den Reiter Extensions des STS Dashboards installiert werden (s. Screenshot). Danach gibt es für Grails Projekte eine eigene Perspektive mit Syntax Highlighting, Code Vervollständigung und einer übersichtlichen Navigation im Project Explorer.
In der Toolbar gibt es in der Grails Perspektive einen Button zur Ausführung von Grails Befehlen (wie z.B. run-app).

Bei der Installation der Grails Extensions wird im Installationsverzeichnis des STS die aktuelle Grails Version abgelegt.

~ > ls springsource/
   grails-1.3.5
   grails-1.3.6				
   grails-1.3.7
   maven-2.2.1.RELEASE				
   roo-1.1.0.RELEASE			
   tc-server-developer-2.0.4.RELEASE
   sts-2.5.0.RELEASE

Gibt es bei den Updates (Help -> check for Updates) eine neue Grails Version wird diese dort hinzugefügt. In den Preferences (Groovy -> Grails) muss man dann die neue Version für den Workspace übernehmen. Im Grails Projekt ist dann noch der upgrade Befehl notwendig.

Fazit:
Die Grails Integration in Eclipse hat einen großen Schritt nach vorn getan. Vom Funktionsumfang dürfte IDEA immer noch führen. Grails Projekte werden dort allerdings nur in der kostenpflichtigen ULTIMATE Variante unterstützt.
Die kostenfreien Entwicklungsumgebungen Netbeans und die Eclipse basierte STS unterscheiden sich kaum in der Grails Unterstützung. Hier entscheidet die persönliche Vorliebe über die IDE.

Links:
Diskussion zu diesem Thema auf stackoverflow.com

geschrieben von gklinkmann \\ tags: , , , ,

Jan 01


Einen ähnlichen Artikel habe ich vor einiger Zeit auch für meinen Ex – Lesezeichenverwalter del.icio.us geschrieben.

Mein neuer Dienstleister ist zootool. Über die Gründe des Wechsels habe ich ja erst vor kurzem geschrieben.
Wenn man sich in eine neue Abhängigkeit begiebt, sollte alles Gute erhalten bleiben. So bietet auch zootool über eine API den Zugriff auf die Lesezeichen.

Anders als bei del.icio.us werden die Ergebnisse einer Anfrage aber im JSON Format geliefert, womit das HTTPBuilder Modul von Groovy aber auch keine Probleme hat, wie das Beispiel gleich zeigen wird. Ein verschlüsseltes Passwort und ein API-Key sorgen zusätzlich für mehr Sicherheit.

So, lange genug geredet. Hier ist der Code für einen einfachen zootool Lesezeichen Client:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
package de.koo.groovy.rest
 
@Grab(group='org.codehaus.groovy.modules.http-builder', module='http-builder', version='0.5.1' )
 
import groovyx.net.http.* 
import groovy.util.slurpersupport.GPathResult 
import java.security.MessageDigest
import sun.misc.*
 
public class ZootoolBookmarkClient{
  def username
  def password
  def apikey
 
  public ZootoolBookmarkClient() {
    username="<username>"
    password="<password>"
    apikey="<apikey>"
  }
 
  static void main(args) {
    def dc=new ZootoolBookmarkClient()
    dc.request()
  }
 
  /**
   * Lesezeichen abfragen und Aufbereitung der Ergebnisse 
   * im HTML Format als definition list
   */
  public request () {
    def resp
 
    try {
      // Authentifizierung
      def url="http://zootool.com/api/users/items/?username=$username&apikey=$apikey"
 
      RESTClient rc = new RESTClient( url )
      rc.auth.basic (username.toLowerCase(), getEncodedPassword())
 
      // anfragen und überprüfen der Antwort
      def params=[:]   
      resp=rc.get(params)
 
      assert resp.status == 200
 
      println "<dl>"
      resp.data.each {item ->
        println "   <dt><a href=\"${item?.url}\">${item?.title}</a></dt>"
        println "      <dd>${item?.title}</dd>"
      }
      println "</dl>"
    } catch (e) {
      e.printStackTrace()
    }
  }
 
  /**
   * Passwort Verschlüsselung mit SHA-1 Algorithmus
   */
  public getEncodedPassword () {
    MessageDigest md = MessageDigest.getInstance('SHA-1')
    md.update(password.getBytes('UTF-8'))
 
    return (new BASE64Encoder()).encode(md.digest())
  }
}

Ich wünsche Euch allen (mit und ohne gepflegten Kater) ein frohes und gesundes Jahr 2011.

Zum Schluss noch ein paar hilfreiche Links:

zootool API-Key Generierung
zootool API Doku
Beispiel Code für PHP, Python und Objective-C

geschrieben von gklinkmann \\ tags: , ,