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包
  1. //FileHelloJNLP.java
  2. importjavax.swing.*;
  3. importjava.awt.*;
  4. importjava.awt.event.*;
  5. importjava.io.*;
  6. importjava.net.*;
  7. publicclassHelloJNLPextendsJFrameimplementsActionListener{
  8. /**
  9. *
  10. */
  11. privatestaticfinallongserialVersionUID=1L;
  12. publicHelloJNLP(){
  13. super("HelloJNLP");
  14. StringloadedFrom=this.getClass().getClassLoader().toString();
  15. JLabeljl=newJLabel("loadedby"+loadedFrom);
  16. JEditorPanejtp=newJEditorPane("text/plain","版本1.1.2");
  17. JButtonbb=newJButton("writenativefile");
  18. getContentPane().add(jl,BorderLayout.NORTH);
  19. getContentPane().add(jtp,BorderLayout.CENTER);
  20. getContentPane().add(bb,BorderLayout.SOUTH);
  21. bb.addActionListener(this);
  22. bb.setActionCommand("wnf");
  23. }
  24. publicstaticvoidmain(String[]args){
  25. JFramef=newHelloJNLP();
  26. f.setBounds(100,100,325,250);
  27. f.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
  28. f.setVisible(true);
  29. f.addWindowListener(newWindowAdapter(){
  30. publicvoidwindowClosed(WindowEvente){
  31. System.out.println("Shuttingdown...");
  32. System.exit(0);
  33. }
  34. });
  35. }
  36. publicvoidactionPerformed(ActionEventarg0){
  37. //System.out.println(arg0.getActionCommand());
  38. try{
  39. FileOutputStreamfos=newFileOutputStream("abcfile");
  40. try{
  41. fos.write(0xffff);
  42. fos.close();
  43. System.out.println("writefileok");
  44. }catch(IOExceptione){
  45. //TODOAuto-generatedcatchblock
  46. e.printStackTrace();
  47. }
  48. }catch(FileNotFoundExceptione){
  49. //TODOAuto-generatedcatchblock
  50. e.printStackTrace();
  51. }
  52. try{
  53. Socketsock=newSocket(InetAddress.getByName("www.cctv.com"),80);
  54. sock.close();
  55. System.out.println("socketcreateok");
  56. }catch(UnknownHostExceptione){
  57. //TODOAuto-generatedcatchblock
  58. e.printStackTrace();
  59. }catch(IOExceptione){
  60. //TODOAuto-generatedcatchblock
  61. e.printStackTrace();
  62. }
  63. }
  64. }


此应用在点JButton的时候测试写本地文件系统和使用本地网络资源。(编译和打包过程省略)

接着,也是我折腾了一天的事情,如何把此jar进行证书认证,使得此应用安装到用户那可以操作本地资源。原来我使用jdk的keytool工具生成证书,但是只可用半年,后来考虑去官方申请一个,居然要800$/年。最后考虑用openssl自己做,但是过程相当复杂,而且没法很好的控制流程,主要是对openssl命令不太熟悉用途。折腾了一天,终于发现原来java自己就可以生成使用限期自定义的证实。哎...

生成一个新的keystore
keytool-genkey-keystoremyKeystore-aliasmyself

生成一个私证书
keytool-selfcert-aliasmyself-keystoremyKeystore-validity365

注意-validity365为证书使用期限,为1年,可以自己定义更大。

对jar进行签名
jarsigner-keystoremyKeystorehello.jarmyself

这样签名工作就完成了。最后写个jnlp描述文件hello.jnlp


  1. <?xmlversion="1.0"encoding="UTF-8"?>
  2. <!--fileHello.jnlp-->
  3. <jnlpcodebase="http://192.168.1.6:81/jnlp/"
  4. href="http://192.168.1.6:81/jnlp/hello.jnlp">
  5. <information>
  6. <title>Hello</title>
  7. <vendor>TechTipsSampleMay2001</vendor>
  8. <iconhref="/jnlp/qq.jpg"/>
  9. </information>
  10. <resources>
  11. <j2seversion="1.3+"/>
  12. <jarhref="/jnlp/hello.jar"/>
  13. </resources>
  14. <security>
  15. <all-permissions>
  16. </security>
  17. <application-descmain-class="HelloJNLP"/>
  18. </jnlp>


我这里把jar和jnlp都放在192.168.1.6的主机上面,并且通过81port进行访问。你可以更加自己的需要修改上面的相关信息。

测试一下。http://192.168.1.6:81/jnlp/hello.jnlp用ie打开,马上会弹出一个你是否接受的筐,并且说明这个个人或者公司是不可信的(就因为不是权威机构申请的证书,哎),点接受后就可以正常运行jar中的程序,可以正常使用本地功能。

同样,applet经过上面步骤也可以操作本地,就好比经过签名的activeX一样,也好比一部分ie自己认为已经签名的activeX一样(其实就是系统漏洞,呵呵),请大家批评指正。

你可能感兴趣的:(java,Web,socket,IE,网络应用)