Java WebStart, also called Java Network Launching Protocol (JNLP), allows you to launch Java applications directly from the internet using a webbrowser. In this article we will create a simple application and all configuration files necessary to launch it through Java WebStart.
We start with a simple Java program with a GUI:
package nl.jansipke.samplegui; import javax.swing.JFrame; import javax.swing.SwingUtilities; public class SampleGUI extends JFrame { private static final long serialVersionUID = 522159447010444143L; public SampleGUI() { setTitle("Sample GUI"); setSize(300, 200); setLocationRelativeTo(null); setDefaultCloseOperation(EXIT_ON_CLOSE); } public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { public void run() { SampleGUI sampleGUI = new SampleGUI(); sampleGUI.setVisible(true); } }); } }
Java WebStart applications run in a sandbox with very limited default capabilities. The application can ask for extra permissions in the JNLP file, as can be seen in the following file.
<?xml version="1.0" encoding="utf-8"?> <jnlp spec="1.0+" codebase="http://www.jansipke.nl" href="SampleGUI.jnlp"> <information> <title>SampleGUI</title> <vendor>Some Vendor Name</vendor> <homepage href="http://www.jansipke.nl"/> <description>SampleGUI description</description> </information> <security> <all-permissions/> </security> <resources> <j2se version="1.6+"/> <jar href="SampleGUI.jar"/> </resources> <application-desc main-class="nl.jansipke.samplegui.SampleGUI"/> </jnlp>
The JAR file needs to be signed for these permissions to take effect. We need to create a keystore file for that first. If needed you may change the alias and the keystore file name.
keytool -genkey -alias alias -keystore keystore.bin
Answer the questions the keytool command asks and copy the file into a directory where the following ANT build script can find it:
<?xml version="1.0" encoding="UTF-8"?> <project name="samplegui" basedir="."> <property name="dir.build" value="bin" /> <property name="dir.dist" value="dist" /> <property name="dir.src" value="src" /> <property name="file.jar" value="SampleGUI.jar" /> <path id="compile.classpath"> <fileset dir="."> <include name="lib/*.jar" /> </fileset> </path> <target name="clean" description="Clean project"> <delete dir="${dir.build}" /> </target> <target name="prepare" description="Prepare project"> <mkdir dir="${dir.build}" /> </target> <target name="compile" description="Compile project" depends="prepare"> <javac destdir="${dir.build}" classpathref="compile.classpath" debug="true" includeantruntime="false"> <src path="${dir.src}" /> </javac> </target> <target name="jar" description="Build jar file" depends="compile"> <mkdir dir="${dir.dist}" /> <jar destfile="${dir.dist}/${file.jar}" basedir="${dir.build}"> <manifest> <attribute name="Main-Class" value="nl.jansipke.samplegui.SampleGUI"/> </manifest> </jar> </target> <target name="signjar" description="Sign jar file" depends="jar"> <signjar jar="${dir.dist}/${file.jar}" alias="alias" storepass="secret" keystore="keystore.bin"/> </target> </project>
Now run the ANT script (target signjar) and copy the resulting JAR file and the JNLP file to a directory on your webserver. Fire up a webbrowser and point it to the JNLP file. If all goes well, it will present you with a warning about permissions. Check yes and it will start the application.