Applet JApplet per html einbinden - Main class kann nicht gefunden werden

Förster44

Mitglied
Hallo,
ich weiß, dass das im Titel erwähnte Problem ein sehr banales Thema ist. Allerdings habe ich in der vergangenen Stunde gefühlte 2 Dutzend Tutorials, FAQs und Problembehandlungen durchsucht ausprobiert und und nichts davon hat geholfen :-S
Hier also mein Problem: Ich habe in den letzten Wochen ein kleines JApplet gebastelt und bislang immer per Eclipse getestet. Nun wollte ich daraus eine einbindbare .jar-Datei machen, also hab ich mir einfach alle Dateien aus dem bin-Verzeichnis meines Projekts geschnappt, als .zip komprimiert und das dann in ein .jar-Archiv "umbenannt" (irgendwo hab ich gelesen dass man das so machen kann, ich weiß aber nicht mehr wo). Dann hab ich mir mit Hilfe von Anleitungen im Web folgende html-Datei geschrieben:
HTML:
<!DOCTYPE HTML>
<html><body><applet archive="bin.jar" code="Craftris.class" "width="512" height="512" />
</applet></body></html>
Wenn ich diese nun ausführe, kommt mir im Browser (Mozilla Firefox) die berühmt-berüchtigte Fehlermeldung, dass die Klasse beim Laden nicht gefunden werden konnte.
Die Dateinamen habe ich mehrfach überprüft, an Tippfehlern kann es ganz sicher nicht liegen.
Verlege ich die .html-Datei aber direkt in den Ordner in dem die ganzen .class-Dateien drinliegen, funktioniert es plötzlich einwandfrei, auch ganz ohne die .jar-Datei ...

Versuchte Problemlösungen:
- Packages sollen eine Fehlerquelle sein können, aber ich nutze keine Packages und glaube darum nicht dass es daran liegt, da meine .class-Dateien ja direkt ohne Subordner in der .jar rumliegen ...
- Die .jar-Datei wollte ich auch mal von Eclipse generieren lassen, aber das wollte mein JApplet nicht ohne eine main()-Methode kompilieren, und das ist bei JApplets ja nicht der Sinn der Sache ...
- Mit <object> statt mit <applet> hat mir auch nichts geholfen, der Fehler blieb gleich ...

Also wie gesagt, ich hab zwar schon selbst meine Suchmaschinen rauchen lassen, nur bewog mich mein Problem mir scheinbar eher speziellerer Natur dann dazu, hier um Rat zu fragen 😉
 
Verlege ich die .html-Datei aber direkt in den Ordner in dem die ganzen .class-Dateien drinliegen, funktioniert es plötzlich einwandfrei
Das widerspricht sich irgendwie. Du hast die class-Dateien ja nicht mehr in Ordnern liegen, sondern in einem jar-Archiv.

Falls Du meintest, dass die html-Datei in einem anderen Ordner liegt, als das jar-Archiv, dann ist die Ursache klar. Du musst
Code:
archive="bin.jar"
so anpassen, dass es von der html-Seite aus gefunden wird. Beispiel:
Code:
index.html (liegt im root-Verzeichnis, hier soll das Applet angezeigt werden)
/jars/bin.jar
==> archive="jars/bin.jar"
 
Das widerspricht sich irgendwie. Du hast die class-Dateien ja nicht mehr in Ordnern liegen, sondern in einem jar-Archiv.

Falls Du meintest, dass die html-Datei in einem anderen Ordner liegt, als das jar-Archiv, dann ist die Ursache klar. Du musst archive="bin.jar" so anpassen, dass es von der html-Seite aus gefunden wird.

Ich meinte dass wenn ich die Fehlermeldung bekomme, das .jar-Archiv und die html-Datei im gleichen (ansonsten leeren) Ordner sind. Mit dem Ordner mit den class-Dateien drin bezog ich mich auf einen anderen Ordner (den bin-Ordner meines Eclipseprojektes), von dem aus es dann fehlerfrei läuft, wie gesagt merkwürdigerweise auch ohne Archiv...
Ich hoffe dass ich mich jetzt nicht schon wieder unklar ausgedrückt habe 😉
 
