Difference between revisions of "Using JOGL in Java Web Start"

From JogampWiki
Jump to navigation Jump to search
(Formatting)
Line 116: Line 116:
  
 
= Setting up the application directory =
 
= Setting up the application directory =
 +
 +
Note that none of your applet Jar files needs to be signed. Only the Jogamp files (GlueGen, JOGL, ..) require code signing.
  
 
* Create a directory to hold your JWS application.
 
* Create a directory to hold your JWS application.
 
* Create a subdirectory <tt>name/wadewalker/jogl2tests/onetriangle</tt> inside your application directory. Or if you changed the packages of the files above, create a subdirectory that matches your package names.
 
* Create a subdirectory <tt>name/wadewalker/jogl2tests/onetriangle</tt> inside your application directory. Or if you changed the packages of the files above, create a subdirectory that matches your package names.
 
* Put your <tt>OneTriangle.java</tt> and <tt>OneTriangleAWT.java</tt> files inside the subdirectory.
 
* Put your <tt>OneTriangle.java</tt> and <tt>OneTriangleAWT.java</tt> files inside the subdirectory.
* Copy all JOGL JARs into the application directory. You can get the JARs from a JOGL autobuild [http://jogamp.org/deployment/autobuilds/master/ here]. Usually I pick the latest <tt>jogl-<build number>-<date></tt> link, download all the <tt>.7z</tt> files inside, and unzip them with [http://www.7-zip.org/ 7zip]. These are the JARs you should have in your directory:
+
 
 +
== Using Your own Signed Jar and Jnlp Files ==
 +
* Copy all JogAmp Jar files ([[{{SERVER}}/jogl/doc/deployment/JOGL-DEPLOYMENT.html#GluegenJARs|GlueGen]] and [[{{SERVER}}/jogl/doc/deployment/JOGL-DEPLOYMENT.html#JOGLAllInOneJARs|JOGL]]) into the application directory.  
 +
** Read [[Downloading_and_installing_JOGL]] for getting the autobuild or released JAR and JNLP files
 +
* Copy the JogAmp [[{{SERVER}}/jogl/doc/deployment/JOGL-DEPLOYMENT.html#JNLPFiles|Jnlp files]] into that application directory
  
 
<pre>
 
<pre>
 
gluegen-rt.jar
 
gluegen-rt.jar
nativewindow.all.jar
 
 
jogl.all.jar
 
jogl.all.jar
newt.all.jar
 
  
 
gluegen-rt-natives-windows-i586.jar
 
gluegen-rt-natives-windows-i586.jar
jogl-natives-windows-i586.jar
+
jogl-all-natives-windows-i586.jar
nativewindow-natives-windows-i586.jar
 
newt-natives-windows-i586.jar
 
  
 
gluegen-rt-natives-windows-amd64.jar
 
gluegen-rt-natives-windows-amd64.jar
jogl-natives-windows-amd64.jar
+
jogl-all-natives-linux-amd64.jar
nativewindow-natives-windows-amd64.jar
 
newt-natives-windows-amd64.jar
 
  
 
gluegen-rt-natives-linux-i586.jar
 
gluegen-rt-natives-linux-i586.jar
jogl-natives-linux-i586.jar
+
jogl-all-natives-linux-i586.jar
nativewindow-natives-linux-i586.jar
 
newt-natives-linux-i586.jar
 
  
 
gluegen-rt-natives-linux-amd64.jar
 
gluegen-rt-natives-linux-amd64.jar
jogl-natives-linux-amd64.jar
+
jogl-all-natives-linux-amd64.jar
nativewindow-natives-linux-amd64.jar
 
newt-natives-linux-amd64.jar
 
  
 
gluegen-rt-natives-macosx-universal.jar
 
gluegen-rt-natives-macosx-universal.jar
jogl-natives-macosx-universal.jar
+
jogl-all-natives-macosx-universal.jar
nativewindow-natives-macosx-universal.jar
 
newt-natives-macosx-universal.jar
 
 
</pre>
 
</pre>
  
Line 183: Line 177:
  
 
<pre>
 
<pre>
java -classpath "gluegen-rt.jar;nativewindow.all.jar;jogl.all.jar;newt.all.jar;onetriangle.jar" -Djava.library.path=lib-windows-amd64 name.wadewalker.jogl2tests.onetriangle.OneTriangleAWT
+
java -classpath "gluegen-rt.jar;jogl.all.jar;onetriangle.jar" -Djava.library.path=lib-windows-amd64 name.wadewalker.jogl2tests.onetriangle.OneTriangleAWT
 
</pre>
 
</pre>
  
Line 189: Line 183:
  
 
<pre>
 
<pre>
java -classpath "gluegen-rt.jar:nativewindow.all.jar:jogl.all.jar:newt.all.jar:onetriangle.jar" -Djava.library.path=lib-linux-amd64 name.wadewalker.jogl2tests.onetriangle.OneTriangleAWT
+
java -classpath "gluegen-rt.jar:jogl.all.jar:onetriangle.jar" -Djava.library.path=lib-linux-amd64 name.wadewalker.jogl2tests.onetriangle.OneTriangleAWT
 
</pre>
 
</pre>
  
Line 195: Line 189:
  
 
<pre>
 
<pre>
java -classpath "gluegen-rt.jar:nativewindow.all.jar:jogl.all.jar:newt.all.jar:onetriangle.jar" -Djava.library.path=lib-macosx-universal name.wadewalker.jogl2tests.onetriangle.OneTriangleAWT
+
java -classpath "gluegen-rt.jar:jogl.all.jar:onetriangle.jar" -Djava.library.path=lib-macosx-universal name.wadewalker.jogl2tests.onetriangle.OneTriangleAWT
 
</pre>
 
</pre>
  
Line 204: Line 198:
 
= Writing the JNLP files =
 
= Writing the JNLP files =
  
JWS uses two [http://download.oracle.com/javase/1,5.0/docs/guide/javaws/developersguide/syntax.html Java Network Launching Protocol (JNLP)] files to find the JAR files that make up your application. Our main JNLP file looks like this:
+
Read the JWS [http://download.oracle.com/javase/1,5.0/docs/guide/javaws/developersguide/syntax.html Java Network Launching Protocol (JNLP)] specification for details.
 +
 
 +
In general we will have one exclusive JNLP file for each application, which will reference the JOGL extension's JNLP file.
 +
The latter may reference even more JNLP files, but this shall not matter in this discussion.
 +
 
 +
== Use JogAmp's deployed files ==
  
 
<pre>
 
<pre>
Line 221: Line 220:
 
   <update check="background" policy="always"/>
 
   <update check="background" policy="always"/>
  
   <security>
+
   <resources>
     <all-permissions/>
+
     <j2se href="http://java.sun.com/products/autodl/j2se" version="1.4+"/>
   </security>
+
    <property name="sun.java2d.noddraw" value="true"/>
 +
    <extension name="jogl-all-awt" href="http://jogamp.org/deployment/jogamp-current/jogl-all-awt.jnlp" />
 +
    <jar href="onetriangle.jar" main="true"/>
 +
  </resources>
 +
 
 +
  <application-desc main-class="name.wadewalker.jogl2tests.onetriangle.OneTriangleAWT">
 +
  </application-desc>
 +
</jnlp>
 +
</pre>
 +
 
 +
Save this file to your application directory as <tt>OneTriangleWebStart.jnlp</tt>.
 +
 
 +
== Use your own JogAmp files ==
 +
 
 +
Read the JWS [http://download.oracle.com/javase/1,5.0/docs/guide/javaws/developersguide/syntax.html Java Network Launching Protocol (JNLP)] files to find the JAR files that make up your application. Our main JNLP file looks like this:
 +
 
 +
<pre>
 +
<?xml version="1.0" encoding="utf-8"?>
 +
<jnlp spec="1.0+" codebase="./"
 +
  href="OneTriangleWebStart.jnlp">
 +
 
 +
  <information>
 +
    <title>OneTriangle Demo</title>
 +
    <vendor>JogAmp Community</vendor>
 +
    <homepage href="http://jogamp.org/"/>
 +
    <description>OneTriangle Java Web Start Demo</description>
 +
    <description kind="short">The simplest possible JOGL Java Web Start demo - draws one triangle.</description>
 +
    <offline-allowed/>
 +
  </information>
 +
   <update check="background" policy="always"/>
  
 
   <resources>
 
   <resources>
Line 238: Line 266:
  
 
Save this file to your application directory as <tt>OneTriangleWebStart.jnlp</tt>.
 
Save this file to your application directory as <tt>OneTriangleWebStart.jnlp</tt>.
 +
 
Our extension JNLP file for the JOGL JARs looks like this:
 
Our extension JNLP file for the JOGL JARs looks like this:
  
Line 261: Line 290:
 
   <resources>
 
   <resources>
 
     <jar href="gluegen-rt.jar" />
 
     <jar href="gluegen-rt.jar" />
    <jar href="nativewindow.all.jar" />
 
 
     <jar href="jogl.all.jar" />
 
     <jar href="jogl.all.jar" />
    <jar href="newt.all.jar" />
 
 
   </resources>
 
   </resources>
  
 
   <resources os="Windows" arch="x86">
 
   <resources os="Windows" arch="x86">
 
     <nativelib href = "gluegen-rt-natives-windows-i586.jar" />
 
     <nativelib href = "gluegen-rt-natives-windows-i586.jar" />
     <nativelib href = "jogl-natives-windows-i586.jar" />
+
     <nativelib href = "jogl-all-natives-windows-i586.jar" />
    <nativelib href = "nativewindow-natives-windows-i586.jar" />
 
    <nativelib href = "newt-natives-windows-i586.jar" />
 
 
   </resources>
 
   </resources>
 
   <resources os="Windows" arch="amd64">
 
   <resources os="Windows" arch="amd64">
 
     <nativelib href = "gluegen-rt-natives-windows-amd64.jar" />
 
     <nativelib href = "gluegen-rt-natives-windows-amd64.jar" />
     <nativelib href = "jogl-natives-windows-amd64.jar" />
+
     <nativelib href = "jogl-all-natives-windows-amd64.jar" />
    <nativelib href = "nativewindow-natives-windows-amd64.jar" />
 
    <nativelib href = "newt-natives-windows-amd64.jar" />
 
 
   </resources>
 
   </resources>
 
   <resources os="Windows" arch="x86_64">
 
   <resources os="Windows" arch="x86_64">
 
     <nativelib href = "gluegen-rt-natives-windows-amd64.jar" />
 
     <nativelib href = "gluegen-rt-natives-windows-amd64.jar" />
     <nativelib href = "jogl-natives-windows-amd64.jar" />
+
     <nativelib href = "jogl-all-natives-windows-amd64.jar" />
    <nativelib href = "nativewindow-natives-windows-amd64.jar" />
 
    <nativelib href = "newt-natives-windows-amd64.jar" />
 
 
   </resources>
 
   </resources>
 
   <resources os="Linux" arch="i386">
 
   <resources os="Linux" arch="i386">
 
     <nativelib href = "gluegen-rt-natives-linux-i586.jar" />
 
     <nativelib href = "gluegen-rt-natives-linux-i586.jar" />
     <nativelib href = "jogl-natives-linux-i586.jar" />
+
     <nativelib href = "jogl-all-natives-linux-i586.jar" />
    <nativelib href = "nativewindow-natives-linux-i586.jar" />
 
    <nativelib href = "newt-natives-linux-i586.jar" />
 
 
   </resources>
 
   </resources>
 
   <resources os="Linux" arch="x86">
 
   <resources os="Linux" arch="x86">
 
     <nativelib href = "gluegen-rt-natives-linux-i586.jar" />
 
     <nativelib href = "gluegen-rt-natives-linux-i586.jar" />
     <nativelib href = "jogl-natives-linux-i586.jar" />
+
     <nativelib href = "jogl-all-natives-linux-i586.jar" />
    <nativelib href = "nativewindow-natives-linux-i586.jar" />
 
    <nativelib href = "newt-natives-linux-i586.jar" />
 
 
   </resources>
 
   </resources>
 
   <resources os="Linux" arch="amd64">
 
   <resources os="Linux" arch="amd64">
 
     <nativelib href = "gluegen-rt-natives-linux-amd64.jar" />
 
     <nativelib href = "gluegen-rt-natives-linux-amd64.jar" />
     <nativelib href = "jogl-natives-linux-amd64.jar" />
+
     <nativelib href = "jogl-all-natives-linux-amd64.jar" />
    <nativelib href = "nativewindow-natives-linux-amd64.jar" />
 
    <nativelib href = "newt-natives-linux-amd64.jar" />
 
 
   </resources>
 
   </resources>
 
   <resources os="Linux" arch="x86_64">
 
   <resources os="Linux" arch="x86_64">
 
     <nativelib href = "gluegen-rt-natives-linux-amd64.jar" />
 
     <nativelib href = "gluegen-rt-natives-linux-amd64.jar" />
     <nativelib href = "jogl-natives-linux-amd64.jar" />
+
     <nativelib href = "jogl-all-natives-linux-amd64.jar" />
    <nativelib href = "nativewindow-natives-linux-amd64.jar" />
 
    <nativelib href = "newt-natives-linux-amd64.jar" />
 
 
   </resources>
 
   </resources>
 
   <resources os="Mac OS X" arch="i386">
 
   <resources os="Mac OS X" arch="i386">
 
     <nativelib href = "gluegen-rt-natives-macosx-universal.jar" />
 
     <nativelib href = "gluegen-rt-natives-macosx-universal.jar" />
     <nativelib href = "jogl-natives-macosx-universal.jar" />
+
     <nativelib href = "jogl-all-natives-macosx-universal.jar" />
    <nativelib href = "nativewindow-natives-macosx-universal.jar" />
 
    <nativelib href = "newt-natives-macosx-universal.jar" />
 
 
   </resources>
 
   </resources>
 
   <resources os="Mac OS X" arch="x86_64">
 
   <resources os="Mac OS X" arch="x86_64">
 
     <nativelib href = "gluegen-rt-natives-macosx-universal.jar" />
 
     <nativelib href = "gluegen-rt-natives-macosx-universal.jar" />
     <nativelib href = "jogl-natives-macosx-universal.jar" />
+
     <nativelib href = "jogl-all-natives-macosx-universal.jar" />
    <nativelib href = "nativewindow-natives-macosx-universal.jar" />
 
    <nativelib href = "newt-natives-macosx-universal.jar" />
 
 
   </resources>
 
   </resources>
  
Line 329: Line 338:
 
Note that the <tt>codebase</tt> values are set to the current working directory, and the <tt>href</tt> values are simple filenames. This is so we can test the JNLP app locally, without using a web server. When we put the app on a web server later, the <tt>codebase</tt> and <tt>href</tt> become full URLs.
 
Note that the <tt>codebase</tt> values are set to the current working directory, and the <tt>href</tt> values are simple filenames. This is so we can test the JNLP app locally, without using a web server. When we put the app on a web server later, the <tt>codebase</tt> and <tt>href</tt> become full URLs.
  
= Signing your JARs =
+
=== Signing your JARs ===
  
 
For the JWS app to work properly in a web browser, all its JARs must be signed with the same key. If you don't already have a key you want to use, you can create one like this
 
For the JWS app to work properly in a web browser, all its JARs must be signed with the same key. If you don't already have a key you want to use, you can create one like this
Line 338: Line 347:
  
 
<pre>
 
<pre>
jarsigner -keystore testKeys onetriangle.jar ww
 
 
 
jarsigner -keystore testKeys gluegen-rt.jar ww
 
jarsigner -keystore testKeys gluegen-rt.jar ww
jarsigner -keystore testKeys nativewindow.all.jar ww
 
 
jarsigner -keystore testKeys jogl.all.jar ww
 
jarsigner -keystore testKeys jogl.all.jar ww
jarsigner -keystore testKeys newt.all.jar ww
 
  
 
jarsigner -keystore testKeys gluegen-rt-natives-windows-i586.jar ww
 
jarsigner -keystore testKeys gluegen-rt-natives-windows-i586.jar ww
jarsigner -keystore testKeys jogl-natives-windows-i586.jar ww
+
jarsigner -keystore testKeys jogl-all-natives-windows-i586.jar ww
jarsigner -keystore testKeys nativewindow-natives-windows-i586.jar ww
 
jarsigner -keystore testKeys newt-natives-windows-i586.jar ww
 
  
 
jarsigner -keystore testKeys gluegen-rt-natives-windows-amd64.jar ww
 
jarsigner -keystore testKeys gluegen-rt-natives-windows-amd64.jar ww
jarsigner -keystore testKeys jogl-natives-windows-amd64.jar ww
+
jarsigner -keystore testKeys jogl-all-natives-windows-amd64.jar ww
jarsigner -keystore testKeys nativewindow-natives-windows-amd64.jar ww
 
jarsigner -keystore testKeys newt-natives-windows-amd64.jar ww
 
  
 
jarsigner -keystore testKeys gluegen-rt-natives-linux-i586.jar ww
 
jarsigner -keystore testKeys gluegen-rt-natives-linux-i586.jar ww
jarsigner -keystore testKeys jogl-natives-linux-i586.jar ww
+
jarsigner -keystore testKeys jogl-all-natives-linux-i586.jar ww
jarsigner -keystore testKeys nativewindow-natives-linux-i586.jar ww
 
jarsigner -keystore testKeys newt-natives-linux-i586.jar ww
 
  
 
jarsigner -keystore testKeys gluegen-rt-natives-linux-amd64.jar ww
 
jarsigner -keystore testKeys gluegen-rt-natives-linux-amd64.jar ww
jarsigner -keystore testKeys jogl-natives-linux-amd64.jar ww
+
jarsigner -keystore testKeys jogl-all-natives-linux-amd64.jar ww
jarsigner -keystore testKeys nativewindow-natives-linux-amd64.jar ww
 
jarsigner -keystore testKeys newt-natives-linux-amd64.jar ww
 
  
 
jarsigner -keystore testKeys gluegen-rt-natives-macosx-universal.jar ww
 
jarsigner -keystore testKeys gluegen-rt-natives-macosx-universal.jar ww
jarsigner -keystore testKeys jogl-natives-macosx-universal.jar ww
+
jarsigner -keystore testKeys jogl-all-natives-macosx-universal.jar ww
jarsigner -keystore testKeys nativewindow-natives-macosx-universal.jar ww
 
jarsigner -keystore testKeys newt-natives-macosx-universal.jar ww
 
 
</pre>
 
</pre>
  

Revision as of 17:00, 20 September 2011

You can use JOGL in a Java Web Start (JWS) application, which lets you launch a full-featured, standalone Java program from a web page. This page shows an example of how to do this. The example program just draws one triangle that fills a resizable window.

Base class

First, a base class that we've used before here. This class draws one triangle, abstracting out all the pure OpenGL calls that don't depend on the choice of window toolkit. Save this file as OneTriangle.java.

package name.wadewalker.jogl2tests.onetriangle;

import javax.media.opengl.GL;
import javax.media.opengl.GL2;
import javax.media.opengl.glu.GLU;

public class OneTriangle {
    protected static void setup( GL2 gl2, int width, int height ) {
        gl2.glMatrixMode( GL2.GL_PROJECTION );
        gl2.glLoadIdentity();

        // coordinate system origin at lower left with width and height same as the window
        GLU glu = new GLU();
        glu.gluOrtho2D( 0.0f, width, 0.0f, height );

        gl2.glMatrixMode( GL2.GL_MODELVIEW );
        gl2.glLoadIdentity();

        gl2.glViewport( 0, 0, width, height );
    }

    protected static void render( GL2 gl2, int width, int height ) {
        gl2.glClear( GL.GL_COLOR_BUFFER_BIT );

        // draw a triangle filling the window
        gl2.glLoadIdentity();
        gl2.glBegin( GL.GL_TRIANGLES );
        gl2.glColor3f( 1, 0, 0 );
        gl2.glVertex2f( 0, 0 );
        gl2.glColor3f( 0, 1, 0 );
        gl2.glVertex2f( width, 0 );
        gl2.glColor3f( 0, 0, 1 );
        gl2.glVertex2f( width / 2, height );
        gl2.glEnd();
    }
}

Drawing a triangle with AWT

Now, a class that draws the triangle in an AWT Frame. Java Web Start can use any Java windowing toolkit, we've just chosen this one for convenience. Save this file as OneTriangleAWT.java.

package name.wadewalker.jogl2tests.onetriangle;

import javax.media.opengl.GLAutoDrawable;
import javax.media.opengl.GLEventListener;
import javax.media.opengl.GLProfile;
import javax.media.opengl.GLCapabilities;
import javax.media.opengl.awt.GLCanvas;

import java.awt.Frame;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

/**
 * A minimal program that draws with JOGL in an AWT Frame.
 *
 * @author Wade Walker
 */
public class OneTriangleAWT {

    static {
        // setting this true causes window events not to get sent on Linux if you run from inside Eclipse
        GLProfile.initSingleton( false );
    }

    public static void main( String [] args ) {
        GLProfile glprofile = GLProfile.getDefault();
        GLCapabilities glcapabilities = new GLCapabilities( glprofile );
        final GLCanvas glcanvas = new GLCanvas( glcapabilities );

        glcanvas.addGLEventListener( new GLEventListener() {
            
            @Override
            public void reshape( GLAutoDrawable glautodrawable, int x, int y, int width, int height ) {
                OneTriangle.setup( glautodrawable.getGL().getGL2(), width, height );
            }
            
            @Override
            public void init( GLAutoDrawable glautodrawable ) {
            }
            
            @Override
            public void dispose( GLAutoDrawable glautodrawable ) {
            }
            
            @Override
            public void display( GLAutoDrawable glautodrawable ) {
                OneTriangle.render( glautodrawable.getGL().getGL2(), glautodrawable.getWidth(), glautodrawable.getHeight() );
            }
        });

        final Frame frame = new Frame( "One Triangle AWT" );
        frame.add( glcanvas );
        frame.addWindowListener( new WindowAdapter() {
            public void windowClosing( WindowEvent windowevent ) {
                frame.remove( glcanvas );
                frame.dispose();
                System.exit( 0 );
            }
        });

        frame.setSize( 640, 480 );
        frame.setVisible( true );
    }
}

Setting up the application directory

Note that none of your applet Jar files needs to be signed. Only the Jogamp files (GlueGen, JOGL, ..) require code signing.

  • Create a directory to hold your JWS application.
  • Create a subdirectory name/wadewalker/jogl2tests/onetriangle inside your application directory. Or if you changed the packages of the files above, create a subdirectory that matches your package names.
  • Put your OneTriangle.java and OneTriangleAWT.java files inside the subdirectory.

Using Your own Signed Jar and Jnlp Files

  • Copy all JogAmp Jar files ([[1]] and [[2]]) into the application directory.
  • Copy the JogAmp [files] into that application directory
gluegen-rt.jar
jogl.all.jar

gluegen-rt-natives-windows-i586.jar
jogl-all-natives-windows-i586.jar

gluegen-rt-natives-windows-amd64.jar
jogl-all-natives-linux-amd64.jar

gluegen-rt-natives-linux-i586.jar
jogl-all-natives-linux-i586.jar

gluegen-rt-natives-linux-amd64.jar
jogl-all-natives-linux-amd64.jar

gluegen-rt-natives-macosx-universal.jar
jogl-all-natives-macosx-universal.jar

Compiling and JARing your program

This step assumes you have Java set up so you can use it from the command line. For instructions on this, see here.

To compile the program on Windows, cd to your application directory and type

javac -classpath "gluegen-rt.jar;nativewindow.all.jar;jogl.all.jar;newt.all.jar" name\wadewalker\jogl2tests\onetriangle\*.java

To compile the program on Linux or Mac OS X, cd to your application directory and type

javac -classpath "gluegen-rt.jar:nativewindow.all.jar:jogl.all.jar:newt.all.jar" name\wadewalker\jogl2tests\onetriangle\*.java

To JAR the program, type

jar cvf onetriangle.jar name\wadewalker\jogl2tests\onetriangle\*.class

Testing your program outside JWS

It's probably a good idea to test your program outside JWS first, to make sure it does what you think it should. To do that, you'll need to unzip the native binaries so Java can see them. Since I ran first on Windows 7 64-bit, I unzipped all the *-natives-windows-amd64.jar files, the collected the DLLs inside into a directory called lib-windows-amd64. Since I test on the other platforms too, I did the same for the other four platforms, creating four more directories lib-windows-i586, lib-linux-i586, lib-linux-amd64, and lib-macosx-universal.

Then to test your program on 64-bit Windows, cd to your application directory and type

java -classpath "gluegen-rt.jar;jogl.all.jar;onetriangle.jar" -Djava.library.path=lib-windows-amd64 name.wadewalker.jogl2tests.onetriangle.OneTriangleAWT

On 64-bit Linux, type

java -classpath "gluegen-rt.jar:jogl.all.jar:onetriangle.jar" -Djava.library.path=lib-linux-amd64 name.wadewalker.jogl2tests.onetriangle.OneTriangleAWT

On Mac OS X, type

java -classpath "gluegen-rt.jar:jogl.all.jar:onetriangle.jar" -Djava.library.path=lib-macosx-universal name.wadewalker.jogl2tests.onetriangle.OneTriangleAWT

The result should look like this:

JWS OneTriangle test

Writing the JNLP files

Read the JWS Java Network Launching Protocol (JNLP) specification for details.

In general we will have one exclusive JNLP file for each application, which will reference the JOGL extension's JNLP file. The latter may reference even more JNLP files, but this shall not matter in this discussion.

Use JogAmp's deployed files

<?xml version="1.0" encoding="utf-8"?>
<jnlp spec="1.0+" codebase="./"
  href="OneTriangleWebStart.jnlp">

  <information>
    <title>OneTriangle Demo</title>
    <vendor>JogAmp Community</vendor>
    <homepage href="http://jogamp.org/"/>
    <description>OneTriangle Java Web Start Demo</description>
    <description kind="short">The simplest possible JOGL Java Web Start demo - draws one triangle.</description>
    <offline-allowed/>
  </information>
  <update check="background" policy="always"/>

  <resources>
    <j2se href="http://java.sun.com/products/autodl/j2se" version="1.4+"/>
    <property name="sun.java2d.noddraw" value="true"/>
    <extension name="jogl-all-awt" href="http://jogamp.org/deployment/jogamp-current/jogl-all-awt.jnlp" />
    <jar href="onetriangle.jar" main="true"/>
  </resources>

  <application-desc main-class="name.wadewalker.jogl2tests.onetriangle.OneTriangleAWT">
  </application-desc>
</jnlp>

Save this file to your application directory as OneTriangleWebStart.jnlp.

Use your own JogAmp files

Read the JWS Java Network Launching Protocol (JNLP) files to find the JAR files that make up your application. Our main JNLP file looks like this:

<?xml version="1.0" encoding="utf-8"?>
<jnlp spec="1.0+" codebase="./"
  href="OneTriangleWebStart.jnlp">

  <information>
    <title>OneTriangle Demo</title>
    <vendor>JogAmp Community</vendor>
    <homepage href="http://jogamp.org/"/>
    <description>OneTriangle Java Web Start Demo</description>
    <description kind="short">The simplest possible JOGL Java Web Start demo - draws one triangle.</description>
    <offline-allowed/>
  </information>
  <update check="background" policy="always"/>

  <resources>
    <j2se href="http://java.sun.com/products/autodl/j2se" version="1.4+"/>
    <property name="sun.java2d.noddraw" value="true"/>
    <extension name="JOGL" href="JOGL.jnlp" />
    <jar href="onetriangle.jar" main="true"/>
  </resources>

  <application-desc main-class="name.wadewalker.jogl2tests.onetriangle.OneTriangleAWT">
  </application-desc>
</jnlp>

Save this file to your application directory as OneTriangleWebStart.jnlp.

Our extension JNLP file for the JOGL JARs looks like this:

<?xml version="1.0" encoding="utf-8"?>
<jnlp spec="1.0+" codebase="./"
  href="JOGL.jnlp">

  <information>
    <title>JOGL libraries</title>
    <vendor>JogAmp Community</vendor>
    <homepage href="http://jogamp.org/"/>
    <description>JOGL libraries</description>
    <description kind="short">All JARs and native libraries for JOGL.</description>
    <offline-allowed/>
  </information>
  <update check="background" policy="always"/>

  <security>
    <all-permissions/>
  </security>

  <resources>
    <jar href="gluegen-rt.jar" />
    <jar href="jogl.all.jar" />
  </resources>

  <resources os="Windows" arch="x86">
    <nativelib href = "gluegen-rt-natives-windows-i586.jar" />
    <nativelib href = "jogl-all-natives-windows-i586.jar" />
  </resources>
  <resources os="Windows" arch="amd64">
    <nativelib href = "gluegen-rt-natives-windows-amd64.jar" />
    <nativelib href = "jogl-all-natives-windows-amd64.jar" />
  </resources>
  <resources os="Windows" arch="x86_64">
    <nativelib href = "gluegen-rt-natives-windows-amd64.jar" />
    <nativelib href = "jogl-all-natives-windows-amd64.jar" />
  </resources>
  <resources os="Linux" arch="i386">
    <nativelib href = "gluegen-rt-natives-linux-i586.jar" />
    <nativelib href = "jogl-all-natives-linux-i586.jar" />
  </resources>
  <resources os="Linux" arch="x86">
    <nativelib href = "gluegen-rt-natives-linux-i586.jar" />
    <nativelib href = "jogl-all-natives-linux-i586.jar" />
  </resources>
  <resources os="Linux" arch="amd64">
    <nativelib href = "gluegen-rt-natives-linux-amd64.jar" />
    <nativelib href = "jogl-all-natives-linux-amd64.jar" />
  </resources>
  <resources os="Linux" arch="x86_64">
    <nativelib href = "gluegen-rt-natives-linux-amd64.jar" />
    <nativelib href = "jogl-all-natives-linux-amd64.jar" />
  </resources>
  <resources os="Mac OS X" arch="i386">
    <nativelib href = "gluegen-rt-natives-macosx-universal.jar" />
    <nativelib href = "jogl-all-natives-macosx-universal.jar" />
  </resources>
  <resources os="Mac OS X" arch="x86_64">
    <nativelib href = "gluegen-rt-natives-macosx-universal.jar" />
    <nativelib href = "jogl-all-natives-macosx-universal.jar" />
  </resources>

  <component-desc />
</jnlp>

Save this file to your application directory as JOGL.jnlp.

Note that the codebase values are set to the current working directory, and the href values are simple filenames. This is so we can test the JNLP app locally, without using a web server. When we put the app on a web server later, the codebase and href become full URLs.

Signing your JARs

For the JWS app to work properly in a web browser, all its JARs must be signed with the same key. If you don't already have a key you want to use, you can create one like this

keytool -genkey -keystore testKeys -alias ww

The alias can be anything, I just chose ww for this example. Once you have a key, you can sign the JARs like this:

jarsigner -keystore testKeys gluegen-rt.jar ww
jarsigner -keystore testKeys jogl.all.jar ww

jarsigner -keystore testKeys gluegen-rt-natives-windows-i586.jar ww
jarsigner -keystore testKeys jogl-all-natives-windows-i586.jar ww

jarsigner -keystore testKeys gluegen-rt-natives-windows-amd64.jar ww
jarsigner -keystore testKeys jogl-all-natives-windows-amd64.jar ww

jarsigner -keystore testKeys gluegen-rt-natives-linux-i586.jar ww
jarsigner -keystore testKeys jogl-all-natives-linux-i586.jar ww

jarsigner -keystore testKeys gluegen-rt-natives-linux-amd64.jar ww
jarsigner -keystore testKeys jogl-all-natives-linux-amd64.jar ww

jarsigner -keystore testKeys gluegen-rt-natives-macosx-universal.jar ww
jarsigner -keystore testKeys jogl-all-natives-macosx-universal.jar ww

Unfortunately, if you sign this way you'll have to type your password every time. Alternately, you can use the Ant <signjar> task to sign these from an Ant file that contains your password.

Running the JWS application locally

To run the JWS app locally without a web server, cd to the application directory and type

javaws OneTriangleWebStart.jnlp

This runs the app with the JWS launcher. The result should look just like when we ran the app without the launcher, but there'll be a dialog box that pops up first asking the user's permission to load the app. If you have any JAR signing problems, they should show up at this point.

Clearing the JWS cache

JWS caches JAR and JNLP files to reduce load time. Unfortunately, if you edit one of these files and re-launch, sometimes you won't see your changes because JWS is still using the cached copy. To clear the JWS cache, type

javaws -Xclearcache

Running the JWS application from a web server

*This section is unfinished*

Once you're sure that the JWS application launches correctly from the local file system, you're ready to deploy it to a web server.

  • Create or choose an application directory on your web server.
  • Change the codebase entries in the JNLP from directory names to URLs that refer to the application directory on your web server.
  • Copy all the JAR and JNLP files from your local application directory to the application directory on your web server.
  • Put a link to the OneTriangleWebStart.jnlp file on a page on your web server (more details here).