Samstag, 28. März 2009

Scala ist auch eine Oper

... aber natürlich vor allem eine funktionale, objektorientierte Programmiersprache für die Java Virtual Machine :-)

Scala hat das Zeug dazu, die nächste große Sprache nach bzw. neben Java zu werden. Viele Ausdrücke lassen sich in Scala einfacher und kürzer als in Java schreiben, dennoch bleibt die statische und starke Typisierung wie bei Java erhalten. Ein großes Plus ist zudem die nahtlose Integration mit den unzähligen bestehenden Java-Bibliotheken. Und Scala ist nicht wirklich neu und nur irgendwie gerade cool, sondern bereits acht Jahre alt und stabil.

Zum Einstieg verwendet man am besten Eclipse 3.4 (das "Classic"- oder "Java EE"-Paket). Ein JDK 5.0 oder neuer sollte bereits installiert sein. Nun fehlt nur noch das Scala-Plugin, das man in Eclipse im Menü Help > Software Updates... mit der Update-URL

http://www.scala-lang.org/scala-eclipse-plugin

herunterladen lässt.

Wechselt man in die Scala-Perspektive, kann man unter File > New ein neues "Scala Project" anlegen. Wie aus Java gewohnt legt man ein Paket an und in diesem Paket dann ein "Scala Object" (!). Richtig gelesen, Scala unterstützt nicht nur Klassen, sondern auch einzelne Objekte. Wenn wir dieses Objekt von Application erben lassen, entspricht das der main-Methode in Java:


Scala bietet Typinferenz, d.h. man muss beim Deklarieren einer Variablen nicht zwingend den Typ angeben, wenn Scala diesen aus dem Kontext eindeutig ableiten kann. Die Variable ist dann trotzdem zur Übersetzungszeit typsicher, man kann also keine inkompatiblen Werte zuweisen:


Wie bei funktionalen Sprachen üblich, liegt eine der Stärken in der Listenverarbeitung. Listen können mit einer Java-ähnlichen Syntax angelegt werden (es geht auch funktionaler, siehe erster Screenshot):

val früchte = List("Äpfel", "Birnen", "Orangen")

Entweder kann man die Liste dann mit einer Java 5-ähnlichen for-each-Schleife ausgeben:

for (frucht <- früchte) { println(frucht) }

Oder man nutzt ein anonymes Funktionsliteral, eine sogenannte Funktion höherer Ordnung, die man als Wert an die foreach-Methode der Liste übergibt:

früchte.foreach(f => println(f))

Da man den Punktoperator beim Methodenaufruf weglassen darf und println nur ein Argument erwartet, geht das auch noch kürzer:

früchte foreach println

Und immer daran denken: Auch wenn das so langsam nach einer Skriptsprache aussieht (und tatsächlich ähnlich schnell programmiert werden kann), haben wir hierbei statische, starke, vom Compiler geprüfte Typisierung!

Soweit fürs Erste, das sollte als Appetitanreger reichen :-)

Mittwoch, 25. März 2009

Monitoring und Profiling mit VisualVM

Am Wochenende habe ich einen kleinen Vortrag über VisualVM gehalten. Dieses nützliche Werkzeug ist seit dem Update 7 fester Bestandteil des JDK 6. Es bietet gute Überwachungsmöglichkeiten für laufende Java-Anwendungen (sowohl lokal als auch auf entfernten Rechnern). Beim Profiling kann es zwar nicht ganz mit kommerziellen Lösungen mithalten, bietet aber dennoch für viele Situationen vollkommen ausreichende Auswertungen (z.B. die Aufrufstellen einer Methode).

VisualVM benötigt Java 6 als Laufzeitumgebung, kann aber Anwendungen schon ab Java 1.4 überwachen. Faustregel: Je neuer die Laufzeitumgebung des auszuwertenden Programms ist und je lokaler sie läuft, desto bessere Informationen liefert VisualVM.

