JOGLAppletLauncher Problem

recco

Grünschnabel
Hallo liebe Community,

ich versuche zur Zeit mich ein wenig in die Welt von openGL einzuarbeiten, dazu benutze ich JOGL um openGL unter Java schreiben zu können. Das ganze vor dem Hintergrund, dass ich meine kleinen Animationen irgendwann mal als Applet auf meine Homepage packen kann.

Mit JOGL ansich habe ich keine Probleme, jedoch aber damit ein Applet was JOGL enthält auf meiner Homepage darstellen zu können.

Erst einmal was ich bisher gemacht habe:

1. Ich habe meinen Code in Eclipse geschrieben, mit dem dortigen AppletViewer kann ich mein Applet auch ohne Probleme anschauen. (jre 1.6.0_03, jogl 1.1.0)

2. Wie in der Documentation beschrieben habe ich folgende Klassen in ein jar gepackt (cmd: jar cf cube.jar *.class) und hochgeladen.


GLApplet.java
Code:
import java.applet.*;
import java.awt.*;
import javax.media.opengl.*;
import javax.media.opengl.glu.GLU;
import com.sun.opengl.util.*;


public class GLApplet extends Applet {
   private Animator animator;
   private GLU glu = new GLU();

   public void init() {
      setLayout(new BorderLayout());
      setSize(640, 480);
      
      GLCanvas canvas = new GLCanvas();
      canvas.addGLEventListener(new Renderer());
      canvas.setSize(getSize());
      add(canvas, BorderLayout.CENTER);
      animator = new FPSAnimator(canvas, 60);
   }

   public void start() {
      animator.start();
   }

   public void stop() {
      animator.stop();
   }

}

Renderer.java
Code:
import javax.media.opengl.*;
import javax.media.opengl.glu.*;

public class Renderer implements GLEventListener
{
	GLU glu = new GLU();
	
	float x;
	float y;
	
	public void init(GLAutoDrawable drawable)
	{
		GL gl = drawable.getGL();
		
		gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
		gl.glShadeModel(GL.GL_SMOOTH);
		
		gl.glClearDepth(1.0f);
		gl.glEnable(GL.GL_DEPTH_TEST);
		gl.glDepthFunc(GL.GL_LEQUAL);
		
		gl.glHint(GL.GL_PERSPECTIVE_CORRECTION_HINT, GL.GL_NICEST);
	}
	
	public void display(GLAutoDrawable drawable)
	{
		GL gl = drawable.getGL();
		
		gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT);
		gl.glLoadIdentity();
		
		gl.glTranslatef(0.0f, 0.0f, -6.0f);
		
		gl.glRotatef(x, 1.0f, 0.0f, 0.0f);
		gl.glRotatef(y, 0.0f, 1.0f, 0.0f);
		
		quad3D(gl);
		
		gl.glFlush();
		
		x += 0.25;
		y += 0.15;
	}
	
	public void quad3D(GL gl)
	{
		gl.glBegin(GL.GL_QUADS);
		{
			//Front
			gl.glColor3f(1.0f, 0.0f, 0.0f); //ROT
			gl.glVertex3f(-1.0f, -1.0f, 1.0f);
			gl.glVertex3f(1.0f, -1.0f, 1.0f);
			gl.glVertex3f(1.0f, 1.0f, 1.0f);
			gl.glVertex3f(-1.0f, 1.0f, 1.0f);
			
			//Right
			gl.glColor3f(0.0f, 1.0f, 0.0f); //GRUEN
			gl.glVertex3f(1.0f, -1.0f, 1.0f);
			gl.glVertex3f(1.0f, -1.0f, -1.0f);
			gl.glVertex3f(1.0f, 1.0f, -1.0f);
			gl.glVertex3f(1.0f, 1.0f, 1.0f);
			
			//Back
			gl.glColor3f(0.0f, 0.0f, 1.0f); //BLAU
			gl.glVertex3f(1.0f, -1.0f, -1.0f);
			gl.glVertex3f(-1.0f, -1.0f, -1.0f);
			gl.glVertex3f(-1.0f, 1.0f, -1.0f);
			gl.glVertex3f(1.0f, 1.0f, -1.0f);
			
			//Left
			gl.glColor3f(1.0f, 1.0f, 0.0f); //GELB
			gl.glVertex3f(-1.0f, -1.0f, -1.0f);
			gl.glVertex3f(-1.0f, -1.0f, 1.0f);
			gl.glVertex3f(-1.0f, 1.0f, 1.0f);
			gl.glVertex3f(-1.0f, 1.0f, -1.0f);
			
			//Top
			gl.glColor3f(0.0f, 1.0f, 1.0f); //TUERKIS
			gl.glVertex3f(-1.0f, 1.0f, 1.0f);
			gl.glVertex3f(1.0f, 1.0f, 1.0f);
			gl.glVertex3f(1.0f, 1.0f, -1.0f);
			gl.glVertex3f(-1.0f, 1.0f, -1.0f);
			
			//Bottom
			gl.glColor3f(1.0f, 1.0f, 1.0f); //WEIS
			gl.glVertex3f(1.0f, -1.0f, 1.0f);
			gl.glVertex3f(-1.0f, -1.0f, 1.0f);
			gl.glVertex3f(-1.0f, -1.0f, -1.0f);
			gl.glVertex3f(1.0f, -1.0f, -1.0f);
		}
		gl.glEnd();
	}
	
	public void displayChanged(GLAutoDrawable drawable, boolean arg0, boolean arg1)
	{
		
	}
	
	public void reshape(GLAutoDrawable drawable, int x, int y, int w, int h)
	{
		GL gl = drawable.getGL();
		
		if(h == 0) h = 1; //Division durch 0 verhindern
		gl.glViewport(0, 0, w, h);
		gl.glMatrixMode(GL.GL_PROJECTION);
		gl.glLoadIdentity();
		glu.gluPerspective(45.0f, (float)w/(float)h, 0.1f, 100.0f);
		gl.glMatrixMode(GL.GL_MODELVIEW);
		gl.glLoadIdentity();
	}		
}

