Java-Applet wird nicht angezeigt, oder startet nicht

Aus Byte-Welt Wiki
Zur Navigation springenZur Suche springen

Kurz zu Java-Applets

Da Probleme mit der Ausführung von Applets im Byte-Welt-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 wird sie erweitert oder konkretisiert bzw. ergänzt.

Bisher konnten Probleme mit Java-Applets in nahezu allen Browsern festgestellt werden. Die häufigsten Ursachen sind im Folgenden beschrieben.

Warum verweigert mein Browser die Anzeige von Java-Applets?

Generell gilt: Ohne Java VM läuft kein Java-Applet und keine Java-Applikation!
Daher muss auf dem Rechner, der Java-Applets ausführen soll, eine ältere JRE (Java Plugin) von Oracle installiert sein, die unterhalb Version 9 liegt.

Mit Java 9 wurde die Unterstützung für Java-Applets eingestellt.

Auch für ältere Java-Plugins wird die Unterstützung durch die Browser-Hersteller schrittweise beendet.

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. Mehr zu Exceptions kann man im Artikel "Was ist eine Exception?" finden.

Ä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 Standard-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.

Es sollte auch bedacht werden, dass die Browser-Hersteller schrittweise die Unterstützung für Java-Applets in ihren Programmen einschränken oder ganz entfernen werden.

Mozilla Firefox hat seit Version 52 standardmäßig die Java-Unterstützung für Java 7 und 8 eingeschränkt und verweist zur Aktivierung von Java-Applets auf diese Hilfeseite: Wie sie Java verwenden, wenn es gesperrt wurde

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)

UnsupportedClassVersionError.jpeg

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

30% fallen auf verkehrt eingebundene Applets, nicht verfügbare Klassen, Packages oder Bibliotheken. 60% gehen auf nicht oder falsch signierte Applets, die kritischen Code auf dem Gastsystem ausführen sollen. Vor Java 7 Update 51 brauchte ein Applet oftmals gar nicht signiert zu werden, wenn man bspw. externe Grafikdateien richtig einbindet. Mehr darüber findet man auch hier: Grafikdateien in Applets laden und anzeigen. Seit dem besagten Update der JRE ist die Signierung von Applets Pflicht.

"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:

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)

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 JRE's/VM's von Sun für den Internet Explorer ab und durfte diese somit auch nicht implementieren. Es gab zwischen Microsoft und Sun wegen Java auch schon heftigen Streit vor Gericht aufgrund von Lizenzrechtsverletzungen 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 Web Start.

Um den Compiler des JDK 1.1.8 neben einem aktuellen Compiler der SDK's anzusprechen kann man für den Windows(TM)-PC eine Batchdatei erstellen, die den Classpath einstellt und das Applet kompiliert:

@echo off 
set CLASSPATH=.;c:\jdk1.1.8\lib\classes.zip 
c:\jdk1.1.8\bin\javac -O -deprecation MeinApplet.java 
pause

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 löste sich das Problem dann von allein. Viele Benutzer installierten dann in neueren Browsern ein Java-PlugIn von Oracle, wenn sie Applets ausführen wollten. Für Flash und Shockwave etc. taten sie es auch...

Oracle hat inzwischen mit der Änderung der Sicherheitsstrategie in Java-Applets die Java-Plugins für Browser außer Dienst gestellt. Browser, wie bspw. Firefox verbieten aus Sicherheitsgründen gar gänzlich die Ausführung von von Java-Applets.

Um den IE 6.0 zur Zusammenarbeit mit einer installierten Oracle-JRE zu bewegen war es nötig, 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)

Firefox 42 stürzt bei der Ausführung von Java-Applets ab.
Zur Lösung hat Oracle diese Hilfestellungen veröffentlicht: Java-Plugin funktioniert nicht in Firefox

In den Versionen ab Firefox 52 ist die Ausführung von Java-Applets vom Hersteller gesperrt worden.
Zur Lösung hat Mozilla diese Hilfestellung veröffentlicht: Wie Sie Java verwenden, wenn es gesperrt wurde

"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 eine ClassNotFoundException. Der AppletViewer und andere Browser starten das gleiche Applet ohne murren. Mit Opera 10.6x wurden die Probleme behoben.

Weitere Möglichkeiten

Java-Applets haben praktisch keine Bedeutung mehr im Internet. Es gibt viele gute Code-Beispiele, die mal als Applet geschrieben wurden. Damit die am Leben bleiben, kann man ein Applet auch in eine Desktop-Anwendung umschreiben. Wie das geht, wird hier erklärt: Java-Applet zu Java-Applikation umschreiben

Quellen