更新时间:2022-08-16 20:53:55
最近由于工作关系,老大嘱咐我看一下Java Web Start。以前安装JDK时,会在“开始”菜单加一个快捷菜单“Java Web Start”,也不知是做什么用的,我一般都是删除。今天从网上查了一下资料,不看不知道,一看吓一跳,觉得这JWS(Java Web Start简称)很象传说中的“服务器端小程序下载运行”。而且JWS很早就有了,我看有些文章资料已经是2002年发的,自己竟然全然不知它的存在,实在是愚昧呀。
B/S风行的一个很大原因就是它有部署方便的优势,这是C/S的Application所无法比拟的。现在,JWS让用户可以下载服务器端的Java Application到本机运行,并且没有安装、配置等繁琐的操作。SUN网站上有Demo,大家可以体验一下效果:http://java.sun.com/products/javawebstart/demos.html 。
浏览器的运行Java Applica ton的链接指向的不是程序本身,而是一个*.jnlp文件,这个文件包含了Java Application的一些配置信息。然后JWS解读这个文件的信息,将服务器端的Java Application下载到本机上,并运行。
当然第一次运行程序时,由于要下载所以速度会稍微慢一些,不过第二次运行时,JWS会自动去服务器上检查是否有新的程序版本发布,如果没有就会直接运行本机已经下载的程序,这就和运行本机Java Application没什么区别了。运行程序之初,JWS还会提示你是否创建一个相应的快捷菜单。
程序下载到本机的默认位置是:“C:\Documents and Settings\admin\Application Data\Sun\Java\Deployment\javaws\cache\indirect\indirect12423.ind”,你可以在本机的“JWS应用程序管理器”的里重新设置此存放目录。
JWS无疑要比Applet的应用范围更广(据说还得过**的***创意奖),它对于布署一些小型的程序应用是非常方便的,但我以为现在还主要适用于局域网。因为一个程序一般约有几十M,如果是Internet用户第一次的下载速度会很慢。
但和Applet一样,JWS也面临安全性问题,默认情况下JWS对本机磁盘和本地网络的访问是有限制的。如果该程序要越权访问,这时会弹出一个警告框(类似于ActivX的数字签名),用户可以自已决定是否信任该软件,而对其放开限制。
JWS的优点就是让程序的布署更简单,而且用户端的应用可以时刻保持和服务器端的最新版本同步,这为升级版本提供了很大的方便。缺点也是明显的,由于要运行应用必须一次下载所有的程序文件(JWS的jnlp配置文件有个lazy选项,但作用不明显),所以第一次下载速度很慢,不适用于互联网。从这一点来看B/S形式的应用还是有优势的。
http://www.chinaitlab.com/www/news/article_show.asp?id=25239
http://blog.csdn.net/emag_java/archive/2005/01/13/252047.aspx
由于本BLOG现主要以Eclipse和SWT为内容,所以Java Web Start(简称JWS)也以一个SWT应用程序来做为示例。本文用<Eclipse从入门到精通>书中打包一章的打包结果为示例,该示例为一个SWT/JFace程序,其打包后的文件结构如下:
说明:
如果是在本地运行此程序,双击myswt.jar即可(要求Windows中jar格式的文件默认用javaw.exe打开,如下图所示:
现在我们要将这个程序用JWS部署到服务器端,然后编写一个网页,让用户单击网页上的链接就可以下载该SWT程序并运行。
本人的开发环境为:WinodwsXP SP2 + JDK1.4.2 + Tomcat 5.0.28
(1)首先得先安装Tomcat,这一步的操作方法本文省略
(2)在Tomcat的webapps\ROOT路径下创建一个“myswt”目录。在我的电脑上,其绝对路径如下:E:\Program Files\Apache Software Foundation\Tomcat 5.0\webapps\ROOT\myswt。
(3)将前面所述的SWT程序的文件复制到webapps\ROOT\myswt目录中。
创建一个批处理文件:key.bat
c:\jdk\bin\keytool -genkey -keystore myKeystore -alias myself
c:\jdk\bin\keytool -list -keystore myKeystore
pause
说明:
运行批处理key.bat后的全部输入过程如下图所示:
(1)因为签名只认jar包,所以先将swt-win32-3063.dll文件用WinRAR或c:\jdk\bin\jar打一个jar包(swt-win32-3063.jar)。客户端下载后,会自动解开此包,将swt-win32-3063.dll还原到客户端。
注意:如果你用WinRAR打包,在压缩时必须选ZIP格式,不能选RAR格式。
(2)创建一个用于签名的批处理文件:jarsigner.bat,其内容如下:
c:\jdk\bin\jarsigner -keystore myKeystore myswt.jar myself
c:\jdk\bin\jarsigner -keystore myKeystore lib\jface.jar myself
c:\jdk\bin\jarsigner -keystore myKeystore lib\runtime.jar myself
c:\jdk\bin\jarsigner -keystore myKeystore lib\swt.jar myself
c:\jdk\bin\jarsigner -keystore myKeystore swt-win32-3063.jar myself
pause
<?xml version="1.0" encoding="GBK"?>
<jnlp codebase="http://localhost:8080/myswt">
<information>
<title>子在川曰(http://blog.csdn.net/glchengang)</title>
<vendor>陈刚</vendor>
<offline-allowed/>
</information>
<security>
<all-permissions/>
</security>
<resources>
<j2se version="1.4+"/>
<jar href="myswt.jar"/>
<jar href="lib/jface.jar"/>
<jar href="lib/runtime.jar"/>
<jar href="lib/swt.jar"/>
<nativelib href="swt-win32-3063.jar"/>
</resources>
<application-desc main-class="jface.dialog.wizard.WizardDialog1"/>
</jnlp>
(2)创建一个HTML网页,网页指向jnlp文件。我们给此HTML网页取名:test.html,其内容如下:
<A HREF="myswt.jnlp">启动</A>
(1)最后的服务器的目录结构如下图所示:
(2)用浏览器浏览:http://localhost:8080/myswt/test.html
单击“启动”后出现下图,开始从服务器上下载SWT应用程序:
下载完成后,出现如下图,提示用户是否向应用程序开放本机所有权限(弹出这个对话框是由jnlp文件中的<security>项设置决定的)。
单击“启动”按钮,将运行程序,出现下图。(附注:这里没有弹出提示你添加快捷菜单的对话框)
(1)如果单击网页的“启动”链接时,显示的是jnlp文件的内容,还非下载服务器的应用程序。这时你需要做如下检查:
<mime-mapping>
<extension>class</extension>
<mime-type>application/java</mime-type>
</mime-mapping>
<mime-mapping>
<extension>jar</extension>
<mime-type>application/java-archive</mime-type>
</mime-mapping>
<mime-mapping>
<extension>jnlp</extension>
<mime-type>application/x-java-jnlp-file</mime-type>
</mime-mapping>
(2)在使用Java Web Start的时候可能会出现"下载资源错误",大致的出错信息如下:
JNLPException[category: Download Error : Exception:
java.io.IOException:
rename failed in cache : LaunchDesc: null ] at.....
<application-desc main-class="XBFrame"/>
<argument>-port</argument>
<argument>1008</argument> "注意-port和1008是两个参数,要分开写
</application-desc>