下面是用最简单的HelloWorld方法实现一个Java Web Start的例子工程webstart目录结构如下
目录说明如下
images 存放*jnlp文件中定义的图标文件
jar 存放classes打包后的jar文件
jnlp 存放*jnlp描述文件
src java源码
WEBINF/classes java编译后的class文件
webatart 建立步骤如下
.在webstart/src/jws下新建一HelloWorldjava文件
package jws;
import javaxswing*;
public class HelloWorld {
private JFrame jFrame;
private JPanel jPanel;
private JLabel label;
public HelloWorld(){
jFrame = new JFrame(HelloWorld Test Frame);
label = new JLabel(Hello world!);
jPanel = new JPanel();
jPaneladd(label);
jFrameadd(jPanel);
jFramepack();
jFramesetSize( );
jFramesetLocation( );
jFramesetVisible(true);
jFramesetDefaultCloseOperation(JFrameEXIT_ON_CLOSE);
}
// webstart 启动时执行的主方法
public static void main(String args[]){
new HelloWorld();
}
}
注 在main方法中完全可以不用写new HelloWorld();而只在main方法中输出一条测试语句
Systemoutprintln(This is test!);
进行简单测试打印结果会出现在步骤java控制台中
.编译HelloWorldjava在WEBINF/classes目录下执行命令
jar cvf helloworldjar jws/*class
执行后把生成的helloworldjar包拷贝到webstart/jar/jws目录下
(在IDEA中打包使用Jar Tool插件比较方便eclipse中可以使用Fatjar)
.从helloworldjar/METAINF中解压出MNIFESTMF更改MNIFESTMF内容
ManifestVersion:
CreatedBy: _ (Sun Microsystems Inc)
为
ManifestVersion:
CreatedBy: _ (Sun Microsystems Inc)
MainClass: jwsHelloWorld
然后在WEBINF/classes目录下执行命令
jar umf MANIFESTMF helloworldjar
把新的MNIFESTMF更新到helloworldjar包中
注 如果在下面步骤中的<applicationdesc mainclass=jwsHelloWorld/>指定了MainClass方法此步骤可以省略
.webstart/jnlp目录下新建一HelloWorldjnlp文件
<?xml version= encoding=UTF?>
<!codebase 属性指出搜索应用程序资源的顶级URL下面的icon/jar元素都是以这个URL为基本>
<jnlp codebase=>
<information>
<! 在开始运行菜单中输入javaws或javaws viewer启动Web Start会看到客户端已经安装的webstart应用程序>
<!title 应用程序标题 vendor供应商
title/vendor 元素必须会显示在用javaws viewer命令
打开的应用程序缓存查看器(Java Application Cache Viewer)中>
<title>HelloWorld</title>
<vendor>Lively Corporation</vendor>
<description>HelloWorld Test Example for WebStart</description>
<!homepage 存放有关应用程序的相关文档的URL如help文件等仅仅是description作用>
<homepage />
<!icon 指定图标会显示在应用程序缓存查看器中
在查看器中新建webstart快捷方式到桌面时也会显示为快捷方式图标
只支持GIF/JPEG格式其它格式无效>
<icon />
<!splash 在sun的文档中提到会出现在webstart启动时的闪屏中不过可能由于速度问题我没有观察到>
<icon kind=splash />
<! 允许离线启动可以使用javaws offline命令>
<offlineallowed/>
</information>
<resources>
<! 指定客户端需要安装的jse版本下面指定为+
如果版本是在链接此jnlp文件时会提示更新jse版本>
<jse version=+/>
<! 指定要下载到本地的jar文件(注意所有的文件都需要打包才能够下载)
可以包含一些资源文件如icons/configuration files可以使用getResource方法取得>
<jar />
</resources>
<!applicationdesc 必须指定webstart启动时执行jar文件中的哪个类>
<applicationdesc mainclass=jwsHelloWorld/>
</jnlp>
注
其中*jnlp文件的语法的详细信息可以在sun网站上查询
其中javaws命令行的详细参数可以在sun网站上查询
.webstart目录下建一l
内容如下
<a >HelloWorld</a>
.因为是web应用所以webstart/WEBINF建一webxml文件
内容为
<webapp>
</webapp>
即可启动tomcat时默认会去找l文件
.webstart工程放入tomcat/webapps启动tomcat即可
启动后会看到helloworld的swing弹出窗口还有如下图会有一个java控制台
如果要在HelloWorldjava中对本地文件进行操作就必须对jar文件进行签名具体步骤如下:
在HelloWorldjava的main方法中对文件进行操作
File file = new File(E: + /testtxt);
try {
Systemoutprintln(filecreateNewFile());
} catch (IOException e) {
eprintStackTrace();
}
.用keytool genkey产生一个私钥(使用keytool –help命令可查看keytool命令参数)
keytool genkey alias mykey keystore mykeystore keypass mypass storepass mykeystorepass validity
参数说明如下
alias mykey 指定密钥的别名不指定的话默认为 mykey
keystore mykeystore 指定密钥数据库名不指定则默认在Documents and Settings\Administrator下生成一个名称为 keystore的文件
keypass mypass 指定密钥密码用jarsigner签名时需要
storepass mykeystorepass 指定密钥数据库密码用jarsigner签名时需要
validity 密钥有效时间为天不指定的话默认为天
.在WEBINF/classes目录下运行keytool命令会提示输入一些姓名/公司/国家之类的信息
如果不想一步步输入上面信息可以直接输入下面命令执行
keytool genkey alias mykey keystore mykeystore keypass mypass storepass mykeystorepass validity dname cn=Henry Zhou ou=JavaSoft l=SZ S=JS o=Lively c=CN
dname 参数说明如下
CN=commonName
OU=organizationUnit
O=organizationName
L=localityName
S=stateName
C =country
.执行完毕在WEBINF/classes目录下生成一个名mykeystore的密钥文件下面要用此密钥文件对jar文件进行加密
jarsigner keystore mykeystore helloworldjar mykey
helloworldjar mykey 指定要签名的jar文件和密钥的别名
运行命令后会提示输入密钥密码和密钥数据库密码
签名者证书将在六个月内过期
由于安全原因在上面的命令中无法指定密钥密码和密钥数据库密码即使运行
jarsigner keystore mykeystore helloworldjar mykey keypass mypass storepass mykeystorepass
仍然会提示输入密钥密码和密钥数据库密码
注
其中keytool的详细参数说明可以在sun网站上查询
其中jarsigner命令行的详细参数可以在sun网站上查询
执行后在helloworldjar/METAINF中可以看到生成MYKEYDSA和MYKEYSF文件(可以通过sigFile MKSIGN指定生成 MKSIGNSF和MKSIGNDSA)
其中SF文件包含了JAR中所有类的一个列表保存了签名过程中使用的摘要算法DSA文件是一个二进制密匙文件扩展名是DSA还是RSA取决你使用的签名算法默认是DSA可以在keytool参数中指定RSA算法
.把生成的helloworldjar包拷贝到webstart/jar/jws目录下
.在webstart/jnlp/HelloWorldjnlp中添加
<security>
<allpermissions/>
</security>
增加了签名后如果缺少<security><allpermissions/></security>会报错
启动/运行应用程序时发生错误
标题JNLP Argument Solution
供应商Lively
类别安全错误
access denied (javaioFilePermission E:\testtxt write)
webstart 工程放入tomcat/webapps启动tomcat即可链接jnlp后发现E盘新建一testtxt文件测试成功
注 网上介绍有时候需要在webstart/WEBINF/webxml文件中配置
<mimemapping>
<extension>jnlp</extension>
<mimetype>application/xjavajnlpfile</mimetype>
</mimemapping>
在tomcat中测试发现不需要在webxml中添加此代码