Webframeworks für JVM-Sprachen: Rails gegen Grails

Das Angebot an Webframeworks ist üppig, allerdings durch natürliche Selektion und veränderte Ansprüche kleiner als noch vor ein paar Jahren. Die Optionen verringern sich, wenn eine dynamisch typisierte JVM-Sprache zum Einsatz kommen soll.

In Pocket speichern vorlesen Druckansicht
Lesezeit: 21 Min.
Von
  • Dirk Lingstädt
Inhaltsverzeichnis

Das Angebot an Webframeworks ist üppig, allerdings durch natürliche Selektion und veränderte Ansprüche kleiner als noch vor ein paar Jahren. Die Optionen verringern sich, wenn eine dynamisch typisierte JVM-Sprache zum Einsatz kommen soll.

Möchten mit der Java Virtual Machine vertraute Programmierer bei der Webentwicklung in bekannten Territorien bleiben, landen sie bei der Framework-Suche schnell bei Rails mit JRuby und Grails mit Groovy. Dieser Artikel durchleuchtet hauptsächlich funktionale Aspekte der populären Kandidaten und blickt auf ihre Historie zurück. Außerdem wird betrachtet, was positiv heraussticht oder weniger gut gelungen ist, da nicht Features allein den Ausschlag bei der Wahl geben können. So gesehen, ist eine Gegenüberstellung von Webframeworks gar nicht so weit von den Vergleichstests entfernt, die in Autozeitungen zu finden sind.

Im Autobau teilen sich oft unterschiedliche Modelle und Hersteller gemeinsame Plattformen, um Entwicklungs- und Herstellungskosten zu sparen. In vielen IT-Projekten ist die JVM-Plattform gesetzt, die Auswahl der darauf laufenden Systeme ist wiederum relativ frei, sodass JRuby schon viele Jahre eine ernstzunehmende Option ist. JRuby wurde 2001 veröffentlicht und ist für eigentlich alle populären Ruby-Anwendungen einsetzbar (Rails seit 2006). Im Funktionsumfang ist es der Referenzimplementierung MRI (auch als CRuby bekannt) immer einen Schritt hinterher (das kommende JRuby 9000 wird kompatibel zu MRI 2.0 sein). Zudem erfordert es mehr Geduld beim Anwendungsstart, sodass JRuby beim lokalen Entwickeln eher gemieden wird.

Zudem fügt es sich nicht nahtlos in den Java-Kosmos ein, was beispielsweise die Unterscheidung von Ruby- und Java-Objekten oder das stets einzufügende require 'java' verdeutlichen. Viele Ruby-Plug-ins (Gems) funktionieren oder es gibt spezielle, mitunter veraltete, Wrapper Gems. Concurrency und Parallelisierung sind lange vernachlässigte Stiefkinder des MRI. Obwohl es inzwischen auf native OS-Threads setzt, sorgt der eingebaute Global Interpreter Lock (GIL) dafür, dass jeweils nur ein Thread läuft. Für echte Parallelisierung gibt man daher JRuby oder Alternativen wie Rubinius oder IronRuby den Vorzug.

Groovy wurde 2003 veröffentlicht und ist, nach einer längeren Dämmerphase, seit 2008 stabil. Nicht Grails allein ist das Zugpferd der Sprache, auch Gradle, Spock und Geb sind in dem Kontext bekannte Projekte. Groovy gilt zudem als geschliffene Fassung von Java und ist als reine JVM-Sprache nur im zugehörigen Ökosystem überlebensfähig, wo sie allerdings bestens integriert ist.

Java-Code ist, bis auf wenige Ausnahmen, syntaktisch valider Groovy-Code (JDK 7). Daher können Groovy- und Java-Klassen voneinander erben, ohne dass der Entwickler über Typ-Konvertierung oder Class-Loading stolpert. Was das Kompilieren und Typisieren angeht, erlaubt Groovy mit def und @CompileStatic beides – sogar im wilden Mix. Groovy-Neulingen erleichtert die Sprache so den Einstieg – auch in die Welt der dynamischen Sprachen.

Zum Vergleich der Sprachen folgen ein paar einfache Code-Beispiele in Ruby

(1..1000).inject(:+) # Summe aus Range
[49, 58, 82, 90].partition { |n| n > 60 } # Gruppieren
(z ||= []) << 'test' # 'z' lazy initialisieren
{first_name: 'Max'}[:last_name].downcase rescue "Musertmann"
assert "[%s]" % "Ruby, Ruby, Ruby" == '[Ruby, Ruby, Ruby]' # sprintf