OK, html-Datei und jar liegen im selben Ordner. Dann passt der Tag schonmal. Wie sieht denn Dein zip aus? Liegen hier die class-Dateien direkt drinnen (so wäre es richtig)? Oder hast Du vielleicht aus Versehen die Ordnerstruktur mit gezipped?
 
Ich bin mir ziemlich sicher dass die .class-Dateien direkt in der .jar Datei drinliegen, schau aber trotzdem mal kurz nach, mal schauen was Tante Edith dazu meint ...

... ok, Tante Edith hat mich erstmal geschimpft weil ich die java.policy.applet-Datei besser nicht hätte in das Archiv mitreinnehmen sollen ... damit hat sich das also 😳
Allerdings habe ich dafür gleich zwei andere Probleme:
1. Wenn ich den Tab mit dem Applet schließe und daraufhin die .html-Datei neu öffne, hängt sich der Firefox kurz auf und wenn er wieder pässlich ist tut sich gar nichts mehr in dem Tab mit meinem Applet (auch wenn ich dieses wieder schließe und neu öffne, das gleiche), die anderen Tabs kann ich aber weiterhin nutzen. Erst wenn ich den Firefox schließe, den weiterlaufenden Firefox(-geist?)-Prozess per Taskmanager abschieße und dann neustarte, kann ich auch meine html-Datei wieder ausführen - aber auch nur einmalig, sonst wiederholt sich der ganze Ärger. Hat das eine bestimmte Ursache? Wie kann ich dagegen vorgehen?

2. Bekomme ich SecurityExceptions wenn ich in meinem Applet "System.setProperty(...)" nutzen möchte (und es per html starte, in Eclipse freilich funktionierts). Was kann ich da machen? Ich habe zwar gelesen dass NetBeans dafür Extrafunktionen bietet, aber in Eclipse ... ?
 
Zuletzt bearbeitet:
also hab ich mir einfach alle Dateien aus dem bin-Verzeichnis meines Projekts geschnappt, als .zip komprimiert und das dann in ein .jar-Archiv "umbenannt" (irgendwo hab ich gelesen dass man das so machen kann, ich weiß aber nicht mehr wo)
Kann durchaus sein, dass du das in diesem Forum gelesen hast. Diese Vorgehensweise habe ich auch schon mal empfohlen.


Die Dateinamen habe ich mehrfach überprüft, an Tippfehlern kann es ganz sicher nicht liegen.
Verlege ich die .html-Datei aber direkt in den Ordner in dem die ganzen .class-Dateien drinliegen, funktioniert es plötzlich einwandfrei, auch ganz ohne die .jar-Datei ...
Ja, das sind dann wahrscheinlich Probleme, die nichts mit dem Einbinden oder der Jar-Datei des Applets zu tun haben. Ich vermute hier erstmal, ohne mehr zu wissen, dass es sich um ein Problem beim Einbinden von Rescourcen (Bilder etc.) handelt.


Wie kann ich dagegen vorgehen?
Zu allererst solltest du die Ausgaben deiner Java-Console auf Fehlermeldungen überprüfen.
Dieser FAQ-Beitrag kann helfen, viele Stolpersteine zu umgehen: http://www.java-forum.org/applets/4482-verweigert-browser-anzeige-java-applets.html
Hast du Bilder eingebunden? Wenn ja, wie? Code?

2. Bekomme ich SecurityExceptions wenn ich in meinem Applet "System.setProperty(...)" nutzen möchte (und es per html starte, in Eclipse freilich funktionierts). Was kann ich da machen?
Was genau möchtest du nutzen? Für unsignierte Applets verbotene Ausgaben kannst du dir mal hier ansehen: SystemInfo-Applet (signiert) - java-forum.org

Wenn du wirklich unbedingt diese, für den Benutzer deines Applets, potentiell kritischen Operationen benötigst, musst du das Applet signieren: http://www.java-forum.org/applets/16717-applets-webstart-anwendungen-signieren.html
 
