JWS主要用来通过网络部署你的应用程序,它具有安全、稳定、易维护、易使用的特点。用户访问用JWS部署应用程序的站点,下载发布的应用程序,既可以在线运行,也可以通过JWS的客户端离线运行已下载的应用程序。对同一个应用程序,在第一次运行时下载,以后每次运行时,JWS的客户端会自动去探测是否有版本更新,有更新就自动下载新版本,没有更新就直接运行本地当前版本,所有的麻烦全由JWS去承担。好,下面我们就一步一步来搭建JWS
实现一个Java Web Start的例子,工程webstart目录结构如下:
目录说明如下:
images :存放*.jnlp文件中定义的图标文件
jar :存放classes打包后的jar文件
jnlp :存放*.jnlp描述文件
src :java源码
WEB-INF/classes :java编译后的class文件
webatart 建立步骤如下:
1 .在webstart/src/jws下新建一HelloWorld.java文件:
package jws;
import javax.swing.*;
public class JWS {
private JFrame jFrame;
private JPanel jPanel;
private JLabel label;
public JWS (){
jFrame = new JFrame("HelloWorld Test Frame");
label = new JLabel("Hello, world!");
jPanel = new JPanel();
jPanel.add(label);
jFrame.add(jPanel);
jFrame.pack();
jFrame.setSize(400, 150);
jFrame.setLocation(400, 300);
jFrame.setVisible(true);
jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
// webstart 启动时执行的主方法
public static void main(String args[]){
new JWS ();
}
}
2 .编译JWS .java,在WEB-INF/classes目录下执行命令:
jar cvf jwstst.jar jws/*.class
执行后把生成的.jar包拷贝到webstart/jar/jws目录下。
3 .从jwstst.jar/META-INF中解压出MNIFEST.MF,更改MNIFEST.MF内容:
Manifest-Version: 1.0
Created-By: 1.5.0_01 (Sun Microsystems Inc.)
为:
Manifest-Version: 1.0
Created-By: 1.5.0_01 (Sun Microsystems Inc.)
Main-Class: jws.JWS
然后在WEB-INF/classes目录下执行命令:
jar umf MANIFEST.MF jwstst.jar
把新的MNIFEST.MF更新到jwstst.jar包中,
注: 如果在下面步骤4中的<application-desc main-class="jws.HelloWorld"/>指定了Main-Class方法,此步骤可以省略。
4 .webstart/jnlp目录下新建一jwstst.jnlp文件:
<?xml version="1.0" encoding="UTF-8"?>
<!--codebase 属性指出搜索应用程序资源的顶级URL,下面的icon/jar元素都是以这个URL为基本.-->
<jnlp codebase="http://127.0.0.1:8081/webstart">
<information>
<!-- 在"开始"-"运行"菜单中输入"javaws"或"javaws -viewer"启动Web Start,会看到客户端已经安装的webstart应用程序-->
<!--title :应用程序标题 vendor:供应商
title/vendor 元素必须,会显示在用"javaws -viewer"命令
打开的应用程序缓存查看器(Java Application Cache Viewer)中-->
<title>JWSTest</title>
<vendor>Lively Corporation</vendor>
<description>JWSTestTest Example for WebStart.</description>
<!--homepage :存放有关应用程序的相关文档的URL,如help文件等,仅仅是description作用-->
<homepage href="http://127.0.0.1:8080/webstart/index.html"/>
<!--icon 指定图标会显示在应用程序缓存查看器中,
在查看器中新建webstart快捷方式到桌面时也会显示为快捷方式图标,
只支持GIF/JPEG格式,其它格式无效-->
<icon href="./images/logo.jpg"/>
<!--splash 在sun的文档中提到会出现在webstart启动时的闪屏中,不过可能由于速度问题,我没有观察到-->
<icon kind="splash" href="./images/logo.jpg"/>
<!-- 允许离线启动,可以使用javaws -offline命令-->
<offline-allowed/>
</information>
<resources>
<!-- 指定客户端需要安装的j2se版本,下面指定为1.5+,
如果版本是1.4,在链接此jnlp文件时会提示更新j2se版本-->
<j2se version="1.5+"/>
<!-- 指定要下载到本地的jar文件(注意,所有的文件都需要打包才能够下载),
可以包含一些资源文件,如icons/configuration files,可以使用getResource方法取得-->
<jar href="./jar/jws/jwst.jar"/>
</resources>
<!--application-desc 必须,指定webstart启动时执行jar文件中的哪个类-->
<application-desc main-class="jws.JWS"/>
</jnlp>
注:
其中*.jnlp文件的语法的详细信息可以在sun网站上查询http://java.sun.com/j2se/1.5.0/docs/guide/javaws/developersguide/syntax.html
其中javaws命令行的详细参数可以在sun网站上查询http://java.sun.com/j2se/1.5.0/docs/guide/javaws/developersguide/javaws.html#options
分JNLP的关键语法
<jnlp>元素
spec:必须是1.0及以上版本,这里用1.0+,不需修改。
codebase:资源的URL,是JNLP指向各连接的起始处,需自行修改。
Href:JNLP文件相对codebase的存放位置,和JNLP文件的全名,需自行修改。
<infomation>元素
Title:发布的应用程序简单标题,需自行修改。
Vendor:发行商信息,可以写上你的大名,需自行修改。
Homepage:存放有关应用程序的相关文档的URL,如help文件等,可有可无。
Description:对应用程序的描述,可以有多对<description></description>,可有可无。
Icon:用户下载你的应用程序后,在JWS里显示的图标的URL,应是gif或jpeg格式。需自行修改。
Offline-allowed:选择项,允许用户离线运行应用程序,一般都会有,不用修改。
<security>元素
选择项,如果没有指明<security>,默认是不允许应用程序访问用户的本地资源,即应用程序是沙箱运行。
如果设定为<all-permissions/>,则表示允许应用程序访问用户的本地资源。一般都会设定此值。
<resource>元素
<j2se version = 指定jdk版本>
<jar href = 指定需发布的应用程序的jar包存放的位置>
<application-desc>元素
main-class:应用程序运行启动的主类
<argument>:应用程序运行时的参数,可以有多个,每一个参数用一对<argument>参数</argument>。
======================================================================
5 .webstart目录下建一index.jsp
内容如下
<%@page contentType="text/html;charset=gb2312"%>
<html>
<title> JWS Test </title>
<head>
<SCRIPT LANGUAGE="Javascript">
var javawsInstalled = 0;
isIE = "false";
if (navigator.mimeTypes && navigator.mimeTypes.length) {
x = navigator.mimeTypes['application/x-java-jnlp-file'];
if (x) javawsInstalled = 1;
} else {
isIE = "true";
}
function insertLink(url, name) {
if (javawsInstalled) {
document.write("<a href=" + url + ">" + name + "</a><br><br>");
} else {
document.write("<a href=" + url + ">"+ name +"</a><br><br>");
}
}
</SCRIPT>
<SCRIPT LANGUAGE="VBScript">
on error resume next
If isIE = "true" Then
If Not(IsObject(CreateObject("JavaWebStart.IsInstalled"))) Then
javawsInstalled = 0
Else
javawsInstalled = 1
End If
End If
</SCRIPT>
<SCRIPT LANGUAGE="Javascript">
if(javawsInstalled){
insertLink("http://你的IP:8080/ JWSTest /jnlp/jwstst.jnlp"," JWSTest ");
}else{
//通知用户要先安装JWS的客户端,你可以自己提供下载或是直接链接到Sun的JWS下载。
//分为两种,如果客户端已经安装了Java运行环境,则只要下载javaws-1_0_1_01-win-int.exe即可。
//如果客户端没有安装Java运行环境,则要下载完整的javaws-1_0_1_01-win-int-rt.exe。
}
</SCRIPT>
</head>
<body>
</body>
</html>
6 .因为是web应用,所以webstart/WEB-INF建一web.xml文件,
内容为:
<web-app>
</web-app>
即可,启动tomcat时默认会去找index.html文件
7 .webstart工程放入tomcat/webapps,启动tomcat即可。
启动后会看到jws的swing弹出窗口,还有一个java控制台(如果没有出现,可在"控制面板"——"java控制面板"——"高级"——"Java控制台"中勾选"显示控制台"单选框).
=================================================================
通过上面的讲述,你一定能体会到JWS的易用性。或许事情并没有那么简单,以我的使用经验,还会有许多问题出现,在这里挑几个经常出现的问题,给出相应解决方法,让大家少走弯路,而享受更多的乐趣。
问题一:JWS不能运行,JNLP文件像普通XML文件一样显示在Browser里
解决办法:请修改tomcat里,发布程序的路径中的web.xml。
在其中添加<mime-type>
application/x-java-jnlp-file
</mime-type>
以支持JNLP文件。
问题二:不能下载资源或下载资源失败
解决办法:请卸载JWS的客户端,并将注册表里有关JWS的项目都删除,并确保program Files下的Java Web Start目录已被删除,然后,重装JWS。
问题三:下载资源中有未签名文件
解决办法:1:确保所有的jar包及其他资源都进行过签名。
2:确保整个资源中,没有中文的命名。好像签名工具不支持中文命名的文件名,所以未签到名。这可让我郁闷了一下午哦。
3:察看已经签名的jar包中,meta-inf路径下的MYKEY.sf(jwstest是你在进行签名时-alias后的命名)文件,他详细的列出了所有已签名的文件,以分析签名失败的原因。