und in Groovy

(1..1000).sum() // Summe aus Range
[49, 58, 82, 90].split { it > 60 } // Gruppieren
assert ['PHP', 'Java']*.size() == [3, 4] // Spread Operator
assert campaign.name ?: "Default" == campaign.name ? campaign.name :
"Default"
println(campaign?.product?.name) // Safe Navigation
Wissenswertes zu JRuby und Groovy
JRuby Groovy
Einführung 2001 (MRI Ruby 1995) 2003; stabil seit 2008
JVM-Plattform Portiert für die JVM,
extra Layer für Java-Integration
Designed für die JVM,
nahtlose Java-Integration
Editoren und IDEs Vim, Emacs, TextMate, Sublime, Eclipse, NetBeans, IntelliJ IDEA
Besonderheiten sehr schnelle Ruby-Implementierung,
dynamische Typisierung
Superset von Java, Typisierung optional,
statisch Kompilieren optional
Projekte und Libs Rails, Sinatra, Rspec, Rake, Bundler Grails, Spock, Gradle, Geb, GPars, Griffon

Webframeworks sind seit vielen Jahren De-facto-Standard für die moderne Webentwicklung, vor allem um den Boilerplate-Anteil zu reduzieren. Die herangezogenen Full-Stack-MVC-Webframeworks haben naturgemäß viele konzeptionelle Gemeinsamkeiten wie "Convention over Configuration" (CoC), "Don't Repeat Yourself" (DRY), Support für Rapid Prototyping von CRUD-Anwendungen (Create, Read, Update, Delete), Hot-Reloading sowie Unterstützung für Mehrsprachigkeit, Tests und Deployment. Integrierte Webserver wie Webrick in Rails oder Tomcat für Grails vereinfachen und beschleunigen das lokale Entwickeln.

Der Vorläufer von Ruby on Rails entstand bei der Entwicklung einer Projektmanagement-Anwendung (Basecamp), die im Wesentlichen durch David Heinemeier Hansson getrieben und ab 2005 stabil genug für den Projekteinsatz außerhalb seiner Firma wurde. Ruby verdankt Rails einen Großteil seines Erfolgs und Rails wiederum, abgesehen von seinen pragmatischen Ansätzen (REST statt SOAP etc.), die frühen Einsätze bei Diensten wie GitHub und Twitter. Gerade die Mikroblogging-Anwendung kratzte später allerdings erheblich am Ruf, als häufige Performance-Probleme auf Rails zurückgeführt wurden. Bedeutende architektonische Verbesserungen (unter anderem Modularisierung) folgten 2008, nach der Framework-Hochzeit mit Merb.

Groovy on Grails entsprang tatsächlich der Idee, eine mit Groovy arbeitende JVM-Alternative zu Rails zu entwickeln. Um Verwechselungen zu vermeiden und auf Drängen von Hansson wurde der Name später auf Grails reduziert. Die Open-Source-Entwicklung war immer schon kommerziell gesponsert (bis 05/2015 Pivotal). Das Interessante an Grails ist sicherlich, dass es im Grunde die gleichen modernen Konzepte wie Rails verfolgt, sie aber mit erprobten und umfangreichen Evergreens wie Java EE, Spring, Hibernate, Quartz und Sitemesh zusammenbringt.

Wissenswertes zu Ruby on Rails und Grails
Ruby on Rails Grails
Einführung (v1.0) 2005 2008
Lizenz MIT License Apache License 2.0
Reifegrad und Community Rails ist länger im Umlauf und verfügt über die größere Community Grails ist jünger als Rails und gefühlt weniger im Einsatz (diverse JVM-Konkurrenten)
Sprache und Plattform Ruby, plattformunabhängig (JVM: JRuby) Groovy, plattformunabhängig mit JVM
App-Server (Beispiele) Passenger (mod_rails) + nginx/Apache, Mongrel, Thin, Unicorn
JRuby + Warbler auf Java Application Server
Java Application Server (Tomcat, Glassfish, Jetty ...)
"Unter der Haube" Core-Extensions (Gems) u.a. ActiveRecord, ActiveSupport oder ActionPack u.a. Java EE, Spring, Hibernate, Sitemesh, Spock
Produktivität RAD, COC, DRY, Scaffolding ...
Testen Rspec, Cucumber, Minitest JUnit, Spock