Zu allererst solltest du die Ausgaben deiner Java-Console auf Fehlermeldungen überprüfen.
Dieser FAQ-Beitrag kann helfen, viele Stolpersteine zu umgehen: http://www.java-forum.org/applets/4482-verweigert-browser-anzeige-java-applets.html
Hast du Bilder eingebunden? Wenn ja, wie? Code?

Mein Browser kann Applets eigentlich anzeigen, dieses Test-Applet hab ich auch schon vorher mal aufgerufen (es funktionierte) und beim ersten Ausführen meines Applets funktioniert ja auch alles ... bloß ab dem zweiten halt nicht mehr ohne umständlichen Neustart ...

Bilder habe ich als BufferedImages eingebunden, welche ich mit ImageIO.read() einlese, z. B.
Code:
Background = ImageIO.read(getClass().getResource("GUI/Background.png"));
.
Liegt da etwa das Problem?

Edit: Ich hab mir mal die Fehlerkonsole angeschaut, die hat da leider gar nix zu vermelden 🙁
Beim >1. Mal starten erscheint der typische Java-Ladebalken (diese Tasse Kaffe mit Ladekreis drumherum^^) und hängt sich dann auf ...
 
Zuletzt bearbeitet:
Code:
Background = ImageIO.read(getClass().getResource("GUI/Background.png"));

Liegt da etwa das Problem?
Ja, der Pfad zur Resource stimmt nicht. Es geht immer von Root aus, d.h. der Pfad muss immer mit einem "/" beginnen. Außerdem müsste es ein package "GUI" geben, in dem das Bild liegt. In dem geöffneten jar ist das ein Ordner GUI. Da packages in Java mit einem Kleinbuchstaben anfangen und Du Eclipse benutzt, welches Dich bei einem Package namens GUI darauf hingewiesen hätte, glaube ich nicht, dass es das Package so gibt. Fall ja, wäre der richtige Pfad "/GUI/Background.png"
 
Ja, der Pfad zur Resource stimmt nicht. Es geht immer von Root aus, d.h. der Pfad muss immer mit einem "/" beginnen. Außerdem müsste es ein package "GUI" geben, in dem das Bild liegt. In dem geöffneten jar ist das ein Ordner GUI. Da packages in Java mit einem Kleinbuchstaben anfangen und Du Eclipse benutzt, welches Dich bei einem Package namens GUI darauf hingewiesen hätte, glaube ich nicht, dass es das Package so gibt. Fall ja, wäre der richtige Pfad "/GUI/Background.png"

Aber er findet die Bilder doch schon so, ich meine, wenn er sie beim Starten über Eclipse findet und auch beim ersten Mal Starten über die html-Datei kann es doch daran schlecht liegen, oder ... ?

Edit: Ich hab jetzt mal an alle Pfade noch ein '/' davor gemacht, es funktioniert zwar weiterhin alles das vorher auch funktioniert hat (vermutlich macht irgendeine der aufgerufenen Methoden automatisch ein '/' davor wenns fehlt^^), das hat an meinem Problem mit dem "nach dem ersten Start nicht ohne Neustart des Firefoxes samt Prozessbeendung mit dem Tasmanager erneut ausführbaren JApplet, da es sich sonst beim Laden aufhängt" :-S
 
Zuletzt bearbeitet:
Lies dir die geposteten Links durch und zeige bitte endlich mal den Inhalt deiner Console, wenn du das Applet gestartet hast!


Die geposteten Links hab ich überflogen, danke schon mal 😉
Das mit dem Signieren werd ich mir noch genauer anschauen, aber die Sachen, auf die ich versuche zuzugreifen, sehen da gar nicht soo verboten aus:
Code:
System.setProperty("sun.java2d.transaccel", "true");
System.setProperty("sun.java2d.ddforcevram", "true");
System.setProperty("sun.java2d.opengl", "true");

Optimal wäre hier natürlich zu hören (oder lesen 😉 ) dass diese Zeilen unnötig sind und jene Properties (mittlerweile) schon von default aus so gesetzt sind, da ich da ein mittlerweile recht altes Tutorial zu durchgegangen bin^^