Leider liefert Apple VisualVM auch mit dem neuesten Update ihrer Java SE 6-Implementation nicht mit. Sofern man dieses Update eingespielt hat, kann man VisualVM 1.1.1 aber problemlos separat herunterladen und (durch Auspacken des ZIP-Archivs) installieren.

Da es gute Gründe gibt, als Standard-Java-Version unter Mac OS X derzeit noch 5.0 einzusetzen, muss man Java 6 beim Aufruf im Terminal explizit als Parameter angeben:

HeartOfGold:visualvm-1.1.1 much$ bin/visualvm --jdkhome /System/Library/Frameworks/JavaVM.framework/Versions/1.6/Home/ &


Das Profiling funktioniert mit der Apple-Java-Implementierung noch nicht wirklich zuverlässig... Eventuell ist ein älterer Bug immer noch nicht vollständig korrigiert. Immerhin stehen die Monitoring-Möglichkeiten komplett und stabil zur Verfügung.

Mit dem neuen "Memory Sampler"-Plugin können aber zumindest Live-Speichervergleiche (Deltas) ermittelt werden, was einen wichtigen Aspekt des Memory-Profilings abdeckt. Und der Memory Sampler läuft zum Glück auch unter Mac OS X.

Mittwoch, 18. März 2009

WebObjects-Anwendungen in Eclipse entwickeln

Still und heimlich hat Apple vor ein paar Wochen eine Anleitung veröffentlicht, wie man WebObjects-Anwendungen in Eclipse mit den WOLips-Plugins entwickelt.

Zur Erinnerung: WebObjects ist Apples Enterprise-Framework zur Entwicklung skalierbarer Web-Applikationen. Von NeXT bereits 1996 veröffentlicht, ist es heute die Software-Basis u.a. vom iTunes Store. 2001 wurde das bis dahin in Objective-C entwickelte Framework komplett neu geschrieben – in Java. Entsprechend kann WebObjects 5.x problemlos mit Java SE oder innerhalb eines Java EE-kompatiblen Servers genutzt werden.

Nachdem Apple 2006 die Weiterentwicklung der eigenen, auf Xcode basierenden Entwicklerwerkzeuge eingestellt hat, unterstützt und verwendet Apple nun WOLips, eine OpenSource-Plugin-Sammlung für Eclipse, die die WebObjects-Entwicklertools nachbildet.

Montag, 16. März 2009

Java EE und JavaFX für Mac OS X

Während nach wie vor Apple für das JDK (Java SE) unter Mac OS X verantwortlich ist und sich dabei nicht besonders gut um ältere Macs kümmert, sind andere Java-Technologien direkt von Sun für Mac OS X erhältlich:
Beide Produkte können ab Mac OS X 10.4 genutzt werden, sowohl auf Intel- als auch auf PowerPC-G5-Macs – sofern Apples aktuellstes Java 5.0-Update installiert ist.

Als JEE-Umgebung eignet sich natürlich auch der JBoss AS 5.0, der ebenfalls problemlos unter Mac OS X betrieben werden kann.

Donnerstag, 12. März 2009

Aktuelle Java-Versionen für Mac OS X

Im Netz taucht immer wieder die Frage auf, welche Java-Versionen aktuell unter Apples Mac OS X genutzt werden können – gerade wenn Java-Entwickler ihre Programme nicht selber auf einem Mac testen können.

Für Mac OS X 10.5 sind die Java-Versionen 1.4, 5.0 und 6 direkt von Apple verfügbar und können über die Softwareaktualisierung ins System eingebunden werden (als JDKs, es gibt von Apple keine separaten JREs). Unter Mac OS X 10.4 war zusätzlich noch Java 1.3 nutzbar, dafür hat Apple für diese ältere Betriebssystemversion kein Java SE 6 herausgebracht.

Aber Achtung: Gerade Java SE 6, also die einzige Version, die Ende dieses Jahres noch nicht EOL sein wird, steht nur für 64-Bit-Intel-Macs zur Verfügung. Das sind solche mit Core2Duo-Prozessor. PPC-Macs und ältere Intel-Macs mit CoreDuos bleiben leider außen vor...

