Matthias: Java-Applet: Probleme mit jar-file

Hallo!

Ich habe ein Java-Applet geschrieben, welches am Ende Eingabedaten per eMail (mit Hilfe von javamail) verschickt. Das Ganze funktioniert soweit wunderbar. Das Applet habe ich als jar-file verpackt und auf den Server geladen. Aber hier kommt jetzt mein Problem: Der Server meldet ständig eine ClassNotFoundException. Die Struktur von dem Applet ist folgendermaßen:

Das Applet "javaApplet" liegt in einem Unterordner:
http://www.meineHomepage.de/unterordner/javaApplet.jar

Das Applet besteht aus einem Hauptpackage "package" und mehreren Unterpackages. Eines davon heißt startup und enthält die (Start-)Klasse Initiator.class.

Es ergibt sich also folgende Packagestrukur:
package/startup/Initiator.class

Der bisheriger Quellcode auf meiner Homepage sah so aus:
<applet codebase="www.meineHomepage.de/unterordner/" archive="javaApplet.jar" code="package/startup/Initiator.class"  width="1000" height="730">
</applet>

Sieht jemand, wo der Fehler liegt? Ich bin mit meinem Latein am Ende... :-(

Mittlerweile bin ich auch schon auf die (zugegebenermaßen etwas verrückte) Idee gekommen, die Verzeichnisstruktur mit allen .class-files manuell auf den Server zu laden (sodass alles einzeln online steht).
Bei der Variante findet die JVM aber die Bibliothek für den eMail-Versand nicht mehr. (Das ist zwar irgendwie logisch, weil javamail nur dem Class-Path von Eclipse hinzugefügt wird und somit in keinem package auftaucht - allerdings führt auch ein separater Upload des javamail.jar-files auf den Server nicht zum Erfolg.)

Vielen Dank schon jetzt für jede Hilfe,
Matthias

  1. Hallo,

    Das Applet "javaApplet" liegt in einem Unterordner:
    http://www.meineHomepage.de/unterordner/javaApplet.jar

    Der bisheriger Quellcode auf meiner Homepage sah so aus:
    <applet codebase="www.meineHomepage.de/unterordner/" archive="javaApplet.jar" code="package/startup/Initiator.class"  width="1000" height="730">
    </applet>

    Sieht jemand, wo der Fehler liegt?

    Das Attribut codebase liefert dem Browser eine URI, welche gemeinsam mit der base URI des Dokuments ausgewertet wird. Sei die base URI http://www.meineHomepage.de/, dann ergibt sich die codebase URI hier zu http://www.meineHomepage.de/www.meineHomepage.de/unterordner/.
    Hier solltest Du nur codebase="unterordner/" notieren. Soll es eine komplette absolute URL sein, dann codebase="http://www.meineHomepage.de/unterordner/".

    Das Attribut code liefert dem Java Plugin (der JRE) den Bezeichner der Hauptklasse. Hier solltest Du die dot-Schreibweise bevorzugen.

      
    <applet codebase="unterordner/" archive="javaApplet.jar" code="package.startup.Initiator"  width="1000" height="730">  
    </applet>  
    
    

    Sollte es so immer noch nicht funktionieren, poste bitte die komplette trace des Fehlers (Kopieren aus dem Java Console Fenster)
    Bsp.:

    Laden: Klasse mypackage/MyApplet.class nicht gefunden
    java.lang.ClassNotFoundException: mypackage.MyApplet.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)
    Caused by: java.io.IOException: open HTTP connection failed.
     at sun.applet.AppletClassLoader.getBytes(Unknown Source)
     at sun.applet.AppletClassLoader.access$100(Unknown Source)
     at sun.applet.AppletClassLoader$1.run(Unknown Source)
     at java.security.AccessController.doPrivileged(Native Method)
     ... 10 more

    viele Grüße

    Axel

    1. Hallo,

      vielen Dank für sie Hinweise. Leider funktioniert es aber immer noch nicht.
      Hier ist die trace des Fehlers:

      Laden: Klasse reservationsystem.startup.Initiator nicht gefunden
      java.lang.ClassNotFoundException: reservationsystem.startup.Initiator
       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)
      Caused by: java.io.IOException: open HTTP connection failed.
       at sun.applet.AppletClassLoader.getBytes(Unknown Source)
       at sun.applet.AppletClassLoader.access$100(Unknown Source)
       at sun.applet.AppletClassLoader$1.run(Unknown Source)
       at java.security.AccessController.doPrivileged(Native Method)
       ... 10 more

      Der Code sieht momentan so aus:
      <applet codebase="http://mitglied.lycos.de/username/reservationsystem/" archive="reservationsystem.jar" code="reservationsystem.startup.Initiator"  width="1000" height="730">
      </applet>

      Die Seite "start.html", von der aus das Applet gestartet wird, liegt im Verzeichnis:
      http://mitglied.lycos.de/username/reservationsystem/start.html

      Das Applet "reservationsystem.jar" ist unter
      http://mitglied.lycos.de/username/reservationsystem/reservationsystem.jar
      zu finden.

      Vielen Dank,
      Matthias

      Hallo,

      Das Applet "javaApplet" liegt in einem Unterordner:
      http://www.meineHomepage.de/unterordner/javaApplet.jar

      Der bisheriger Quellcode auf meiner Homepage sah so aus:
      <applet codebase="www.meineHomepage.de/unterordner/" archive="javaApplet.jar" code="package/startup/Initiator.class"  width="1000" height="730">
      </applet>

      Sieht jemand, wo der Fehler liegt?

      Das Attribut codebase liefert dem Browser eine URI, welche gemeinsam mit der base URI des Dokuments ausgewertet wird. Sei die base URI http://www.meineHomepage.de/, dann ergibt sich die codebase URI hier zu http://www.meineHomepage.de/www.meineHomepage.de/unterordner/.
      Hier solltest Du nur codebase="unterordner/" notieren. Soll es eine komplette absolute URL sein, dann codebase="http://www.meineHomepage.de/unterordner/".

      Das Attribut code liefert dem Java Plugin (der JRE) den Bezeichner der Hauptklasse. Hier solltest Du die dot-Schreibweise bevorzugen.

      <applet codebase="unterordner/" archive="javaApplet.jar" code="package.startup.Initiator"  width="1000" height="730">
      </applet>

      
      >   
      > Sollte es so immer noch nicht funktionieren, poste bitte die komplette trace des Fehlers (Kopieren aus dem Java Console Fenster)  
      > Bsp.:  
      >   
      > Laden: Klasse mypackage/MyApplet.class nicht gefunden  
      > java.lang.ClassNotFoundException: mypackage.MyApplet.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)  
      > Caused by: java.io.IOException: open HTTP connection failed.  
      >  at sun.applet.AppletClassLoader.getBytes(Unknown Source)  
      >  at sun.applet.AppletClassLoader.access$100(Unknown Source)  
      >  at sun.applet.AppletClassLoader$1.run(Unknown Source)  
      >  at java.security.AccessController.doPrivileged(Native Method)  
      >  ... 10 more  
      >   
      >   
      > viele Grüße  
      >   
      > Axel
      
      1. Hallo,

        vielen Dank für sie Hinweise. Leider funktioniert es aber immer noch nicht.
        Hier ist die trace des Fehlers:

        Laden: Klasse reservationsystem.startup.Initiator nicht gefunden
        java.lang.ClassNotFoundException: reservationsystem.startup.Initiator

        Laut trace der Standardfall, dass die .class Datei nicht gefunden wurde.

        Der Code sieht momentan so aus:
        <applet codebase="http://mitglied.lycos.de/username/reservationsystem/" archive="reservationsystem.jar" code="reservationsystem.startup.Initiator"  width="1000" height="730">
        </applet>

        Wenn Du Deine reservationsystem.jar mal mit einem ZIP/JAR-Archivprogramm (WinZip o. ä.) öffnest, sollte der Inhalt so aussehen:
        Datei             Pfad
        MANIFEST.MF       META-INF\ ...
        Initiator.class   reservationssystem\startup\ ...

        Die Datei Initiator.class muss also im JAR-Archiv in einem Verzeichnis startup liegen, welches wiederum in einem Verzeichnis reservationssystem liegen muss. Ist das so?

        Die erste Zeile in der Initiator.java, aus der die Initiator.class compiliert wurde, sollte

          
        package reservationssystem.startup;  
        
        

        lauten. Wenn das falsch ist, kommt dann aber eine andere Fehlermeldung:
        java.lang.NoClassDefFoundError: reservationssystem/startup/Initiator (wrong name: [hier der falsche Packagename]/Initiator)

        viele Grüße

        Axel

        1. Hallo,

          danke für die schnelle Antwort.

          Wenn Du Deine reservationsystem.jar mal mit einem ZIP/JAR-Archivprogramm (WinZip o. ä.) öffnest, sollte der Inhalt so aussehen:
          Datei             Pfad
          MANIFEST.MF       META-INF\ ...
          Initiator.class   reservationssystem\startup\ ...

          Die Datei Initiator.class muss also im JAR-Archiv in einem Verzeichnis startup liegen, welches wiederum in einem Verzeichnis reservationssystem liegen muss. Ist das so?

          Ja, das ist so. Wenn ich das jar-file wieder entpacke, erhalte ich einen Ordner reservationsystem, der (u.a.) einen Ordner startup mit der Initiator.class enthält. (Außerdem sind in dem jar-file noch der META-INF-Ordner und (wie üblich) die .classpath, .project und java.policy.applet-files enthalten.)

          Die erste Zeile in der Initiator.java, aus der die Initiator.class compiliert wurde, sollte

          package reservationssystem.startup;

          
          > lauten. Wenn das falsch ist, kommt dann aber eine andere Fehlermeldung:  
          > java.lang.NoClassDefFoundError: reservationssystem/startup/Initiator (wrong name: [hier der falsche Packagename]/Initiator)  
            
          Auch das ist (leider?) richtig. Ich bin auch alle anderen Klassen noch einmal durchgegangen. In der ersten Zeile steht überall die package-Deklaration.  
            
          Ich versteh allmählich die Welt nicht mehr. Ich habe ja (wie schon in meinem ersten posting gesagt) die Verzeichnisstruktur mit allen .class-files separat auf den Server geladen. Dort liegt jetzt also ein Ordner reservationsystem, dessen Inhalt unter der Adresse  
          http://mitglied.lycos.de/username/reservationsystem/  
          abrufbar ist.  
          Dieser Ordner enthält u.a. den Ordner startup mit der Initiator.class.  
          Das Ganze lässt sich dann problemlos über  
          <applet codebase="http://mitglied.lycos.de/username/" code="reservationsystem/startup/Initiator.class" width="1000" height="730">  
          </applet>  
          starten, wobei die Start-Datei unter  
          http://www.mitglied.lycos.de/username/reservationsystem/start1.html  
          zu finden ist. Bei der Variante funktioniert aber leider javamail nicht mehr...  
            
          Aber wenn ich die reservationsystem.jar (mit eben diesem Aufbau  
          reservationsystem/startup/Initiator.class)  
          im Ordner reservationsystem starten will, werfen die Browser (egal ob IE, FF oder Opera) die Exception.  
            
            
          Viele Grüße,  
          Matthias  
            
            
            
            
            
          
          > Hallo,  
          >   
          > > vielen Dank für sie Hinweise. Leider funktioniert es aber immer noch nicht.  
          > > Hier ist die trace des Fehlers:  
          > >   
          > > Laden: Klasse reservationsystem.startup.Initiator nicht gefunden  
          > > java.lang.ClassNotFoundException: reservationsystem.startup.Initiator  
          >   
          > Laut trace der Standardfall, dass die .class Datei nicht gefunden wurde.  
          >   
          > > Der Code sieht momentan so aus:  
          > > <applet codebase="http://mitglied.lycos.de/username/reservationsystem/" archive="reservationsystem.jar" code="reservationsystem.startup.Initiator"  width="1000" height="730">  
          > > </applet>  
          >   
          > Wenn Du Deine reservationsystem.jar mal mit einem ZIP/JAR-Archivprogramm (WinZip o. ä.) öffnest, sollte der Inhalt so aussehen:  
          > Datei             Pfad  
          > MANIFEST.MF       META-INF\  
          > ...  
          > Initiator.class   reservationssystem\startup\  
          > ...  
          >   
          > Die Datei Initiator.class muss also im JAR-Archiv in einem Verzeichnis startup liegen, welches wiederum in einem Verzeichnis reservationssystem liegen muss. Ist das so?  
          >   
          > Die erste Zeile in der Initiator.java, aus der die Initiator.class compiliert wurde, sollte  
          >   
          > ~~~java
            
          
          > package reservationssystem.startup;  
          > 
          
          

          lauten. Wenn das falsch ist, kommt dann aber eine andere Fehlermeldung:
          java.lang.NoClassDefFoundError: reservationssystem/startup/Initiator (wrong name: [hier der falsche Packagename]/Initiator)

          viele Grüße

          Axel

          1. Hallo,

            und (wie üblich) die .classpath, .project und java.policy.applet-files enthalten.)

            Nein, das ist nicht üblich. Das ist Eclipse spezifisch. Was steht in der META-INF/MANIFEST.MF im JAR-Archiv denn alles drin? Will sagen: Was hat Eclipse dort reingeschieben?

            Aber wenn ich die reservationsystem.jar (mit eben diesem Aufbau
            reservationsystem/startup/Initiator.class)
            im Ordner reservationsystem starten will, werfen die Browser (egal ob IE, FF oder Opera) die Exception.

            Dann werden wir das hier nicht klären können. Wenn es so ist, wie Du beschreibst, müsste eine HTML-Ressource mit dem Applet-Tag

              
            <applet codebase="." archive="reservationssystem.jar" code="reservationssystem.startup.Initiator"  width="1000" height="730">  
            </applet>  
            
            

            in jedem Verzeichnis funktionieren, wenn die reservationssystem.jar im selben Verzeichnis liegt und die Initiator.class im JAR-Archiv im Pfad revervationssystem/startup/ zu finden ist. Eventuell probierst Du das ja mal lokal aus.

            Oder Du lädst das mal irgendwo hoch, damit man es sich mal life ansehen kann.

            viele Grüße

            Axel

            1. Hallo,

              zuerst möchte ich mich noch einmal für die Hilfsbereitschaft bedanken.
              Heute vormittag bin ich aus Zufall auf einer anderen Webseite vorbeigekommen, auf der ein java-Applet eingebaut ist. Tataa! Der gleiche Fehler. Daraufhin hab ich auf anderen Computern das Applet getestet/ testen lassen. Es funktioniert. Folglich liegt der Fehler wohl irgendwo an meiner JRE... Und ich sitze ewig da, probiere alle möglichen Varianten durch und lade sogar alle class-files separat auf den Servern... Ich wäre nie auf die Idee gekommen, dass es an meinem Java liegen könnte, da die Varaiante ohne Verwenden des jar-files ja funktioniert. Ist doch irgendwie seltsam, oder?
              Übrigens, kann es sein, dass JRE 5 schneller ist als JRE 6? Wenn ich auf meinem alten Computer (mit JRE 5) das jar-file ausführe, ist der Ladevorgang schneller abgeschlossen als bei dem besser ausgerüsteten Computer mit JRE 6 meiner "Testperson".
              Ich werd jetzt auf jeden Fall mein JRE neu installieren in der Hoffung, das Problem damit abstellen zu können.

              Viele Grüße,
              Matthias

              Hallo,

              und (wie üblich) die .classpath, .project und java.policy.applet-files enthalten.)
              Nein, das ist nicht üblich. Das ist Eclipse spezifisch. Was steht in der META-INF/MANIFEST.MF im JAR-Archiv denn alles drin? Will sagen: Was hat Eclipse dort reingeschieben?

              Aber wenn ich die reservationsystem.jar (mit eben diesem Aufbau
              reservationsystem/startup/Initiator.class)
              im Ordner reservationsystem starten will, werfen die Browser (egal ob IE, FF oder Opera) die Exception.
              Dann werden wir das hier nicht klären können. Wenn es so ist, wie Du beschreibst, müsste eine HTML-Ressource mit dem Applet-Tag

              <applet codebase="." archive="reservationssystem.jar" code="reservationssystem.startup.Initiator"  width="1000" height="730">
              </applet>

              
              > in jedem Verzeichnis funktionieren, wenn die reservationssystem.jar im selben Verzeichnis liegt und die Initiator.class im JAR-Archiv im Pfad revervationssystem/startup/ zu finden ist. Eventuell probierst Du das ja mal lokal aus.  
              >   
              > Oder Du lädst das mal irgendwo hoch, damit man es sich mal life ansehen kann.  
              >   
              > viele Grüße  
              >   
              > Axel