3.die html-Datei die das Applet anzeigen soll enthält folgenden code:

HTML:
<html>
<head>
</head>

<body>

<applet code="com.sun.opengl.util.JOGLAppletLauncher"
     width=640
     height=480
     codebase="/lib"
     archive="jogl.jar,gluegen-rt.jar,cube.jar">
     <param name="subapplet.classname" VALUE="GLApplet">
     <param name="subapplet.displayname" VALUE="First 3D Applet">
     <param name="progressbar" value="true">
     <param name="cache_archive" VALUE="jogl.jar,gluegen-rt.jar,cube.jar">
     <param name="cache_archive_ex" VALUE="jogl.jar;preload,gluegen-rt.jar;preload,cube.jar;preload">
</applet>

</body>
</html>


Ich erhalte nun wenn ich die Seite http://www.bithauer.de/joglTest/index.htm aufrufe folgenden Fehler in der Java Konsole:

Start failed : class not found : GLApplet


Ich bin auf dem Gebiet leider ziemlicher Neuling und weis nun nicht ob er die jar nicht findet oder ich die jar falsch gepackt habe oder ob ich irgendwas anderes falsch gemacht habe.


Ich bin für jeden Hinweis und Ratschlag dankbar

so long

Recco
 
Hallo,

es könnte sein das dein Eclipse eine andere Java-VM-Installation nutzt als dein Browser.
(Kann sogar auf einem und dem selben System passieren).

So fehlen der VM des Browsers wahrscheinlich die enstspechende JOGL-Bibliotheken.

Das problem werden dann wohl auch 99,9 % der Besucher deiner Webseite haben.
Welcher Normalsterbliche hat schon JOGL oder überhaupt Java3D-Zeug installiert ?

Gruß JAddix
 
Naja soweit ich das verstanden habe ist der JOGLAppletLauncher genau dazu da dieses Problem zu lösen, indem er die benötigten Bibliotheken auch für die bereitstellt, die diese nicht installiert haben.
 
So nach endlosen Stunden Googlen und wildem fluchen bin ich zu dem Schluss gekommen, dass ich beim erstellen meines Jar-Archives irgendwas falsch mache, nur was?

Ich bin mir sicher, dass der JOGLAppletLauncher mein Jar findet, da er sonst eine andere Fehlermeldung produzieren würde, also scheint er meine GLApplet.class in meinem Jar nicht finden zu können, und ich blicke trotz des lesens mehrerer Tutorials zum Thema Jar RICHTIG erstellen nicht wirklich durch.

Deshalb hier meine Bitte: Könnte mir jemand erklären was es mit dem sogenannten "CLASSPATH" auf sich hat? Muss ich den in meiner MANIFEST.MF irgendwie angeben? Wenn ja wie mache ich das?

Ich denke mal, dass er meine GLApplet.class nicht findet weil er nirgends erfährt wo diese denn genau liegt (Sie liegt im Root-Verzeichnis meines Jar's).

Ich hoffe mal mir kann jemand bei diesem Problem helfen,

MFG recco
 
Ich habe nun die MANIFEST.MF Datei für mein Jar welches das Applet enthält wie folgt modifiziert:

Code:
Manifest-Version: 1.0
Created-By: me
Class-Path: GLApplet.class Renderer.class

Eingebunden in meine Jar habe ich diese dann mit dem Befehl:
jar cmf MANIFEST.MF cube.jar GLApplet.class Renderer.class
wenn ich mein jar entpacke scheint auch alles an seinem Platz zu sein.

Dies brachte leider jedoch auch keinen Erfolg, nach wie vor bekomme ich wenn ich das Applet starten möchte die Meldung: Start failed : class not found : GLApplet

Des weiteren habe ich probiert mein Jar über die komplette Url (http://www.bithauer.de/joglTest/lib/cube.jar) zu referenzieren, dies führte jedoch dazu, dass mein Jar überhauptnichtmehr gefunden wird.


Wenn jemand eine Idee hat was ich an dieser Stelle falsch mache bitte posten, auch wenn es noch so absurd erscheint, denn so langsam habe ich jede mir plausible Lösung für dieses Problem durchprobiert.
 
Zurück