Standardmäßig ist für Applets und Java Web Start-Anwendungen so oder so Java 5.0 eingestellt. Mit dem System-Utility /Programme/Dienstprogramme/Java/Java-Einstellungen kann man dies ändern (siehe Bildschirmfoto).

Fazit: Java 6 ist in der Apple-Welt für Endbenutzer leider immer noch nicht wirklich angekommen. Wenn Ihre Java-Applikationen von möglichst vielen Apple-Nutzern eingesetzt werden sollen, sollten Sie derzeit noch Java 5.0 als Mindestanforderung voraussetzen.

Und nun noch ein paar technische Details:

Die aktuellen JDKs für Mac OS X haben die Versionsnummern 1.4.2_18, 1.5.0_16 und 1.6.0_07. Sie können mit den Software-Updates Java for Mac OS X 10.4 Release 7 bzw. Java for Mac OS X 10.5 Update 2 installiert werden (es gibt mittlerweile auch Release 8 und Update 3, aber dadurch wird nur Java Web Start aktualisiert und nicht nicht JDK-Version verändert).

Das Java-Update für Mac OS X 10.5 installiert übrigens auch auf CoreDuo-Macs Java SE 6, nur leider lässt sich das auf diesen Rechnern trotzdem nicht ausführen...

Seit einigen Jahren pflege ich eine detaillierte Liste von Mac OS X- und deren Java-Versionen inkl. der entsprechenden Download-Links.

Unabhängig von Apples Java-Versionen gibt es mit SoyLatte seit einiger Zeit auch eine Portierung vom OpenJDK für Mac OS X. Damit kann Java SE 6 nicht nur unter Mac OS X 10.5, sondern auch unter 10.4 genutzt werden. Allerdings ist auch SoyLatte nur für Intel-Macs verfügbar, und für grafische Ausgaben wird das für Mac-Oberflächen unübliche X11 anstelle von Cocoa genutzt.

Bleibt zu hoffen, dass Sun es (mit Apples Hilfe?) ab Java 7 schafft, selber wieder ein vernünftiges JDK für Mac OS X herauszubringen.

Mittwoch, 4. März 2009

Das Swing Application Framework lebt!

Desktop-Anwendungen mit Java zu entwickeln, war schon immer so eine Sache... Zwar gibt es die Swing-Bibliothek seit Ewigkeiten und deren GUI-Komponenten sind auch recht brauchbar. Was aber fehlte, war ein Framework, mit dem man den ganzen Lebenszyklus einer Desktop-Applikation einfacher handhaben konnte.

Auch wenn im Laufe der Zeit mit der NetBeans Platform und Eclipse RCP Alternativen entstanden sind, wollte Sun mit dem Swing Application Framework (JSR 296) eine reine Swing-Lösung anbieten. Der Ansatz war gut, doch leider wurde es um diesen JSR in den vergangenen Monaten sehr still - so still, dass der JSR vor kurzem in den Status "inaktiv" versetzt wurde.

Nun hat sich einer der Sun-Entwickler zu Wort gemeldet und verkündet, dass nun wieder aktiv an Swing und dem Swing Application Framework (SAF) gearbeitet wird. In der letzten Zeit gab es offenbar einfach wichtigere Dinge (vermutlich JavaFX?) zu erledigen.

Bei den neuerlichen Aktivitäten ist interessant, dass nicht mehr nur MDI-Anwendungen unterstützt werden sollen, sondern explizit auch die vor allem unter Mac OS X verbreiteten SDI-Applikationen (und auch die beim Mac üblichen Menüzeilen ganz ohne offenes Dokument-Fenster). Das lässt hoffen, denn bisher war für solche GUI-Anpassungen ein nicht unerheblicher Mehraufwand nötig.

Man darf gespannt sein, ob das Swing Application Framework Bestandteil von Java 7 sein wird, dessen Veröffentlichung mittlerweile für 2010 vorgesehen ist.