Nur die Java Konsole ... wo genau kann ich die öffnen? :rtfm:
 
Zuletzt bearbeitet:
Das ist vom System abhängig. Ich nehme an, dass du ein Windows nutzt?
Nicht immer wird die Java-Console automatisch in einem sichtbaren Bereich geöffnet.
U.U. musst du auch in den Einstellungen des Java-PlugIns etwas ändern, damit die Console in den Vordergrund kommt.

Probiers mal so: Systemsteuerung öffnen -> Java
Und dann, zumindest so lange das Problem besteht, folgende Einstellungen vornehmen:

l-ectron-x-albums-bilder-beitraegen-picture249-java-control-panel.png
 
Solange die Java-Konsole geöffnet ist, besteht seltsamerweise kein Problem, ich kann mein Applet beliebig oft öffnen oder schließen (nur nicht zu schnell hintereinander, wenn der Garbagecollector keine/nicht genug Zeit zum Fressen hat entstehen OutOfMemoryErrors). Hier die Konsole:
Code:
fps: 25; period: 40 ms
texturestring of null is null, ignoring it
Frame Count/Loss: 1839 / 0
Average FPS: 24
Average UPS: 24
Time spent: 73 secs
Exception in thread "Thread-12" java.security.AccessControlException: access denied (java.lang.RuntimePermission exitVM.0)
	at java.security.AccessControlContext.checkPermission(Unknown Source)
	at java.security.AccessController.checkPermission(Unknown Source)
	at java.lang.SecurityManager.checkPermission(Unknown Source)
	at java.lang.SecurityManager.checkExit(Unknown Source)
	at java.lang.Runtime.exit(Unknown Source)
	at java.lang.System.exit(Unknown Source)
	at CraftrisPanel.run(CraftrisPanel.java:493)
	at java.lang.Thread.run(Unknown Source)

fps: 25; period: 40 ms
texturestring of null is null, ignoring it
Frame Count/Loss: 429 / 0
Average FPS: 24
Average UPS: 24
Time spent: 17 secs // <-- die Ausgabe lasse ich mir immer beim Beenden meines JApplets machen, d. h. die untere Exception tritt beim Schließen auf
Exception in thread "Thread-12" java.security.AccessControlException: access denied (java.lang.RuntimePermission exitVM.0)
	at java.security.AccessControlContext.checkPermission(Unknown Source)
	at java.security.AccessController.checkPermission(Unknown Source)
	at java.lang.SecurityManager.checkPermission(Unknown Source)
	at java.lang.SecurityManager.checkExit(Unknown Source)
	at java.lang.Runtime.exit(Unknown Source)
	at java.lang.System.exit(Unknown Source)
	at CraftrisPanel.run(CraftrisPanel.java:493)
	at java.lang.Thread.run(Unknown Source)

Sobald ich aber die Konsole schließe, hängt sich das Applet mysteriöserweise beim Starten auf, wenn ich nicht vorher den Firefox (samt Prozess) abschieße und neustarte.
 
Applets dürfen die VM nicht beenden, deshalb die AccessControlException.
Der
Code:
System.exit(0);
- oder ein möglicher
Code:
JFrame.EXIT_ON_CLOSE
- Aufruf im Programmverlauf muss raus!
 
Applets dürfen die VM nicht beenden, deshalb die AccessControlException.
Der
Code:
System.exit(0);
- oder ein möglicher
Code:
JFrame.EXIT_ON_CLOSE
- Aufruf im Programmverlauf muss raus!

Das wusste ich vorher auch noch nicht, gut zu wissen 🙂
Jetzt funktioniert auch das, vielen Dank!

PS: Eine kleine Frage hab ich noch, gilt das nur für JApplets oder auch für Applications?
 
Nur Applets und Webstart-Anwendungen unterliegen diesen Einschränkungen. Es gibt sicher bei Google Links, die dir genau verraten, was Applets dürfen und was nicht.
 

Neue Themen


Zurück
Oben