Java Web Start简单入门步骤
编写:桂静秋
参考:
http://java.sun.com/j2se/1.5.0/docs/guide/javaws/developersguide/contents.html
前言
项目需要,所以前几天研究了一下,折腾了我1.5天的时间,不能浪费,特此写出来share大家。
应用
JWS主要应用在发布应用程序上,主要写好了jnlp文件,用户通过http访问到,应用程序会自动安装在本地机器,今后升级等工作JWS将自动完成。可以说是发布软件的一种新方式。(当然,前提对方必须有jvm)
实施步骤
编写好一个测试文件,并且打成hello.jar包
//File HelloJNLP.java import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.net.*;
public class HelloJNLP
extends JFrame implements ActionListener {
/** * */ private static final long serialVersionUID = 1L;
public HelloJNLP() {
super (
"Hello JNLP" );
String loadedFrom =
this .getClass().getClassLoader().toString();
JLabel jl =
new JLabel (
"loaded by " + loadedFrom);
JEditorPane jtp =
new JEditorPane (
"text/plain" ,
"版本1.1.2" );
JButton bb =
new JButton (
"write native file" ); getContentPane().add(jl,
BorderLayout .NORTH); getContentPane().add(jtp,
BorderLayout .CENTER); getContentPane().add(bb,
BorderLayout .SOUTH); bb.addActionListener(
this ); bb.setActionCommand(
"wnf" ); }
public static void main(
String [] args) {
JFrame f =
new HelloJNLP(); f.setBounds(100, 100, 325, 250); f.setDefaultCloseOperation(DISPOSE_ON_CLOSE); f.setVisible(
true ); f.addWindowListener(
new WindowAdapter () {
public void windowClosed(
WindowEvent e) {
System .out.println(
"Shutting down..." );
System .exit(0); } }); }
public void actionPerformed(
ActionEvent arg0) {
//System.out.println(arg0.getActionCommand()); try {
FileOutputStream fos =
new FileOutputStream (
"abcfile" );
try { fos.write(0xffff); fos.close();
System .out.println(
"write file ok" ); }
catch (
IOException e) {
// TODO Auto-generated catch block e.printStackTrace(); } }
catch (
FileNotFoundException e) {
// TODO Auto-generated catch block e.printStackTrace(); }
try {
Socket sock =
new Socket (
InetAddress .getByName(
"www.cctv.com" ), 80); sock.close();
System .out.println(
"socket create ok" ); }
catch (
UnknownHostException e) {
// TODO Auto-generated catch block e.printStackTrace(); }
catch (
IOException e) {
// TODO Auto-generated catch block e.printStackTrace(); } } }
此应用在点JButton 的时候测试写本地文件系统和使用本地网络资源。(编译和打包过程省略)
接着,也是我折腾了一 天的事情,如何把此jar进行证书认证,使得此应用安装到用户那可以操作本地资源。原来我使用jdk的keytool工具生成证书,但是只可用半年,后来 考虑去官方申请一个,居然要800$/年。最后考虑用openssl自己做,但是过程相当复杂,而且没法很好的控制流程,主要是对openssl命令不太 熟悉用途。折腾了一天,终于发现原来java自己就可以生成使用限期自定义的证实。哎...
生成一个新的keystore
keytool -genkey -keystore myKeystore -alias myself
生成一个私证书
keytool -selfcert -alias myself -keystore myKeystore -validity 365
注意-validity 365为证书使用期限,为1年,可以自己定义更大。
对jar进行签名
jarsigner -keystore myKeystore hello.jar myself
这样签名工作就完成了。最后写个jnlp描述文件hello.jnlp
<?xml version=
"1.0" encoding=
"UTF-8" ?> <!-- file Hello.jnlp --> <jnlp codebase=
"http://192.168.1.6:81/jnlp/" href=
"http://192.168.1.6:81/jnlp/hello.jnlp" > <information> <title>Hello</title> <vendor>Tech Tips Sample May 2001</vendor> <icon href=
"/jnlp/qq.jpg" /> </information> <resources> <j2se version=
"1.3+" /> <jar href=
"/jnlp/hello.jar" /> </resources> <security> <all-permissions> </security> <application-desc main-
class =
"HelloJNLP" /> </jnlp>
我这里把jar和jnlp都放在192.168.1.6的主机上面,并且通过81port进行访问。你可以更加自己的需要修改上面的相关信息。
测 试一下。http://192.168.1.6:81/jnlp/hello.jnlp用ie打开,马上会弹出一个你是否接受的筐,并且说明这个个人或者 公司是不可信的(就因为不是权威机构申请的证书,哎),点接受后就可以正常运行jar中的程序,可以正常使用本地功能。
同样,applet经过上面步骤也可以操作本地,就好比经过签名的activeX一样,也好比一部分ie自己认为已经签名的activeX一样(其实就是系统漏洞,呵呵),请大家批评指正。