Java Web Start (Jnlp) Tutorial
Here is a brief explanation about Java Web Start from SUN
“Java Web Start is a mechanism for program delivery through a standard Web server. Typically initiated through the browser, these programs are deployed to the client and executed outside the scope of the browser. Once deployed, the programs do not need to be downloaded again, and they can automatically download updates on startup without requiring the user to go through the whole installation process again.”
This tutorial shows you how to create a Java Web Start (Jnlp) file for user to download, when user click on the downloaded jnlp file, launch a simple AWT program. Here’s the summary steps :
- Create a simple AWT program and jar it as TestJnlp.jar
- Add keystore into TestJnlp.jar
- Create a Jnlp file
- Put all into Tomcat Folder
- Access TestJnlp.jar from web through http://localhost:8080/Test.Jnlp
Ok, let’s start
1. Install JDk and Tomcat
Install Java JDK/JRE version above 1.5 and Tomcat.
2. Directory Structure
Directory structure of this example.
3. AWT + Jnlp
See the content of TestJnlp.java, it’s just a simple AWT program with AWT supported.
package com.mkyong; import java.awt.*; import javax.swing.*; import java.net.*; import javax.jnlp.*; import java.awt.event.ActionListener; import java.awt.event.ActionEvent; public class TestJnlp { static BasicService basicService = null; public static void main(String args[]) { JFrame frame = new JFrame("Mkyong Jnlp UnOfficial Guide"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JLabel label = new JLabel(); Container content = frame.getContentPane(); content.add(label, BorderLayout.CENTER); String message = "Jnln Hello Word"; label.setText(message); try { basicService = (BasicService) ServiceManager.lookup("javax.jnlp.BasicService"); } catch (UnavailableServiceException e) { System.err.println("Lookup failed: " + e); } JButton button = new JButton("http://www.mkyong.com"); ActionListener listener = new ActionListener() { public void actionPerformed(ActionEvent actionEvent) { try { URL url = new URL(actionEvent.getActionCommand()); basicService.showDocument(url); } catch (MalformedURLException ignored) { } } }; button.addActionListener(listener); content.add(button, BorderLayout.SOUTH); frame.pack(); frame.show(); } }
P.S If “import javax.jnlp.*;” is not found, please include jnlp library which located at JRE/lib/javaws.jar.
4. Jar It
Located your Java’s classes folder and Jar it with following command in command prompt
jar -cf TestJnlp.jar *.*
This will packs all the Java’s classes into a new jar file, named “TestJnlp.jar“.
5. Create keystore
Add a new keystore named “testkeys”
keytool -genkey -keystore testKeys -alias jdc
It will ask for keystore password, first name, last name , organization’s unit…etc..just fill them all.
6. Assign keystore to Jar file
Attached newly keystore “testkeys” to your “TestJnlp.jar” file
jarsigner -keystore testKeys TestJnlp.jar jdc
It will ask password for your newly created keystore
7. Deploy JAR it
Copy your “TestJnlp.jar” to Tomcat’s default web server folder, for example, in Windows – C:\Program Files\Apache\Tomcat 6.0\webapps\ROOT.
8. Create JNLP file
Create a new Test.jnlp file like this
<?xml version="1.0" encoding="utf-8"?> <jnlp spec="1.0+" codebase="http://localhost:8080/" href="Test.jnlp"> <information> <title>Jnlp Testing</title> <vendor>YONG MOOK KIM</vendor> <homepage href="http://localhost:8080/" /> <description>Testing Testing</description> </information> <security> <all-permissions/> </security> <resources> <j2se version="1.6+" /> <jar href="TestJnlp.jar" /> </resources> <application-desc main-class="com.mkyong.TestJnlp" /> </jnlp>
9. Deploy JNLP file
Copy Test.jnlp to your tomcat default web server folder also.
C:\Program Files\Apache\Tomcat 6.0\webapps\ROOT
10. Start Tomcat
C:\Tomcat folder\bin\tomcat6.exe
11. Test it
Access URL http://localhost:8080/Test.jnlp, it will prompt you to download the Test.jnlp file, just accept and double click on it.
If everything went fine, you should see following output
Click on the “run” button to launch the AWT program.
If jnlp has not response, puts following codes in your web.xml, which located in Tomcat conf folder.
<mime-mapping> <extension>jnlp</extension> <mime-type>application/x-java-jnlp-file</mime-type> </mime-mapping>











Thanks. Learning by example with web-based applications is much easier. That was very helpful.
Hi mkyong ,
I have a stand-alone java application (swing based).
I want the pop-up to come up from the customer (where the application is running) machine, if any new updates (in terms of new jars/modified jars) to alert and ask the customer to apply the fix/patch, whatever you call.
For this scenario, jnlp/webstart will be useful or think about any other java mechanism?
Thanks,
Guru
Is it possible to set the path and java_home directory in the jnlp?
Example
set path=\\server\webutil\client\jre6\bin;\\server\webutil;%path%
set java_home=\\server\webutil\client\jre6
Thanks
hello
I place TestJnlp in c:\LJava\src\com\mkyong\TestJnlp.java
I place javaws.jar in the same directory
from c:\LJava i do javac by :
javac -d build src\com\mkyong\TestJnlp.java
I got “package javac.jnlp does not exist
what i have done wrong ?
thank you
excellent, thanks!
Thanks for the post.
P.S If “import javax.jnlp.*;” is not found, please include jnlp library which located at JRE/lib/javaws.jar.
solution for refrence problem: javaws.jar could not be found.
Where it says
P.S If “import javax.jnlp.*;” is not found, please include jnlp library which located at JRE/lib/javaws.jar.
i get this when i goto compile your TestJnlp.java
How do i “include” the jnlp library?
Thanks
you can find the “javaws.jar” file in your “JRE_INSTALLED_FOLDER/lib/’
Hi,
Thanks for the wonderful tutorial to know about jnlp. I did the same way for placing the jnlp file in web server(tomcat) root folder and it’s working fine in my machine. But, when i access from other machine, it’s not working. Getting the following error,
com.sun.deploy.net.FailedDownloadException: Unable to load resource
Any help would be appreciated.
Search the line in JNLP where “http://localhost:8080/” is written. Replace “localhost” with your machines IP address. It will run through any machine in ur Local Network. :)
Hi,
thanks for the tutorial.
I have a requirement that using an applet , I want to download an exe on clients machine and run that exe automatically behind the scene. how is that possible?
can your tutorial fit in my requirements OR do I need to change anything?
Please help.
Thanks in advance.
-Parvendra
Applet, if your client accepted your Applet’s signed certificate, then you can do whatever you want.
i need to work with dll in applet ,
please if you have any tutorial help me.
Can JNLP application install in windows so that all users will access the same deployment folder. That is if the application is updated by one user, the others will users get the same?
I have seen this done in Linux where the installation is in the root folder.
Hope to hear back on this.
thanks
Not much inputs on this, hope get some feedback from others :)
[...] Posted by sinister on December 24, 2010 Java Web Start is a mechanism for program delivery through a standard Web server. Typically initiated through the browser, these programs are deployed to the client and executed outside the scope of the browser. Once deployed, the programs do not need to be downloaded again, and they can automatically download updates on startup without requiring the user to go through the whole installation process again.Here is an interesting link to create jnlp files [...]
(Sory for my english)
Hi I took your example as base for my small application the main problem is that works when called from command line(javaws) but no when launched from browser(firefox).I use jni to load an small library and all this is done in Fedora 13.Any ideas, thoughts ? Thanks in advance.
Mind to zip and send me your jnlp file for review?
Sorry, maybe it’s a bit dumb but How do I send you an e-mail?
thnx for the great example!
Hi,
Is it possible to call .jnlp file from a standalone java application. I dont want to use browser. If it is possible, can you please let me know how.The whole idea is that i want to check if the client jars are different version then the server jar and if they are different, i want to download the updated jar files from the server.
Thanks,
Nitesh
It is really simple and super ……
Hi! Simple (maybe dumb) question – what is the advantage of running the executable locally (by double-clicking on the Test.jnlp file) versus just going to the website again (http://myserver:8080/Test.jnlp)? Assuming that my jnlp file require connectivity to ‘myserver’. Is there any harm with just going to http://myserver:8080/Test.jnlp over and over again?
Thx in advance!
Jim
there are no dumb question, it’s just from different perspectives. Both ways are doing the same thing, there’s no different between each other.
One of the advantage of running through website “http://myserver:8080/Test.jnlp” is you will always get the latest jlnp version.
I am getting ClassNotFoundException is there anyone to help me out
Which class is not found?
User Runnable jar instead of simple jar
When i run the app at last step its gets downloaded but its not getting launched…
Is this bcoz of my apache mime? i use fedora 12. and apache installed.
Received your files in my email, please send me your jnlp file as well.
Thank you so much for this simple and functional example.
yong mook kim,
very nice blog. helps very much to get a general idea of things. good starting point for beginners and to have a quick view. good ratio between depth and lack of too many words. :-)
sebastian
the root cause is your package and folder structure. Please jar your classes in a correct folder structure according to your package declaration.
Without setting in Manifest File, It didn’t work.
What can i do ?
What are the settings to do in manifest file in a real time large application ?
Hi,
In the Manifest FIle, I have specified
Manifest-Version: 1.0
Class-Path: /lib/javaws.jar
Main-Class: com.ibm.TestJnlp
Then it worked as desired.
Thanks a lot.
Nice hack ~ but when you develop a real application which included a lot of java classes, then it’s may not a good choice :)
I have uploaded the files in zip folder @ http://www.filedropper.com/testjnlp2.
When i run the http://localhost:8080/Test2.jnlp in browser, I am getting the below Exception
java.lang.ClassNotFoundException: com.ibm.TestJnlp2
Your TestJnlp2.class is not found in TestJnlp2.jar.
Cause:
1) TestJnlp2.java is package in com.ibm, but the class is located at root folder. Please include the folder (com\ibm) in TestJnlp2.jar as correct structure below
Current structure
TestJnlp2.jar
—————-
META-INF
javaws.jar
TestJnlp2.class
Correct structure
TestJnlp2.jar
—————-
META-INF
javaws.jar
com\ibm\TestJnlp2.class
2) Test2.jnlp contains one minor bug also, it’s point to Test.jnlp, change it to Test2.jnlp.
Hope help :)
Hi,
In the zip file i have sent, I have wrongly mentioned TestJnlp instead of TestJnlp2. When i tested, i correctly mentioned in JNLP as
Still I am getting java.lang.ClassNotFoundException: com.ibm.TestJnlp2
Thanks
Hi,
I have uploaded the files in zip folder @ http://www.filedropper.com/testjnlp2
When i run the http://localhost:8080/Test2.jnlp in browser, I am getting the below Exception
java.lang.ClassNotFoundException: com.ibm.TestJnlp2
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at com.sun.jnlp.JNLPClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at com.sun.javaws.Launcher.doLaunchApp(Unknown Source)
at com.sun.javaws.Launcher.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
Hi,
I am getting “java.lang.NoClassDefFoundError: TestJnlp” Error while i run in tomcat.
do u know the reason ?
Thanks
can you zip and send me a copy of your file, i try deploy and test it
Thanks .. Its So helpful for Beginers…
Nice how-to, thanks!
I think by keystroke you meant keystore:)
sorry for typo, thanks, it’s fixed now :)