Java-Applet wird nicht angezeigt, oder startet nicht
Inhaltsverzeichnis
- 1 Warum verweigert mein Browser die Anzeige von Java-Applets?
- 2 Änderung der Sicherheitsstategie in Java-Applets
- 3 Fehlersuche und Analyse
- 3.1 "Wie wird der AppletViewer aufgerufen?"
- 3.2 "Mein Applet läuft nicht im AppletViewer."
- 3.3 "OK, das Applet läuft im AppletViewer, aber nicht in meinem Browser."
- 3.4 "Mein Applet läuft nur in meiner Entwicklungsumgebung."
- 3.5 "Ich habe eine Fehlermeldung, dass mein Applet nicht gefunden werden kann."
- 3.6 "Und wie wird ein Applet richtig in eine HTML-Seite eingebunden?"
- 3.7 "Ich habe Probleme bei der Anzeige von Applets mit dem MS-Internet Explorer 6.0"
- 3.8 "Ich habe Probleme bei der Anzeige von Applets mit Firefox"
- 3.9 "Ich habe Probleme bei der Anzeige von Applets mit dem Opera-Browser"
- 4 Quellen
Warum verweigert mein Browser die Anzeige von Java-Applets?
Kurz zu Java-Applets: Applets sind kleine Java-Programme, die normalerweise in Webseiten eingebettet werden. Sie werden über ein Netzwerk mit der Webseite von einem Server auf den Client heruntergeladen und in einem Internet-Browser ausgeführt. Sie dienen u.a. dazu, die Funktionalität einer Webseite zu erweitern. Mehr zum Einbetten von Applets in Webseiten weiter unten.
Da Probleme mit der Ausführung von Applets im Forum schon häufiger angesprochen wurden, hier einige Antworten, die helfen können, die häufigsten Fragen zu beantworten und Fehler zu beseitigen oder zu umgehen. Diese Seite erhebt nicht den Anspruch auf Vollständigkeit. Gegebenenfalls werde ich sie auch erweitern oder konkretisieren, oder jemand aus dem Forum fügt Ergänzungen hinzu.
Bisher konnten Probleme mit Java-Applets in nahezu allen Browsern festgestellt werden. Die häufigsten Ursachen sind im Folgenden beschrieben.
Generell gilt: Ohne Java VM läuft kein Java-Applet und keine Java-Applikation! Daher sollte eigentlich inzwischen jeder Rechner eine aktuelle JRE von Oracle installiert haben.
Vereinzelt gibt es Probleme mit der 64bit-Version der JRE, wenn ein 32-Bit-Browser eingesetzt wird. Es kann also sein, dass der Wechsel von der 64bit-Version auf die 32bit-Version Abhilfe zu einem unvermittelt auftretenden Problem bringen kann. Sollte die Version der JRE nicht zur Browser-Version (32 Bit/64 Bit) passen kann eine ClassNotFoundException geworfen werden.
Änderung der Sicherheitsstategie in Java-Applets
Nachdem man in Java's Laufzeitumgebungen (JRE) der Versionen 6 und 7 mehrere Sicherheitslöcher gefunden hatte, die auch massiv ausgenutzt wurden, war Oracle in Zugzwang und führte radikale Veränderungen in den Sicherheitsmechanismen der JRE ein, die mit Java 7 Update 51 am 14. Januar 2014 veröffentlicht wurden.
Durch die Änderungen ergaben sich erhebliche Einschnitte bei der Ausführung von unsignierten sowie signierten Java-Applets durch standardmäßig höhere Sicherheitseinstellungen im Java Control Panel. Mit diesen Einstellungen haben Applets keine Möglichkeit mehr, ausgeführt zu werden.
Das heißt: so lange die im Artikel Java Applets und Java Web Start-Anwendungen starten - ab Java 7 Update 51 beschriebenen Maßnahmen nicht durchgeführt wurden, ist die weitere Lektüre dieses Artikels und einer Fehlersuche in Applets, der HTML-Seite oder im lokalen System überflüssig.
Fehlersuche und Analyse
Vorab noch ein Hinweis, weil ich bemerkt habe, dass das oft übersehen wird: Wenn Applets vom Browser nicht angezeigt werden, ist die Ursache des Problems in der Java-Console zu finden. Anhand der Fehlermeldung lässt sich das Problem schon sehr genau spezifizieren. Sollten sich bspw. in der Java-Console Ausgaben über eine ClassNotFoundException finden, wissen wir bereits, dass eine JRE installiert ist, weil der Java-Interpreter vom Browser gestartet wurde... Häufige Fehlermeldungen in der Java-Konsole sind neben der ClassNotFoundException z.B. die NullPointerException und die AccessControlException. Mehr zu Fehlertypen in Java gibt es hier: Was ist eine Exception?
Ob eine JRE-Installation von überall aus dem System benutzbar ist, lässt sich mit folgendem Befehl, den wir in die Eingabeaufforderung/Shell eintippen, ermitteln:
java -version
In der Ausgabe sollten sich nun Versionsdaten über die installierte VM finden. Anderenfalls sollte der Pfad zum JRE überprüft werden.
Auch wenn jetzt auf der Kommandozeile eine Fehlermeldung vom Betriebssystem ausgegeben wird, muss das nicht bedeuten, dass es keine oder nur eine defekte JRE gibt.
Ein kleiner Test zeigt, ob es eine funktionstüchtige JVM auf dem System gibt, mit der der Browser zusammenarbeitet.
Mehr zur Einrichtung einer Java-Installation gibt es hier: Installation und Einrichtung der Java Laufzeitumgebung (JRE)
Wenn der Quellcode des Programms ohne Fehler kompiliert wurde, heißt das noch nicht, dass das Applet auch im Browser seinen Dienst verrichtet. Deshalb ist der erste Ansatzpunkt, einen Fehler zu suchen, der AppletViewer, der jedem SDK/JDK beiliegt.
"Wie wird der AppletViewer aufgerufen?"
Der AppletViewer kann von der Konsole (Eingabeaufforderung) oder per Batchdatei aufgerufen werden. Dazu folgenden Befehl eintippen:
appletviewer [optionen] htmldatei.html
Bitte beachten: Der Pfad zu den Tools des JDK muss dem System bekannt sein.
Wenn das Applet hier läuft, im Browser aber nicht, kann u.U. auch der Browser am Probelm beteiligt sein. Ältere Browser wurden vor einiger Zeit noch mit veralteten oder modifizierten VM's, die inkompatibel sind oder Fehler enthalten vertrieben. In einigen Fällen kann darin auch ein Grund für Probleme bei der Anzeige von Java-Applets zu suchen sein. Heute sind in fast allen Fällen Programmierfehler dafür verantwortlich. Auf jeden Fall muss im Browser die Fähigkeit Java-Applets auszuführen aktiviert sein. Am besten ist es, immer eine aktuelle Browser-Version mit einer aktuellen JRE installiert zu haben.
"Mein Applet läuft nicht im AppletViewer."
Dann liegt meist ein Fehler im Code des Programms oder der HTML-Seite vor, der erst zur Laufzeit die Initialisierung bzw. die Ausführung verhindert. Die Fehlermeldung in der Java-Konsole gibt mehr Aufschluss über die Art des Fehlers.
Folgende Fragen sollten mit "Ja" beantwortet werden können:
- Erbt die Klasse, die in die Webseite eingebunden werden soll von Applet bzw. JApplet?
- Wird mindestens die init()-Methode aus Applet überschrieben?
- Sind auch die anonymen, vom Compiler erzeugten Klassen im Sichtbarkeitsbereich des Interpreters?
- Ist das Applet entsprechend dieser Anleitung in die Webseite eingebunden?
- Wird das Applet mit einer kompatiblen JRE ausgeführt? (Java-Bytecode ist nicht abwärtskompatibel)
- Ist die Ausgabe in der Java-Console ohne Fehler?
"OK, das Applet läuft im AppletViewer, aber nicht in meinem Browser."
Das kann verschiedene Ursachen haben und ist teilweise auch vom Browser abhängig. Aufschluss über die Art des Fehlers gibt in den meisten Fällen die Browser-Statuszeile oder die Java-Console. Wichtig: Java in den Browser-Einstellungen aktivieren!
"Mein Applet läuft nur in meiner Entwicklungsumgebung."
Es kam vor, dass das Applet zwar innerhalb der Entwicklungsumgebung lief, aber dann weder im Browser noch im AppletViewer angezeigt werden konnte. In 30% der Fälle kann hier ein Versionskonflikt vorliegen.
Das Applet wurde z.B. in der IDE mit einem aktuellen JDK kompiliert, dann aber mit einer früheren JRE-Version versucht auszuführen.
Java Bytecode ist nicht abwärtskompatibel, auch wenn im Quellcode die jeweils neuen Features des JDK nicht genutzt, oder nur Klassen und Methoden von älteren Java-Versionen verwendet wurden.
Es kommt dann zu einer solchen oder ähnlichen Ausgabe: java.lang.UnsupportedClassVersionError: Klassenname (Unsupported major.minor version 49.0)
Weiterhin oft zu sehen:
java.lang.reflect.InvocationTargetException
Wird häufig geworfen, wenn Bilder und Grafikdateien mit java.awt.Toolkit eingebunden werden.
Toolkit sollte auf keinen Fall zum Einbinden von Bildern in Applets und für Applikationen nur noch unter AWT und dann auch nur noch für ältere JREs benutzt werden.
java.security.AccessControlException
Wird immer dann geworfen, wenn gegen das Sandbox-Modell verstoßen wird.
Häufige Programmierfehler, die hier gemacht werden sind z.B.:
- der Versuch die VM zu beenden
- auf Dateien im Betriebssystem des Clients zugreifen (z.B. Bilder oder Textdateien)
- häufig also auch das Laden von Bildern mit
Toolkit#getImage()
- der Versuch, Verbindungen zu einem anderen Rechner oder einer Datenbank aufzubauen
- der Versuch, Informationen über den Client-Rechner oder den Benutzer auszulesen
50% fallen auf verkehrt eingebundene Applets, nicht verfügbare Klassen, Packages oder Bibliotheken. 20% gehen auf nicht oder falsch signierte Applets, die kritischen Code auf dem Gastsystem ausführen sollen. Oftmals braucht ein Applet gar nicht signiert zu werden, wenn man bspw. externe Grafikdateien richtig einbindet. Mehr darüber findet man auch hier: Grafikdateien laden und anzeigen
"Ich habe eine Fehlermeldung, dass mein Applet nicht gefunden werden kann."
Oftmals treten diese Probleme im Zusammenhang mit verkehrt eingebundenen Applets auf. Hier mal eine beispielhafte Fehlermeldung aus der Java-Console: <code=ini>Laden: Klasse applets.HelloWorld.class nicht gefunden java.lang.ClassNotFoundException: applets.HelloWorld.class
at sun.applet.AppletClassLoader.findClass(Unknown Source) at java.lang.ClassLoader.loadClass(Unknown Source) at sun.applet.AppletClassLoader.loadClass(Unknown Source) at java.lang.ClassLoader.loadClass(Unknown Source) at sun.applet.AppletClassLoader.loadCode(Unknown Source) at sun.applet.AppletPanel.createApplet(Unknown Source) at sun.plugin.AppletViewer.createApplet(Unknown Source) at sun.applet.AppletPanel.runLoader(Unknown Source) at sun.applet.AppletPanel.run(Unknown Source) at java.lang.Thread.run(Unknown Source)</code=ini>
Da wir hier nicht einen Error sondern eine Exception geworfen bekommen, wissen wir bereits, dass es eine JRE gibt, die auch gestartet wurde, um das Applet auszuführen. Der Fehler muss nun also nun z.B. dort gesucht werden, wo das Applet eingebunden wurde: im Quelltext der Webseite.
Auch der Einsatz der 64-Bit-JRE-Variante in einem 32-Bit-Browser kann eine ClassNotFoundException provozieren.
"Und wie wird ein Applet richtig in eine HTML-Seite eingebunden?"
Einbinden von Applets in HTML-Dateien
"Ich habe Probleme bei der Anzeige von Applets mit dem MS-Internet Explorer 6.0"
Alle MS-Internet Explorer bis Version 6.0 implementierten eine recht alte JVM, die teilweise auch noch modifiziert wurde und unter anderem nicht mehr vollständig dem Java-Standard von Sun entsprach. Microsoft lehnte früher die Lizensierung der aktuellen JRE's/VM's von Sun für den Internet Explorer und durfte diese somit auch nicht implementieren. Es gab zwischen Microsoft und Sun wegen Java auch schon heftigen Streit vor Gericht aufgrund von Lizenzrechtverletzungen seitens Microsoft.
Sun entwickelte für alle Plattformen Java-PlugIns, die den Betrieb von Java-Applets in den verschiedenen Browsern sicher stellen sollten. Es gab lange IE-Benutzer, die sich nicht die Mühe machten, das passende PlugIn für ihr System herunter zu laden und zu installieren. Aus welchem Grund auch immer. Bei diesen Benutzern funktionierte ein Applet, welches beispielsweise Swing-Components oder andere nicht in der alten VM implementierte Klassen benutzte, nicht. Selbst wenn das Applet nur aus Klassen des JDK/SDK vor Version 1.2.2 (Java 2) bestand, es aber mit einer aktuellen SDK-Version von Sun kompiliert wurde, verweigerte das Applet den Dienst im IE. Wenn für den IE eine aktuelle JRE von Sun installiert und aktiviert war, machten Java-Applets eigentlich bei der Ausführung im IE keine Probleme. Allerdings waren die von Microsoft in älteren Betriebssystemen eingesetzten VMs nicht mit der von Sun kompatibel. Es gab zu dieser Zeit nur eine befriedigende Lösung, um ein Maximum an Kompatibilität zu erreichen und somit für das Problem: Entweder wurde immer ein aktuelles JRE zu verlangt, was nicht ganz benutzerfreundlich war, oder man entwickelte bzw. kompilierte Applets, die für den Betrieb im Internet vorgesehen waren, nur mit der Sun JDK-Version 1.1.8. Die VM-Version, die der IE 6.0 implementierte war weitestgehend mit dieser kompatibel. Auch IE's mit installiertem aktuellen Java-PlugIn von Sun hatten bei der Anzeige keine Probleme (Abwärtskompatibilität). Alternativ setzte man auch gleich auf Java Webstart.
Um den Compiler des JDK 1.1.8 neben einem aktuellen Compiler der SDK's anzusprechen hat man für den Windows(TM)-PC eine Batchdatei erstellt, die den Classpath einstellte und das Applet kompilierte: <code=ini>@echo off set CLASSPATH=.;c:\jdk1.1.8\lib\classes.zip c:\jdk1.1.8\bin\javac -O -deprecation MeinApplet.java pause</code=ini>
Alternativ bestand auch die Möglichkeit, ohne das JDK 1.1.8, also bei einer installierten Version eines Sun-Java-SDK kompatiblen Bytecode zu kompilieren, den auch der IE interpretieren konnte.
Dazu folgender Befehl: javac MeinApplet.java -target 1.1
Die Ausführung der Compiler-Option funktioniert aber nur bis einschließlich Java Version 1.4.2.
Wenn du dein Applet bspw. mit dem JDK 1.5 geschrieben hast, es aber Java 1.1 kompatibel kompilieren willst, benutzt du folgenden Befehl dazu:
javac -target 1.1 -source 1.2 MeinApplet.java
Der Compiler akzeptiert dann zum Kompilieren nur Klassen und Methoden bis zum JDK 1.2 (Java 2) und erzeugt Bytecode, der mit JREs ab Version 1.1.8. lauffähig ist.
Wenn Du auf bestimmte aktuelle Funktionen von Oracle Java-Klassen nicht verzichten kannst oder willst, solltest Du auf jeden Fall eine Download-Möglichkeit für das aktuelle Java-PlugIn auf Deinen Webseiten bereit stellen.
Mit dem Aussterben des IE 6.0 im Zusammenhang mit Windows 98, ME, NT, 2000 und XP wird sich das Problem von allein lösen. Die Benutzer sind quasi gezwungen ein Java-PlugIn von Oracle zu installieren, wenn sie Applets ausführen wollen. Für Flash und Shockwave etc. machen sie es ja auch...
Um den IE 6.0 zur Zusammenarbeit mit dem Oracle-JRE zu bewegen kann es nötig sein, in den Browser-Einstellungen die MS-VM zu deaktivieren.
"Ich habe Probleme bei der Anzeige von Applets mit Firefox"
Die Firefox-Version 3.6.14 enthält einen Bug, der es ihr unmöglich macht, Java-Applets auszuführen. Statt eines Applets im Browser erhält man bspw. ClassNotFoundExceptions und NullPointerExceptions in der Java-Konsole. Das wenige Tage später erschienene Update 3.6.15 behob diesen Fehler.
In den Versionen ab Firefox 17 kann es zu Störungen beim Ausführen von Java-Applets kommen. Mozilla wollte auf Grund der anhaltenden Probleme mit der Sicherheit der JREs, das PlugIn für die Ausführung von Java-Applets deaktivieren. (Bericht von golem.de)
"Ich habe Probleme bei der Anzeige von Applets mit dem Opera-Browser"
In den Versionen bis 7.54 habe ich mal einen Fehler gefunden. Es klingt merkwürdig, war aber so. Opera dieser Version kann Applets die lokal auf der Festplatte in einer jar-Datei gespeichert sind nicht ausführen. Das gleiche Applet von einem Webserver herunter geladen, läuft hingegen tadellos. Verschiedene Tests ergaben schließlich, dass Opera in der lokalen Umgebung scheinbar das Archive-Attribut des Applet-Tags ignoriert.
Mit Opera 8.0 ist dieser Fehler aber entfernt worden. Allerdings hat der Opera ab Version 8.0 Probleme bestimmte Applets auszuführen. In der Java-Console finden sich ab und zu Fehlermeldungen, wo der Internet Explorer und Mozilla/Firefox tadellos funktionieren. Betroffen sind Applets ab Java 1.0.
Mit dem Opera 9.0 wurden alle bisher angesprochenen Probleme offenbar gelöst.
Seit Opera 10.5x gab es wieder Probleme mit lokalen Applets, welche nicht ausgeführt werden und Opera meldet ClassNotFoundExceptions. Der AppletViewer und andere Browser starten das gleiche Applet ohne murren. Mit Opera 10.6x wurden die Probleme behoben.