Plattformunabhängigkeit und java.awt.Desktop

Da ich zur Zeit an einem kleinen Open Source Projekt werke, TrayRSS, teste ich verschiedenste Sachen im Bezug auf die Anforderungen die sich mir durch die gewünschte Funktionalität des Projekts stellen. Unter anderem möchet ich dabei einen Eintrag eines RSS Feeds im Standardbrowser des Systems öffnen.

import java.awt.Desktop;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;

public class OpenBrowser {

	public static void main(String[] args){
		URI uri;
		try {
			uri = new URI("http://god.sprossenwanne.at");
			Desktop.getDesktop ().browse (uri);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (URISyntaxException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

Damit wird über die API java.awt.Desktop auf den Standardbrowser zugegriffen, doch leider nicht mit dem gewünschten Erfolg:

WindowsXP:
erfolgreich

Max OS:
noch nicht getestet

Arch Linux Gnome:
erfolgreich

Arch Linux KDE4:
Exception in thread "main" java.lang.UnsupportedOperationException: Desktop API is not supported on the current platform
at java.awt.Desktop.getDesktop(Desktop.java:126)
at OpenBrowser.main(OpenBrowser.java:14)

Kanotix KDE3:
java.io.IOException: Failed to show URI:http://god.sprossenwanne.at
at sun.awt.X11.XDesktopPeer.launch(XDesktopPeer.java:75)
at sun.awt.X11.XDesktopPeer.browse(XDesktopPeer.java:64)
at java.awt.Desktop.browse(Desktop.java:368)
at OpenBrowser.main(OpenBrowser.java:14)

Also eher suboptimal die Sache. Plattformunabhängigkeit ist auf [1] wie folgt definiert

Plattformunabhängigkeit ist die Eigenschaft eines Programms, auf verschiedenen Computersystemen mit Unterschieden in Architektur, Prozessor, Compiler, Betriebssystem und weiteren Dienstprogrammen, die zur Übersetzung oder Ausführung notwendig sind, lauffähig zu sein. Der Grad der Plattformunabhängigkeit wird als Portabilität bezeichnet (vom englischen „portability“). Dabei versteht man darunter nicht nur die bestehende Plattformunabhängigkeit, sondern auch den eingeschätzten Arbeitsaufwand, der benötigt würde, um das Programm in ein vollständig plattformunabhängiges umzuwandeln. Dieser Vorgang wird Portierung genannt.

Plattformunabhängig ist Java somit eigentlich, da ich aber überall individuelle Fehler bekommen hab ist der Grad der Portabilität wohl eher gering, zumindest in dem Fall.

————-

Update vom 17.05.2009:

Die Plattformunabhängigkeit und der Unterschied zwischen Gnome und KDE4 ist eine Interessante Sache.

So siehts z.B. unter KDE4 aus

openjdk 6
Exception in thread "main" java.lang.UnsatisfiedLinkError: Can't load library: /usr/lib/jvm/java-6-openjdk/jre/lib/i386/xawt/libmawt.so
at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1666)
at java.lang.Runtime.load0(Runtime.java:787)
at java.lang.System.load(System.java:1022)
at java.lang.ClassLoader$NativeLibrary.load(Native Method)
at java.lang.ClassLoader.loadLibrary0(ClassLoader.java:1767)
at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1684)
at java.lang.Runtime.loadLibrary0(Runtime.java:840)
at java.lang.System.loadLibrary(System.java:1047)
at sun.security.action.LoadLibraryAction.run(LoadLibraryAction.java:67)
at sun.security.action.LoadLibraryAction.run(LoadLibraryAction.java:47)
at java.security.AccessController.doPrivileged(Native Method)
at java.awt.Toolkit.loadLibraries(Toolkit.java:1614)
at java.awt.Toolkit.(Toolkit.java:1636)
at java.awt.Desktop.isDesktopSupported(Desktop.java:169)
at java.awt.Desktop.getDesktop(Desktop.java:143)
at OpenBrowser.main(OpenBrowser.java:14)

sun-java-6
Exception in thread "main" java.lang.UnsupportedOperationException: Desktop API is not supported on the current platform
at java.awt.Desktop.getDesktop(Desktop.java:126)
at OpenBrowser.main(OpenBrowser.java:1

[1] http://de.wikipedia.org/wiki/Plattformunabh%C3%A4ngigkeit

Ähnliche Artikel:

Unreachable Statement oder false == true

Schonmal ein Return zu früh in einer Methode niedergeschrieben und durch den compiler gejagt? „unreachable Statement“ Ja die Zeile direkt dahinter kann ja gar nie gelesen werden, das darf nicht sein!
Vergleicht amn aber

true

mit

false

sieht das der Compiler nicht mehr so eng.

Schonmal ein Return zu früh in einer Methode niedergeschrieben und durch den compiler gejagt? „unreachable Statement“ Ja die Zeile direkt dahinter kann ja gar nie gelesen werden, das darf nicht sein!
Vergleicht amn aber true mit false sieht das der Compiler nicht mehr so eng.

/**
* TrueFalse
* @author fake
* Wenn ein Return zu früh in einer Methode steht
* schreit der Compiler
* "Unreachable Statement"
* Bei true==false nicht.
* (Einfach den Methodenaufruf und die Methode
* auskommentieren.)
*/
public class TrueFalse {

   /**
   * @param args
   */
   public static void main(String[] args) {
      if(false == true){
         System.out.println("TRUE!");
      }
      else System.out.println("FALSE!");
      test();
   }
   public static int test(){
      return 1;
      System.out.println("HA");
   }
}

Ähnliche Artikel: